本节内容主要讲述柱状图的一些高级特性。
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;
}
运行效果: