1.
JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,
pie charts 饼图,bar charts 柱状图,line and area charts曲线图, scatter plots and bubble charts 散列图,
time series 时序图,Area Charts区域图, Difference Chart差异图,Step Chart步骤图,Multiple Axis Charts 混合图,
Gantt charts甘特图,combination charts 复合图
。这些不同式样的图表基本 可以满足目前的要求.
JFreeChart.图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象.支持多种图形显示方式,不同的方式
由该工厂类长生不同的图形类,同时赋予不同类型的数据集.
创建不同类型的chart,都有一个对应的Plot,在JFreeChart接口中提供了getPlot()通用方式取Plot。也可以用getCategoryPlot().getXYPlot()获取特定类型的Plot
由于CategoryPlot, XYPlot这两种Plot比较常用所以列在了JFreeChart中。如果用getPlot()获取Plot,返回的Plot需要强制类型转换,才能调用具体Plot的特殊方法
通过System.out.println(chart.getPlot());可以得到Plot的类型。Plot的具体类型根据JFreeChart的类型而定。一个chart只有一个Plot。获得了Plot就获得了整个图形的引用
可以plot.getRangeAxis(),plot.getRenderer()来对图形属性进行设置。一个图形可有多个Y轴,多个Renderer,用不带参数的方式plot.getRenderer()。返回的是第一个Renderer。
可以给定参数来返回指定的Renderer。得到的Renderer,RangeAxis被范化的,返回的都父类的类型。要想使用具体子类特殊性的配置,仍然可以用System.out.println(plot.getRenderer());
来查看类型。一种类型的图形对应一个Render,如柱子图形对应BarRenderer。如果一个图片由多个图形组成,(柱子,曲线),默认情况下只给主图形配置一个Render(由JFreeChart类型而定)
也就是说默认情况下Plot中只有一个Renderer。为了配置曲线样式,就需要新建一个Render(LineAndShapeRenderer),赋值给Plot。
2.使用JFreeChart大致的步骤:
a.创建数据集,并往数据集容器中填充数据,不同类型的图形,对应不同的数据集.
b.由JFreeChart工厂创建一个图形引擎,并把数据集交给工厂,
c.设置图形显示的样式.
3.柱状图
柱状图: bar charts (regular and stacked, with an optional 3D effect),用到的主要类如下:
org.jfree.chart.JFreeChart:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.CategoryDataset:数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.CategoryPlot:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
org.jfree.chart.axis.CategoryAxis:用于处理图表的两个轴:纵轴和横轴
org.jfree.chart.render.CategoryRender:负责如何显示一个图表对象
org.jfree.chart.urls.CategoryURLGenerator:用于生成Web图表中每个项目的鼠标点击链接
CategoryToolTipGenerator:用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类
org.jfree.chart.axis.ValueAxis:用于处理图表中的柱
获得引擎工厂:
Y轴 一般Y轴为数值,描述对象的特性.,Y轴的显示方式比较固定,一般是按照某一刻度显示一个值轴.
X轴 一般X轴为时间,同时在某个时间点上还有被描述的对象.时间的跨度区域应该由用户自行定制.时间轴上描述的对象也可以由用户自行定制.
JFreeChart chart = ChartFactory.createBarChart3D(
"水果产量图", // 图表标题
"水果", // 目录轴的显示标签
"产量", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表方向:水平、垂直
true, // 是否显示图例(对于简单的柱状图必须是false)
false, // 是否生成工具
false // 是否生成URL链接
);
设置数据集(获取一个演示用的组合数据集对象) 如果 dataset.addValue(100, "北京", "苹果")中间参数为Null则为简单的数据集对象.
private static CategoryDataset getDataSet2() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(100, "北京", "苹果");
dataset.addValue(100, "上海", "苹果");
dataset.addValue(100, "广州", "苹果");
dataset.addValue(200, "北京", "梨子");
dataset.addValue(200, "上海", "梨子");
dataset.addValue(200, "广州", "梨子");
dataset.addValue(300, "北京", "葡萄");
dataset.addValue(300, "上海", "葡萄");
dataset.addValue(300, "广州", "葡萄");
dataset.addValue(400, "北京", "香蕉");
dataset.addValue(400, "上海", "香蕉");
dataset.addValue(400, "广州", "香蕉");
dataset.addValue(500, "北京", "荔枝");
dataset.addValue(500, "上海", "荔枝");
dataset.addValue(500, "广州", "荔枝");
return dataset;
}
4.柄状图
JFreeChart chart = ChartFactory.createPie3DChart("水果产量图", // 图表标题
data,
true, // 是否显示图例
false,
false
);
获得数据集
private static DefaultPieDataset getDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("苹果",100);
dataset.setValue("梨子",200);
dataset.setValue("葡萄",300);
dataset.setValue("香蕉",400);
dataset.setValue("荔枝",500);
return dataset;
}
5.设置柱子样式。
CategoryPlot plot = chart.getCategoryPlot();//获得图表区域对象
//设置图表的纵轴和横轴
CategoryAxis domainAxis = plot.getDomainAxis(); // 获得X轴
domainAxis.setLowerMargin(0.1);//设置距离图片左端距离此时为10%
domainAxis.setUpperMargin(0.1);//设置距离图片右端距离此时为百分之10
domainAxis.setCategoryLabelPositionOffset(10);//图表横轴与标签的距离(10像素)
domainAxis.setCategoryMargin(0.2);//横轴标签之间的距离20%
//domainAxis.setMaximumCategoryLabelLines(1);
//domainAxis.setMaximumCategoryLabelWidthRatio(0);
//设定柱子的属性
org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setUpperMargin(0.1);//设置最高的一个柱与图片顶端的距离(最高柱的10%)
//设置图表的颜色
org.jfree.chart.renderer.category.BarRenderer3D renderer;
renderer = new org.jfree.chart.renderer.category.BarRenderer3D();
renderer.setBaseOutlinePaint(Color.red);
renderer.setSeriesPaint(0, new Color(0, 255, 255));//计划柱子的颜色为青色
renderer.setSeriesOutlinePaint(0,Color.BLACK);//边框为黑色
renderer.setSeriesPaint(1, new Color(0, 255, 0));//实报柱子的颜色为绿色
renderer.setSeriesOutlinePaint(1,Color.red);//边框为红色
renderer.setItemMargin(0.1);//组内柱子间隔为组宽的10%
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("黑体",Font.BOLD,12));//12号黑体加粗
renderer.setItemLabelPaint(Color.black);//字体为黑色
renderer.setItemLabelsVisible(true);
plot.setRenderer(renderer);//使用我们设计的效果
//设置纵横坐标的显示位置
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//学校显示在下端(柱子竖直)或左侧(柱子水平)
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); //人数显示在下端(柱子水平)或左侧(柱子竖直)
也可以直接用:BarRenderer3D renderer =(BarRenderer3D)yijietiPercent.getCategoryPlot().getRenderer();得到Renderer
6. 设置Y轴刻度
NumberAxis vn=(NumberAxis )yijietiPercent.getCategoryPlot() .getRangeAxis();
vn.setAutoTickUnitSelection(true);
NumberTickUnit nt=new NumberTickUnit(20);
vn.setTickUnit(nt);
我们还可以是将数据格式化以后显示,比如y轴显示百分比(10%~100%),x轴显示为×月×日
NumberFormat nf =NumberFormat.getPercentInstance();
numAxis.setNumberFormatOverride(nf);//设置y轴以百分比方式显示
SimpleDateFormat format = new SimpleDateFormat("MM月dd");
dateaxis.setDateFormatOverride(format);//设置x轴数据单位以×月×日方式显示
7.设置X轴,Y轴字体样式
//重新设置图标标题,改变字体
chart.setTitle(new TextTitle("图书销量统计图", new Font("黑体", Font.ITALIC , 22)));
CategoryPlot plot = (CategoryPlot)chart.getPlot();
//取得横轴
CategoryAxis categoryAxis = plot.getDomainAxis();
//设置横轴