JFreeChart 布局类的使用,以绘制 柱状图 为例
强烈建议与源码对照看 具体构建代码参考位于 org.jfree.chart.ChartFactory 的如下方法 ChartFactory.createBarChart( String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls) 依照顺序,参数分别指代 表格名,类别坐标标签,值坐标标签, 适用于类别数据的数据集,布局方向, 是否显示图例,是否显示提示气泡, 是否添加url。
生成一幅柱状图
// 布局方向为水平的代码,至于判断方向来,可以参考ChartFactory里面的函数
// 参数
String title = "标题"
String xLabel = "横轴标签";
String yLabel = "纵轴标签";
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// 第一个参数为 值,第二个参数为 类别的子类, 第三个参数为 类别
// 等下看图就很明白是怎么对应的
dataset.addValue(1, "C", "安");
dataset.addValue(2, "S", "努");
dataset.addValue(3, "D", "卡");
dataset.addValue(4, "N", "莫");
// 类别轴(横轴)
CategoryAxis categoryAxis = new CategoryAxis(xLabel);
// 值轴(纵轴)
ValueAxis valueAxis = new NumberAxis(yLabel);
// 柱绘制器(进行柱子特效的绘制) 默认是渐变转换
BarRenderer renderer = new BarRenderer();
// 此处根据布局类选择标签锚点位置(锚点位置很多)
ItemLabelPosition position1 = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE3, TextAnchor.CENTER_LEFT);
renderer.setDefaultPositiveItemLabelPosition(position1);
ItemLabelPosition position2 = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE9, TextAnchor.CENTER_RIGHT);
renderer.setDefaultNegativeItemLabelPosition(position2);
// 工具提示和url本身不影响图表绘制,故不放入文章
// 构建类别布局
CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, renderer);
// 设置布局方向
plot.setOrientation(orientation);
// 创建表格
JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
// 表格风格样式可以不用添加,对绘制无影响,都有默认值打底
File bar= new File("D:\testBarChart.jpeg");
try {
ChartUtils.saveChartAsJPEG(bar, chart, 500, 280);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
然后就生成了如下的图,很丑吧 如何修改样式请参考其它文章。 对照添加的数据, dataset.addValue(1, "C", "安"); 第一个参数为 值,第二个参数为 系列, 第三个参数为 类别,
分析
结构如下
轴
横轴 此处使用的是 org.jfree.chart.axis.CategoryAxis 纵轴 此处使用的是 org.jfree.chart.axis.ValueAxis 两个轴都以org.jfree.chart.axis.Axis为基类。 在 轴 这一点有许多共通方法或成员。想对轴进行适当修改,是通用的。
类别数据
此处使用了 DefaultCategoryDataset,一种默认的数据组织结构。 通过继承链,还可以找到同级的 IntervalCategoryDataset , SlidingCategoryDataset。 基本一种类型对应一种细分类型的柱状图。
渲染器
CategoryPlot构造函数渲染器参数,要求是实现 CategoryItemRenderer接口 的对象。这里是使用的是BarRender。(请查看对应对象的构造函数源码) 渲染器目前是布局对象独有,专门负责进行布局里图形的绘制。因此如果想修改布局里面图形的各种样式,可以通过调整渲染器来实现。 有StatisticalBarRenderer和 AbstractCategoryItemRenderer实现了对应接口。 而后者有以下子类 AreaRender, BarRender, BoxAndWhiskerRenderer, CategoryStepRenderer, LevelRenderer, LineAndShapeRenderer, MinMaxCategoryRenderer, ScatterRenderer。 本文使用的 BarRender 包含一个特殊的接口成员 BarPainter。它负责柱子的效果。默认是一个渐变效果 GradientBarPainter。对于渐变效果的选择,可以通过BarRender.setGradientPaintTransformer()来调整渐变的方向。 此接口还有StandardBarPainter 实现了纯色。 替换成纯色柱子也很简单。
BarRenderer renderer = new BarRenderer(); StandardBarPainter s = new StandardBarPainter(); renderer.setBarPainter(s);
