创建JFreeChart,两个轴以数字方式键入

时间:2015-05-26 19:21:11

标签: java jfreechart

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

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

由于我基于Unix时间以毫秒为单位呈现数据包,因此最终看起来像这样:

image description

我想解决它:

  1. 新值(更大的时间戳)显示在右侧,而不是左侧
  2. X标签彼此太靠近会被智能地合并,如下图所示: image description
  3. 为了生成数据集,我运行样本数组,最后得到两个代表平均延迟和失败率的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());
    }
    

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

如果您的数据不需要使用类别,则可以使用XYDataset,并使用ChartFactory.createXYLineChart创建XY图。

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类来渲染时间)。对于问题(1),使用这种类型的轴你可以反转它:

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