创建两个轴都以数字键控的 JFreeChart

Create JFreeChart with both axes keyed numerically

我正在制作一个图表,在图表上显示网络延迟和连接失败率。我正在使用 DefaultCategoryDataset 来存储数据,但问题是,该数据集使用 String 作为 X 轴值:

  DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
  dataset.addValue( 15 , "Line name" , "X value" );

由于我根据以毫秒为单位的 Unix 时间渲染数据包,因此它最终看起来像这样:

我想修复它以便:

  1. 新值(较大的时间戳)出现在右边,而不是左边
  2. X 个彼此靠得太近的标签被智能合并,如下图所示:

为了生成数据集,我 运行 遍历样本数组,最后得到两个 HashMap<String, Double> 代表平均延迟和故障率。然后分配如下:

//Latency line
for (Map.Entry<String, Double> entry : time.entrySet())
{
  dataset.addValue(entry.getValue(), "Average ping [ms]", entry.getKey());
}
//Fail rate line
for (Map.Entry<String, Double> entry : fail_rate.entrySet())
{
  dataset.addValue(entry.getValue()*100, "Fail rate [%]", entry.getKey());
}

对于这种类型的图表,我认为您应该使用 XYDataset 以及 TimeSeriesDateAxis。此处演示了一个示例: http://www.jfree.org/jfreechart/api/javadoc/src-html/org/jfree/chart/demo/TimeSeriesChartDemo1.html

您还可以为 DateAxis 使用自定义 Timeline 实现,特别是控制日期的方向(较新的日期向右)。 更多信息在这里:http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/axis/Timeline.html

如果您的数据不需要使用类别,您可以使用 XYDataset, and create an XY plot eg using ChartFactory.createXYLineChart

DefaultXYDataset ds = new DefaultXYDataset();
//generate random data as an example
double[][] data = new double[2][1000];
for ( int i = 0; i < 1000; i++ ){
    data[0][i] = i;
    data[1][i] = (Math.random() * 100);
}
ds.addSeries("Time", data);
JFreeChart chart = ChartFactory.createXYLineChart("Test", "Time", "Y-Axis", ds, PlotOrientation.VERTICAL, false,false,false); 

以这种方式,问题 (2) 应该会自行解决(您可以使用 DateAxis class 来渲染时间)。对于问题(1),使用这种类型的轴你可以将它反转:

myChart.getXYPlot().getRangeAxis().setInverted(true);