JFreeChart 使用 一 直方图之柱状图-高级特性
本节内容主要讲述柱状图的一些高级特性。
1、简单定制之修改背景颜色
调用JFreeChart和CategoryPlot类方法可以进行一些简单的直方图表外观的修改。例如,改变图表和区域的背景颜色代码如下:
chart.setBackgroundPaint(Color.white); CategoryPlot plot = (CategoryPlot) chart.getPlot(); //设置图像区域背景色 plot.setBackgroundPaint(Color.lightGray); //水平轴网格线颜色 plot.setRangeGridlinePaint(Color.white);
运行效果:
区域Plot的引用(CategoryPlot)是必须的——转换类型也是非常安全的,因为我们知道该图表类型使用CategoryPlot。JFreeChart使用不同的区域类型(比如PiePlot、XYPlot)控制不同类型的图表。我们必须将plot的引用转化成图表响应的类型,因为基本类Plot仅仅定义了一些通用的属性和方法。随着对JFreeChart了解的加深,我们将学习每一种图表使用的不同的plot子类。
在我们的例子中,我们使用plot的引用来改变水平轴的网格线颜色。看一下CategoryPlot类的API文件,就会看到我们能够修改的地方。
2、定制外观
回顾之前章节内容,CategoryPlot管理这一个BarRenderer的实例renderer。如果我们想获得这个renderer的引用,大量的定制选择项会变得有效。
2.1、直方条形图颜色的定制
改变图表中每个系列直方图的颜色,使用如下代码:
BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setSeriesPaint(0, Color.gray); renderer.setSeriesPaint(1, Color.orange); renderer.setDrawBarOutline(false);
运行效果:
注意setSeriesPaint()方法是在抽象AbstractRenderer基类里面定义的——所以,我们可以在任何类型的renderer里面使用。
2.2、种类里直方条形图之间的空间
此外,renderer还可以控制每个种类中直方条形图之间的间距。因此我们可以在同一个种类中将空间完全去掉,代码如下:
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setItemMargin(0.0);
运行效果:
注意条形图看上去有点变宽——主要是因为JFreeChart分配空间时,分配给种类条形图之间的间距的尺度比较少,所以看上去就显得有点长宽了。
3 使用GradientPaint
实例对象为每一个系列修改renderer(渐变色)
代码如下:
public class BarChartGradientFrame extends ApplicationFrame { private static final long serialVersionUID = -4316075518094318809L; public BarChartGradientFrame(String title){ super(title); JPanel jpanel = createDemoPanel(); jpanel.setPreferredSize(new Dimension(500, 270)); setContentPane(jpanel); } private JPanel createDemoPanel() { JFreeChart jfreechart = createChart(createDataset()); return new ChartPanel(jfreechart); } private JFreeChart createChart(DefaultCategoryDataset categorydataset) { JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 1", "Category", "Value", categorydataset, PlotOrientation.VERTICAL, true, true, false); jfreechart.setBackgroundPaint(Color.WHITE); CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot(); categoryplot.setBackgroundPaint(Color.lightGray); categoryplot.setDomainGridlinePaint(Color.white); categoryplot.setDomainGridlinesVisible(true); categoryplot.setRangeGridlinePaint(Color.white); //刻度轴刻度设置 NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); //设置数据轴刻度梯进范围 numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); //renderer设置 BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer(); barrenderer.setDrawBarOutline(false);//设置外廓线不可见 //渐变色 GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue, 0.0F, 0.0F, new Color(0, 0, 64)); GradientPaint gradientpaint1 = new GradientPaint(0.0F, 0.0F, Color.green, 0.0F, 0.0F, new Color(0, 64, 0)); GradientPaint gradientpaint2 = new GradientPaint(0.0F, 0.0F, Color.red, 0.0F, 0.0F, new Color(64, 0, 0)); //设置系列柱体颜色 barrenderer.setSeriesPaint(0, gradientpaint); barrenderer.setSeriesPaint(1, gradientpaint1); barrenderer.setSeriesPaint(2, gradientpaint2); //设置种类标签旋转的角度,逆时针旋转 CategoryAxis categoryaxis = categoryplot.getDomainAxis(); categoryaxis.setCategoryLabelPositions(CategoryLabelPositions .createUpRotationLabelPositions(Math.PI / 6)); return jfreechart; } private DefaultCategoryDataset createDataset() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(100, "First", "Category1"); dataset.addValue(100, "Second", "Category1"); dataset.addValue(100, "Three", "Category1"); dataset.addValue(200, "First", "Category2"); dataset.addValue(200, "Second", "Category2"); dataset.addValue(200, "Three", "Category2"); dataset.addValue(300, "First", "Category3"); dataset.addValue(300, "Second", "Category3"); dataset.addValue(300, "Three", "Category3"); dataset.addValue(400, "First", "Category4"); dataset.addValue(400, "Second", "Category4"); dataset.addValue(400, "Three", "Category4"); return dataset; } public static void main(String[] args) { BarChartGradientFrame barchartdemo = new BarChartGradientFrame("Bar Chart Demo"); barchartdemo.pack(); RefineryUtilities.centerFrameOnScreen(barchartdemo); barchartdemo.setVisible(true); } }
显示效果如下:
程序代码说明:
lMain()方法执行直方条形图。编写方法与饼图一样。
lBarChartDemo1构造函数中创了一个JPanel,并设置大小。
lcreateDemoPanel()方法创建了一个JPanel,并且在该panel上创建了直方条形图。
lcreateDataset()方法创建了数据集。类型为CategoryDataset。注意数据集为三维数据。与饼图不同。
l使用ChartFactory.createBarChart()方法创建直方条形图
ljfreechart.setBackgroundPaint(Color.WHITE):设置图表的背景颜色。
lcategoryplot.setBackgroundPaint(Color.lightGray):设置直方条形图的背景颜色。
lsetDomainGridlinePaint(Color.whites):设置垂直格线的颜色。默认不可见。
lsetRangeGridlinePaint(Color.white):设置水平格线的颜色。默认可见。
lsetStandardTickUnits(NumberAxis.createIntegerTickUnits()):设置数据轴的刻度递进范围。
lGradientPaint类用来设置渐变色。
lcategoryaxis.setCategoryLabelPositions():设置标签文字旋转的角度。
4 使用二维数组生成CategoryDataset 同时显示水平直方图
代码如下:
private static CategoryDataset createDataset() { double[][] ds = { { 1.0, 43.0, 35.0, 58.0, 54.0, 77.0, 71.0, 89.0 }, { 54.0, 75.0, 63.0, 83.0, 43.0, 46.0, 27.0, 13.0 }, { 41.0, 33.0, 22.0, 34.0, 62.0, 32.0, 42.0, 34.0 } }; return DatasetUtilities.createCategoryDataset("Series ", "Factor ", ds); } private static JFreeChart createChart(CategoryDataset categorydataset) { JFreeChart jfreechart = ChartFactory.createBarChart("Bar Chart Demo 2", "Category", "Score (%)", categorydataset, PlotOrientation.VERTICAL, true, true, false); jfreechart.setBackgroundPaint(Color.white); CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot(); categoryplot.setBackgroundPaint(Color.lightGray); categoryplot.setRangeGridlinePaint(Color.white); categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); //设置值域范围 numberaxis.setRange(0.0, 100.0); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer(); barrenderer.setDrawBarOutline(false); barrenderer.setLegendItemToolTipGenerator(new StandardCategorySeriesLabelGenerator("Tooltip: {0}")); return jfreechart; }
运行效果: