我正在创建一个图表,在图表上显示网络延迟和连接失败率。我使用DefaultCategoryDataset
来存储数据,但问题是,此数据集使用String
作为X轴值:
DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
dataset.addValue( 15 , "Line name" , "X value" );
由于我基于Unix时间以毫秒为单位呈现数据包,因此最终看起来像这样:
我想解决它:
为了生成数据集,我运行样本数组,最后得到两个代表平均延迟和失败率的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());
}
答案 0 :(得分:2)
对于这种类型的图表,我认为您应该使用XYDataset
TimeSeries
和DateAxis
。这里有一个例子:
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);