我正在尝试显示数据中列表长度的直方图。我决定使用JFreeCharts对其进行可视化,但是我将数据放入工具中,并且创建的直方图与该数据不对应。
首先,我尝试将相应的标签设置为x轴。不幸的是,我只能设置正确的开始(1)和结束(dataAray.length)。但是即使如此,我仍然认为这不是正确的方法。我希望JFreeChart可以自己管理它。
private JFreeChart getHistogramChart(String name, double[] dataArray) {
String plotTitle = name;
String xAxisLabel = "Length of transaction";
String yAxis = "Frequency";
PlotOrientation orientation = PlotOrientation.VERTICAL;
HistogramDataset histogramDataset = new HistogramDataset();
histogramDataset.setType(HistogramType.FREQUENCY);
histogramDataset.addSeries(name, dataArray, dataArray.length,1,dataArray.length);
boolean show = true;
boolean toolTips = false;
boolean urls = false;
JFreeChart chart = ChartFactory.createHistogram(plotTitle, xAxisLabel, yAxis,
histogramDataset, orientation, show, toolTips, urls);
chart.setBackgroundPaint(Color.white);
XYPlot plot = chart.getXYPlot();
plot.setForegroundAlpha(0.75f);
NumberAxis axis = (NumberAxis) plot.getDomainAxis();
axis.setAutoRangeIncludesZero(false);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setNumberFormatOverride(NumberFormat.getIntegerInstance());
return chart;
}
我有两种变体形式的数据:
作为列表- {2 = 696,3 = 229,4 = 123,5 = 74,6 = 42,7 = 29,8 = 8,9 = 9,10 = 9,11 = 2,12 = 3,13 = 2,15 = 1、16 = 5、17 = 1、19 = 1、22 = 1、23 = 1、24 = 2、27 = 1、28 = 1、29 = 1、39 = 2、48 = 1、56 = 2 ,57 = 1、63 = 1、93 = 1、95 = 1、99 = 1、146 = 1、435 = 1}
作为一个对应的双矩阵- [0.0、696.0、229.0、123.0、74.0、42.0、29.0、8.0、9.0、9.0、2.0、3.0、2.0、0.0、1.0、5.0、1.0、0.0、1.0、0.0、0.0、1.0、1.0、2.0、0.0 ,0.0、1.0、1.0、1.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、2.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、1.0、0.0、0.0 ,0.0、0.0、0.0、0.0、0.0、2.0、1.0、0.0、0.0、0.0、0.0、0.0、1.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、1.0、0.0、1.0、0.0、0.0、0.0、1.0、0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、1.0、0.0、0.0、0.0、0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0 ,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0,0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0, 0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、0.0、1.0]
结果是,由于第二个bin中的值,y轴以425结尾而不是我期望的700结束。
答案 0 :(得分:2)
最近有人问过同样的问题python and matplotlib。它不是重复的,因为语言和库完全不同。但是...的原因,例如,“意外行为”是相同的:人们似乎并不知道直方图实际上是什么 ... >
因此,请在此处重新声明:直观上,直方图是条形图。不多。不低于。
该条形图中显示的数据使其与众不同。即,落在某些箱中的元素的频率。 (根据您的情况,这些bin通常是值的范围或单个(离散)值)。尽管JFreeChart提供了专用的方法来创建直方图,但是这些方法专用于您具有“原始”数据并且仍需要计算合并的情况。您的情况下,分箱已经完成。您已经 的数据是频率(因此是条形高度)。
因此,您所拥有的数据可以简单地显示为条形图。
但是您应该考虑为此找到不同的视觉表示。与链接的python示例类似:bin / bars的数量稍微超出了仍可以合理表示的条形数量:即使是2500像素宽,并且使用非常小字体,标签也不可读还有。而且考虑到有435个值,即使没有标签,在标准台式机显示器上,条形图也只能宽几个像素。
给定数组中的大多数值无论如何都是0-准确地说是403个值。这就是图表中显示的内容:索引0处的条的高度为403,因为这是数据中值0的频率。如果您的用例允许这样做,则可以考虑忽略这些值。
但是,这里有一个示例,显示结果(作为适当的条形图)可能是什么样的:
使用此示例创建:
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
public class FreeChartHistogram
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(() -> createAndShowGui());
}
private static void createAndShowGui()
{
JFrame frame = new JFrame();
double dataArray[] =
{ 0.0, 696.0, 229.0, 123.0, 74.0, 42.0, 29.0, 8.0, 9.0, 9.0, 2.0, 3.0,
2.0, 0.0, 1.0, 5.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 2.0, 0.0,
0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0 };
JFreeChart chart = getHistogramChart("Test", dataArray);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setMaximumDrawHeight(3000);
chartPanel.setMaximumDrawWidth(3000);
frame.add(chartPanel);
frame.setSize(2500, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static JFreeChart getHistogramChart(String name, double[] dataArray)
{
String plotTitle = name;
String xAxisLabel = "Length of transaction";
String yAxis = "Frequency";
PlotOrientation orientation = PlotOrientation.VERTICAL;
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
for (int i = 0; i < dataArray.length; i++)
{
dataSet.addValue(dataArray[i], (Integer) 0, (Integer) i);
}
boolean show = true;
boolean toolTips = false;
boolean urls = false;
JFreeChart chart = ChartFactory.createBarChart(plotTitle, xAxisLabel,
yAxis, dataSet, orientation, show, toolTips, urls);
chart.setBackgroundPaint(Color.WHITE);
// Set a very small font for the labels, and rotate them...
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setTickLabelFont(new Font("Dialog", Font.PLAIN, 8));
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
return chart;
}
}
(一个旁注:当您在问题中加入MCVE时,很有可能会得到有用的答案。想象一下每天尝试回答5个Swing问题。您会很快就会厌烦总是不得不将问题中的组件代码嵌入到JFrame
中并修复仅由问问者不愿让回答变得更容易而引起的随机编译问题……)