週単位の軸が必要なグラフを作成したときに、この問題に遭遇しました。
DateAxis
withのティック単位を設定するとnew DateTickUnit(DateTickUnitType.Day, 7)
、7日ごとにティックマークが表示されます。ただし、目盛りの日付は週の最初の日から始まりません。スクリーンショットでこの動作を確認できます。
シアン色の線05-01 w18(May. 1, Week 18)
が目盛りの下にありますw18(Week 18)
。これは、目盛りの日付w18
が実際には 5 月 2 日の水曜日であるためです。
このメイク チャートは正しくないように見えます。これは、各ティックが週の始まりであると人々が考える傾向があるためです。
ソースコードを確認したところDateAxis
、週のそのような動作をサポートしていないことがわかりました(とにかく週のタイプはありません)。
DateTickUnitType
プライベートコンストラクターとcorrectTickDateForPosition()
メソッドインDateAxis
もプライベートであるため、別のものを作成できません。をオーバーライドしようとしましたnextStandardDate()
が、満足のいく結果が得られませんでした。
DateAxis
週の最初の日から目盛りを常に描画するにはどうすればよいですか?
これがスクリーンショットとサンプルコードです
JFreeChart/JCommon 必須
public class Main extends ApplicationFrame {
public Main (String title) throws ParseException {
super(title);
JPanel chartPanel = createDemoPanel();
chartPanel.setPreferredSize(new java.awt.Dimension(800, 600));
setContentPane(chartPanel);
}
private static JFreeChart createChart(XYDataset dataset) {
JFreeChart chart = ChartFactory.createXYLineChart("Week period in DateAxis", "X", "Y",
dataset, PlotOrientation.VERTICAL, true, true, false);
DateAxis x = new DateAxis("X");
x.setTickUnit(new DateTickUnit(DateTickUnitType.MONTH, 1, new SimpleDateFormat("MMM.")));
DateAxis y = new DateAxis("Y");
y.setTickUnit(new DateTickUnit(DateTickUnitType.DAY, 7, new SimpleDateFormat("MM-dd 'W'w.")));
XYPlot plot = chart.getXYPlot();
plot.setDomainAxis(x);
plot.setRangeAxis(y);
plot.setDomainGridlinesVisible(true);
plot.setRangeGridlinesVisible(true);
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
renderer.setBaseShapesVisible(true);
renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator("{2}",
new SimpleDateFormat("MMM."), new SimpleDateFormat("MM-dd 'w'w")));
renderer.setBaseItemLabelsVisible(true);
return chart;
}
private static XYDataset createDataset() throws ParseException {
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
String[] allDate = new String[]{
"2012/03/27", "2012/04/03", "2012/04/10",
"2012/04/17", "2012/04/24", "2012/05/01"};
String dateY1 = "2012/01/15";
String dateY2 = "2012/02/15";
String dateY3 = "2012/03/15";
String dateY4 = "2012/04/15";
String dateY5 = "2012/05/15";
String dateY6 = "2012/06/15";
XYSeriesCollection dataset = new XYSeriesCollection();
for (String date : allDate) {
XYSeries series = new XYSeries(date);
series.add(df.parse(dateY1).getTime(), df.parse(date).getTime());
series.add(df.parse(dateY2).getTime(), df.parse(date).getTime());
series.add(df.parse(dateY3).getTime(), df.parse(date).getTime());
series.add(df.parse(dateY4).getTime(), df.parse(date).getTime());
series.add(df.parse(dateY5).getTime(), df.parse(date).getTime());
series.add(df.parse(dateY6).getTime(), df.parse(date).getTime());
dataset.addSeries(series);
}
return dataset;
}
public static JPanel createDemoPanel() throws ParseException {
JFreeChart chart = createChart(createDataset());
return new ChartPanel(chart);
}
public static void main(String[] args) throws ParseException {
Main demo = new Main("Test");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);
}
}