JFreeChart带有双X轴

4
我想问一下是否可能拥有一个带有双x轴的时间序列图表(或y轴,但因为它是时间序列数据集,所以我专注于双x轴)。我有两个数据文件,其中测量是在一分钟或整天内进行的。因此,我不能有一个x轴。因此,一种解决方案是将一个数据文件转换为另一个数据文件的格式,或者拥有两个不同的x轴。第二个解决方案是否可行?
我发现JFreeChartDualAxisDemo
但这不是我想要的。
非常感谢任何帮助!
编辑:
我有以下代码,并尝试创建具有属于特定x轴的两个数据集的时间序列图表(正如您可以看到我创建了两个x轴)。我尝试执行此代码,但创建的图表不正确,实际上它只有x轴和y轴。有人可以告诉我哪里有错误吗?
int year1 = 2004;
int year2 = 2005;
int year3 = 2006;
int year4 = 2007;

int month1 = 1;
int month2 = 5;
int month3 = 8;
int month4 = 12;

int day1 = 3;
int day2 = 10;
int day3 = 15;
int day4 = 30;


TimeSeries ts= new TimeSeries("Metrisi", Day.class);
ts.add(new Day(day1, month1, year1), 100);
ts.add(new Day(day2, month2, year2), 150);
ts.add(new Day(day3, month3, year3), 250);
ts.add(new Day(day4, month4, year4), 275);

TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(ts);


int year1_2 = 2004;
int year2_2 = 2005;
int year3_2 = 2006;
int year4_2 = 2007;

int month1_2 = 2;
int month2_2 = 7;
int month3_2 = 9;
int month4_2 = 11;

int day1_2 = 23;
int day2_2 = 14;
int day3_2 = 19;
int day4_2 = 22;


TimeSeries ts2= new TimeSeries("Metrisi", Day.class);
ts.add(new Day(day1_2, month1_2, year1_2), 100);
ts.add(new Day(day2_2, month2_2, year2_2), 150);
ts.add(new Day(day3_2, month3_2, year3_2), 250);
ts.add(new Day(day4_2, month4_2, year4_2), 275);

TimeSeriesCollection dataset2 = new TimeSeriesCollection();
dataset.addSeries(ts2);


JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Measurement",
"Date",
"Measurement",
dataset,
true,
true,
false);

final XYPlot plot = chart.getXYPlot();

plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(false);




final DateAxis axis2 = new DateAxis("Secondary");
//xAxis2.setAutoRangeIncludesZero(false);
//plot.setDomainAxis(1, axis );
plot.setRangeAxis(1, axis2);
plot.setDataset(1, dataset2);
plot.mapDatasetToRangeAxis(1, 1);

 final XYItemRenderer renderer = plot.getRenderer();
 renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
if (renderer instanceof StandardXYItemRenderer) {
    final StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
    //rr.setPlotShapes(true);

    rr.setShapesFilled(true);
    //renderer.setSeriesStroke(0, new BasicStroke(2.0f));
    //renderer.setSeriesStroke(1, new BasicStroke(2.0f));
   }

final StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
renderer2.setSeriesPaint(0, Color.black);
//renderer2.setPlotShapes(true);
renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
plot.setRenderer(1, renderer2);

final DateAxis axis = (DateAxis) plot.getDomainAxis();

我想要做的是,如您所见,我有两个x轴,但只有一个数据集,这就是问题所在。我已经使用以下代码完成了图像中显示的示例:

    final XYPlot plot = chart.getXYPlot();

    plot.setBackgroundPaint(Color.lightGray);
    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);
    plot.setDomainCrosshairVisible(true);
    plot.setRangeCrosshairVisible(false);


    final XYItemRenderer renderer = plot.getRenderer();
    if (renderer instanceof StandardXYItemRenderer) {
        final StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
        //rr.setPlotShapes(true);
        rr.setShapesFilled(true);
        renderer.setSeriesStroke(0, new BasicStroke(2.0f));
        renderer.setSeriesStroke(1, new BasicStroke(2.0f));
       }

    final DateAxis axis = (DateAxis) plot.getDomainAxis();

    final DateAxis xAxis2 = (DateAxis) plot.getDomainAxis();
    plot.setDomainAxis(1, xAxis2 );
    plot.mapDatasetToDomainAxis(1, 1);

Example of the output that I want


请编辑您的问题,包括一个展示出您所描述问题的 sscce。这个重复的问题 _不完整_。 - trashgod
谢谢您的评论。现在可以了吗?还需要我做更多的修改吗? - kostas papadopoulos
2个回答

5

是的,你可以添加第二个 X(域)轴。要将第二个域轴添加到您链接的演示中,请添加以下代码:

final NumberAxis xAxis2 = new NumberAxis("Secondary X Axis");
plot.setDomainAxis(1, xAxis2 );
plot.mapDatasetToDomainAxis(1, 1);

在获得图表 (plot) 的引用后,将其传递给构造函数:

这样可以同时显示两个数据集:

enter image description here


1
@kostaspapadopoulos 这就是 mapDatasetToDomainAxis 的目的。 - GrahamA
谢谢你的帮助,但你能具体说明我应该把代码放在哪里吗?因为我把它放在这里 => final DateAxis axis2 = new DateAxis("Secondary"); //xAxis2.setAutoRangeIncludesZero(false); //plot.setDomainAxis(1, axis ); plot.setRangeAxis(1, axis2); plot.setDataset(1, dataset2); plot.mapDatasetToRangeAxis(1, 1); 但它没有起作用。 - kostas papadopoulos
2
@kostaspapadopoulos,你的代码中有多个错误,其中最重要的是你将axis2添加为Range而不是Domain轴。你正在从一个一般性问题(我已经回答了)转向请调试我的代码。 - GrahamA
@kostaspapadopoulos 我觉得 Renderer 不是你的问题。 - GrahamA
我有一个例子,链接如下 => http://www.java2s.com/Code/Java/Chart/JFreeChartDualAxisDemo2.htm。我创建的方法如下:final DateAxis axis2 = new DateAxis("Secondary"); plot.setDomainAxis(1, axis2 ); plot.setDataset(1, dataset2); plot.mapDatasetToDomainAxis(1, 1); 然后我创建了一个XYItemRenderer和一个StandardXYItemRenderer。当我执行项目时,我看到了双域轴,但是像上面的图片一样,我看不到数据集。我错过了什么吗? - kostas papadopoulos
显示剩余3条评论

0
使用我之前发布的代码,我得到的结果大致如下

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接