- PR -

J Free Chart の軸表示に関して

1
投稿者投稿内容
コークス
会議室デビュー日: 2007/07/06
投稿数: 3
投稿日時: 2007-07-06 17:35
初めて投稿させていただきます。

早速ですが、質問です。
現在、下に記述したコードを用いて、折れ線グラフを作成しています。
内容としては、あるもののデータを1週間単位で表示させるものを想定して
います。日付の部分には文字列型を用いていますが、実際には数値型(int型)で
表示させ、月末日を過ぎると翌月の1日になるようにしたいと思っています。
将来的には、1日を24時間に分割した上で、X軸には1日ごとの日付のみ表示できる
ようにまで広げたいです。

そこで、2つ質問なんですが、

(1)int型にデータを持たせた状態で、月が替わったときに1日に戻すようなことは
実現できないでしょうか?

(2)土曜日の日付は青、日曜日の日付は赤、といった風に、X軸の任意の数値(文字
でも可)を、好きな色に変えられないでしょうか?

ご存知の方いらっしゃれば、回答いただきたく思います。


---------------------------------------------------------------------

import java.io.IOException;

//サーブレット(Tomcat)関連のインポート
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//JFreeChart関連のインポート
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.TickUnit;
import org.jfree.chart.axis.TickUnits;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;

public class Sample extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException{
//データセットの作成
String series1 = "第1系列";

DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(20.0, series1, "29");
dataset.addValue(13.5, series1, "30");
dataset.addValue(14.0, series1, "31");
dataset.addValue(8.0, series1, "1");
dataset.addValue(10.0, series1, "2");
dataset.addValue(9.0, series1, "3");
dataset.addValue(15.0, series1, "4");

//折れ線グラフの作成
JFreeChart chart = ChartFactory.createLineChart(
"サンプル", //グラフのタイトル
"", //X軸のタイトル
"", //Y軸のタイトル
dataset, //各系列のデータ
PlotOrientation.VERTICAL, //縦書き(X軸を横、Y軸を縦に設定)
true, //判例を描画
false, //Tool Tips の表示
false //URLの生成
);

//縦軸の上限を設定するための処理
CategoryPlot plot = chart.getCategoryPlot();
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); //最大値の取得
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); //整数値のみで表示する
rangeAxis.setAutoRange(false); //上限の自動設定を解除
rangeAxis.setRange(0, 26); //(下限,上限)

//Y軸の線引きの基準値の設定
TickUnits tickUnits = new TickUnits();
TickUnit unit = new NumberTickUnit(5); //Y軸上の線を引く間隔
tickUnits.add(unit);
rangeAxis.setStandardTickUnits(tickUnits);

//グラフの出力
response.setContentType("image/jpeg");
ServletOutputStream image = response.getOutputStream();
ChartUtilities.writeChartAsJPEG(image,chart,600,400);

}

}


[ メッセージ編集済み 編集者: コークス 編集日時 2007-07-06 17:36 ]

[ メッセージ編集済み 編集者: コークス 編集日時 2007-07-06 17:37 ]

[ メッセージ編集済み 編集者: コークス 編集日時 2007-07-06 17:38 ]
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-06 21:33
1.はCalendar型を通せば簡単にできるでしょう。
2.はAPIに設定できるオブジェクトが乗っていると思います。
それで変更できるか確認してみましょう。
コークス
会議室デビュー日: 2007/07/06
投稿数: 3
投稿日時: 2007-07-09 16:15
早々にお返事をいただいていたにもかかわらず、返答が遅くなり申し訳ありません。

>杏さん

>1.はCalendar型を通せば簡単にできるでしょう。
Calendar型とは、「import java.util.Calendar」のことでしょうか?

>2.はAPIに設定できるオブジェクトが乗っていると思います。
文献を探して読んでみたのですが、どこが該当する部分なのか検討がつかず、困っています。

不躾なのは承知でのお願いなのですが、サンプルになりそうなWebページや、ヒントめいたサンプルみたいなのをご教授いただけないでしょうか。
どちらも自分で試行錯誤していますが、どうにも手詰まりでうまくいきません。

以上、重ねてよろしくお願いいたします。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-07-09 23:06
1側のsample
コード:
package sample;

import static java.util.Calendar.*;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class CalendarTest {
    private static final int START_MON  = 0;
    private static final int START_DATE = 1;

    
    private static final int END_MON  = 10;

    public static void main (String[] args) {
        
        Calendar cal = new GregorianCalendar();
        
        // 月を設定
        cal.set(MONTH, START_MON);
        
        // 日付を設定
        cal.set(DATE,  START_DATE);
        
        
        for (;cal.get(MONTH) <= END_MON; cal.add(DATE, 1)) {
            
            if (cal.get(DATE) == START_DATE && cal.get(MONTH) != START_DATE) {
                // つきが変われば次の行
                System.out.println();
            }
            // 月は1すくないので 1を足して表示
            System.out.printf("%02d-%02d ", cal.get(MONTH) + 1, cal.get(DATE));
        }
    }

}



http://www.gst-gr.com/tools/jfreechart/api/v1.0.1/javadoc/org/jfree/data/category/DefaultCategoryDataset.html#addValue(double,%20java.lang.Comparable,%20java.lang.Comparable)
をみると

double と http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/Comparable.html が二つせっていされていますね。

とみるとここでは設定できないということがわかりますよね?

じゃあ JFreeCharはどうか よくみると drowというメソッドがありますね。

こうやって解決していくのです。



コークス
会議室デビュー日: 2007/07/06
投稿数: 3
投稿日時: 2007-07-11 16:15
結局のところ、自己解決しました。

1.に関しては、時系列グラフ(TimeSeriesChart)に対して、X軸の表示にはDateTickUnitを
用いることで、思ったとおりの結果を得ることができました。

2.については、引き続きAPIと格闘しながら、何とかやってみたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)