创建两个轴都以数字键控的 JFreeChart
Create JFreeChart with both axes keyed numerically
我正在制作一个图表,在图表上显示网络延迟和连接失败率。我正在使用 DefaultCategoryDataset
来存储数据,但问题是,该数据集使用 String
作为 X 轴值:
DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
dataset.addValue( 15 , "Line name" , "X value" );
由于我根据以毫秒为单位的 Unix 时间渲染数据包,因此它最终看起来像这样:
我想修复它以便:
- 新值(较大的时间戳)出现在右边,而不是左边
- 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
以及 TimeSeries
和 DateAxis
。此处演示了一个示例:
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);
我正在制作一个图表,在图表上显示网络延迟和连接失败率。我正在使用 DefaultCategoryDataset
来存储数据,但问题是,该数据集使用 String
作为 X 轴值:
DefaultCategoryDataset dataset = new DefaultCategoryDataset( );
dataset.addValue( 15 , "Line name" , "X value" );
由于我根据以毫秒为单位的 Unix 时间渲染数据包,因此它最终看起来像这样:
我想修复它以便:
- 新值(较大的时间戳)出现在右边,而不是左边
- 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
以及 TimeSeries
和 DateAxis
。此处演示了一个示例:
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);