JFreeChart教程

本文详细介绍了JFreeChart库的使用,从创建数据集(Dataset)到构建各种类型的图形,包括如何配置图形域(Domain)和图例(Plot),以及利用生成器(Generator)自定义图表元素。通过实例解析,帮助读者掌握JFreeChart在数据可视化中的应用。
摘要由CSDN通过智能技术生成

 

一、jFreeChart产生图形的流程
创建一个数据源(dataset)来包含将要在图形中显示的数据
>> 创建一个 JFreeChart 对象来代表要显示的图形
>> 把图形输出
重要的类和接口:
org.jfree.data.general.Dataset 所有数据源类都要实现的接口
org.jfree.chart.ChartFactory 由它来产生 JFreeChart 对象
org.jfree.chart.JFreeChart 所有对图形的调整都是通过它噢!!
org.jfree.chart.plot.Plot 通过JFreeChart 对象获得它,然后再通过它对图形外部部分(例:坐标轴)调整
注意:它有很多子类,一般都下嗍造型到它的子类!
org.jfree.chart.renderer.AbstractRenderer 通过JFreeChart 对象获得它,然后再通过它对图形内部部分
(例:折线的类型)调整。同样,针对不同类型的报表图,它有
着不同的子类实现!在下面我们简称它为 Renderer
下面我们结合不同类型的图形来具体分析这个流程。

二、饼图
饼图的dataset 一般是用PieDataset 接口,具体实现类是 DefaultPieDataset
1 、创建一个数据源(dataset):
private   static  PieDataset createDataset()
...
{
DefaultPieDataset defaultpiedataset 
= new DefaultPieDataset(); //注意是DefaultPieDataset!!
defaultpiedataset.setValue(”One”, new Double(43.200000000000003D));
defaultpiedataset.setValue(”Two”, 
new Double(10D));
defaultpiedataset.setValue(”Three”, 
new Double(27.5D));
defaultpiedataset.setValue(”Four”, 
new Double(17.5D));
return defaultpiedataset;
}

2 、由ChartFactory 产生 JFreeChart 对象
private   static  JFreeChart createChart(PieDataset piedataset)
...
{
JFreeChart jfreechart 
= ChartFactory.createPieChart(”Pie Chart Demo 1″, //图形标题名称
piedataset, // dataset
true// legend?
true// tooltips?
false); //URLs?
PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通过JFreeChart 对象获得 plot:PiePlot!!
pieplot.setNoDataMessage(”No data available”); // 没有数据的时候显示的内容
return jfreechart;
}

一些重要的方法:
pieplot.setExplodePercent(
0 , 0.3D // 把Lable 为”One” 的那一块”挖”出来30%
3 、输出略

三、柱状图
柱状图的dataset 一般是用CatagoryDataset接口(具体实现类是DefaultCategoryDataset),也会用 IntervalXYDataset
接口
1 、创建一个数据源(dataset):
private   static  CategoryDataset createDataset()
...
{
String series1 
= “First”;
String series2 
= “Second”;
String series3 
= “Third”;
String category1 
= “Category 1″;
String category2 
= “Category 2″;
String category3 
= “Category 3″;
String category4 
= “Category 4″;
String category5 
= “Category 5″;
DefaultCategoryDataset defaultcategorydataset 
= new DefaultCategoryDataset();
defaultcategorydataset.addValue(
1.0D, series1, category1);
defaultcategorydataset.addValue(4D, series1, category2);
defaultcategorydataset.addValue(3D, series1, category3);
defaultcategorydataset.addValue(5D, series1, category4);
defaultcategorydataset.addValue(5D, series1, category5);

defaultcategorydataset.addValue(5D, series2, category1);
defaultcategorydataset.addValue(7D, series2, category2);
defaultcategorydataset.addValue(6D, series2, category3);
defaultcategorydataset.addValue(8D, series2, category4);
defaultcategorydataset.addValue(4D, series2, category5);

defaultcategorydataset.addValue(4D, series3, category1);
defaultcategorydataset.addValue(3D, series3, category2);
defaultcategorydataset.addValue(2D, series3, category3);
defaultcategorydataset.addValue(3D, series3, category4);
defaultcategorydataset.addValue(6D, series3, category5);
return defaultcategorydataset;
}

2 、由ChartFactory 产生 JFreeChart 对象
private   static  JFreeChart createChart(CategoryDataset categorydataset)
...
{
JFreeChart jfreechart 
= ChartFactory.createBarChart(”Bar Chart Demo”, //图形标题名称
“Category”,//domain 轴 Lable
这里先简单理解为横坐标Lable好了
“Value”, 
//range 轴 Lable
这里也先简单理解为纵坐标Lable好了
categorydataset, 
// dataset
PlotOrientation.VERTICAL, //垂直显示
true// legend?
true// tooltips?
false); //URLs?
jfreechart.setBackgroundPaint(Color.white); //设定背景色为白色
CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //获得 plot:CategoryPlot!!
categoryplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色
categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色
categoryplot.setDomainGridlinesVisible(true); //可见
categoryplot.setRangeGridlinePaint(Color.white); //纵坐标网格线白色
//下面两行使纵坐标的最小单位格为整数
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
BarRenderer barrenderer 
= (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意这里是下嗍造型
到BarRenderer!!
barrenderer.setDrawBarOutline(
false); // Bar的外轮廓线不画
GradientPaint gradientpaint = new GradientPaint(0.0F0.0F, Color.blue,
0.0F0.0Fnew Color(0064)); //设定特定颜色
GradientPaint gradientpaint1 = new GradientPaint(0.0F0.0F, Color.green,
0.0F0.0Fnew Color(0640));
GradientPaint gradientpaint2 
= new GradientPaint(0.0F0.0F, Color.red,
0.0F0.0Fnew Color(6400));
barrenderer.setSeriesPaint(
0, gradientpaint); //给series1 Bar设定上面定义的颜色
barrenderer.setSeriesPaint(1, gradientpaint1); //给series2 Bar 设定上面定义的颜色
barrenderer.setSeriesPaint(2, gradientpaint2); //给series3 Bar 设定上面定义的颜色
CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //横轴上的 Lable 45度倾斜
categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
return jfreechart;
}

一些重要的方法:(增加一块标记)
IntervalMarker intervalmarker 
=   new  IntervalMarker( 4.5D 7.5D );
intervalmarker.setLabel(”Target Range”);
intervalmarker.setLabelFont(
new  Font(”SansSerif”,  2 11 ));
intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
intervalmarker.setPaint(
new  Color( 222 222 255 128 ));
categoryplot.addRangeMarker(intervalmarker, Layer.BACKGROUND);



四、折线图
折线图的dataset 两种CatagoryDataset接口(具体实现类是DefaultCategoryDataset),XYDataset 接口
1 、CatagoryDataset接口:
A、创建一个数据源(dataset):
private   static  CategoryDataset createDataset()
{
String series1 
= “First”;
String series2 
= “Second”;
String series3 
= “Third”;
String type1 
= “Type 1″;
String type2 
= “Type 2″;
String type3 
= “Type 3″;
String type4 
= “Type 4″;
String type5 
= “Type 5″;
String type6 
= “Type 6″;
String type7 
= “Type 7″;
String type8 
= “Type 8″;
DefaultCategoryDataset defaultcategorydataset 
= new DefaultCategoryDataset();
defaultcategorydataset.addValue(
1.0D, series1, type1);
defaultcategorydataset.addValue(4D, series1, type2);
defaultcategorydataset.addValue(3D, series1, type3);
defaultcategorydataset.addValue(5D, series1, type4);
defaultcategorydataset.addValue(5D, series1, type5);
defaultcategorydataset.addValue(7D, series1, type6);
defaultcategorydataset.addValue(7D, series1, type7);
defaultcategorydataset.addValue(8D, series1, type8);

defaultcategorydataset.addValue(5D, series2, type1);
defaultcategorydataset.addValue(7D, series2, type2);
defaultcategorydataset.addValue(6D, series2, type3);
defaultcategorydataset.addValue(8D, series2, type4);
defaultcategorydataset.addValue(4D, series2, type5);
defaultcategorydataset.addValue(4D, series2, type6);
defaultcategorydataset.addValue(2D, series2, type7);
defaultcategorydataset.addValue(
1.0D, series2, type8);

defaultcategorydataset.addValue(4D, series3, type1);
defaultcategorydataset.addValue(3D, series3, type2);
defaultcategorydataset.addValue(2D, series3, type3);
defaultcategorydataset.addValue(3D, series3, type4);
defaultcategorydataset.addValue(6D, series3, type5);
defaultcategorydataset.addValue(3D, series3, type6);
defaultcategorydataset.addValue(4D, series3, type7);
defaultcategorydataset.addValue(3D, series3, type8);
return defaultcategorydataset;
}

B、由ChartFactory 产生 JFreeChart 对象 (与上面重复的部分就不再注释)
private   static  JFreeChart createChart(CategoryDataset categorydataset)
{
JFreeChart jfreechart 
= ChartFactory.createLineChart(”Line Chart Demo 1″,
“Type”,
“Value”,
categorydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
CategoryPlot categoryplot 
= (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setRangeGridlinePaint(Color.white);
NumberAxis numberaxis 
= (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setAutoRangeIncludesZero(
true);
//获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setShapesVisible(
true); //series 点(即数据点)可见
lineandshaperenderer.setSeriesStroke(0new BasicStroke(2.0F111.0Fnew float[] {
10F, 6F
}
0.0F)); //定义series为”First”的(即series1)点之间的连线,这里是虚线,默认是直线
lineandshaperenderer.setSeriesStroke(1new BasicStroke(2.0F111.0Fnew float[] {
6F, 6F
}
0.0F)); //定义series为”Second”的(即series2)点之间的连线
lineandshaperenderer.setSeriesStroke(2new BasicStroke(2.0F111.0Fnew float[] {
2.0F, 6F
}
0.0F)); //定义series为”Third”的(即series3)点之间的连线
return jfreechart;
}

一些重要的方法:
lineandshaperenderer.setLineVisible(
true // series 点(即数据点)间有连线可见
2 、XYDataset 接口:
A、创建一个数据源(dataset):
private   static  XYDataset createDataset()
{
XYSeries xyseries 
= new XYSeries(”First”); //先产生XYSeries 对象
xyseries.add(1.0D1.0D);
xyseries.add(2D, 4D);
xyseries.add(3D, 3D);
xyseries.add(4D, 5D);
xyseries.add(5D, 5D);
xyseries.add(6D, 7D);
xyseries.add(7D, 7D);
xyseries.add(8D, 8D);

XYSeries xyseries1 
= new XYSeries(”Second”);
xyseries1.add(
1.0D, 5D);
xyseries1.add(2D, 7D);
xyseries1.add(3D, 6D);
xyseries1.add(4D, 8D);
xyseries1.add(5D, 4D);
xyseries1.add(6D, 4D);
xyseries1.add(7D, 2D);
xyseries1.add(8D, 
1.0D);

XYSeries xyseries2 
= new XYSeries(”Third”);
xyseries2.add(3D, 4D);
xyseries2.add(4D, 3D);
xyseries2.add(5D, 2D);
xyseries2.add(6D, 3D);
xyseries2.add(7D, 6D);
xyseries2.add(8D, 3D);
xyseries2.add(9D, 4D);
xyseries2.add(10D, 3D);

XYSeriesCollection xyseriescollection 
= new XYSeriesCollection(); //再用XYSeriesCollection添加入XYSeries 对象
xyseriescollection.addSeries(xyseries);
xyseriescollection.addSeries(xyseries1);
xyseriescollection.addSeries(xyseries2);
return xyseriescollection;
}

B、由ChartFactory 产生 JFreeChart 对象
private   static  JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart 
= ChartFactory.createXYLineChart(”Line Chart Demo 2″,
“X”,
“Y”,
xydataset,
PlotOrientation.VERTICAL,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot 
= (XYPlot)jfreechart.getPlot(); //获得 plot:XYPlot!!
xyplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //设定坐标轴与图表数据显示部分距离
xyplot.setDomainGridlinePaint(Color.white); //网格线颜色
xyplot.setRangeGridlinePaint(Color.white);
//获得 renderer 注意这里是XYLineAndShapeRenderer !!
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setShapesVisible(
true); //数据点可见
xylineandshaperenderer.setShapesFilled(true); //数据点被填充即不是空心点
NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return jfreechart;
}

一些重要的方法:
XYLineAndShapeRenderer xylineandshaperenderer 
=   new  XYLineAndShapeRenderer();
xylineandshaperenderer.setSeriesLinesVisible(
0 false );  // 第一个XYSeries数据点间连线不可见
xylineandshaperenderer.setSeriesShapesVisible( 1 false );  // 第二个XYSeries数据点不可见
xyplot.setRenderer(xylineandshaperenderer);

五、时间序列图
时间序列图和折线图很相似,不同的是它在 domain轴的数据是时间而不是数字。 时间序列图的dataset 是
XYDataset 接口,具体实现类是TimeSeriesCollection ,和上面类似,有TimeSeries 对象,它被添加入
TimeSeriesCollection 。
1 、创建一个数据源(dataset):
private   static  XYDataset createDataset()
{
TimeSeries timeseries 
= new TimeSeries(”L&G European Index Trust”,Month.class);
timeseries.add(
new Month(22001), 181.8D);//这里用的是Month.class,同样还有Day.class Year.class 等等
timeseries.add(new Month(32001), 167.3D);
timeseries.add(
new Month(42001), 153.8D);
timeseries.add(
new Month(52001), 167.6D);
timeseries.add(
new Month(62001), 158.8D);
timeseries.add(
new Month(72001), 148.3D);
timeseries.add(
new Month(82001), 153.9D);
timeseries.add(
new Month(92001), 142.7D);
timeseries.add(
new Month(102001), 123.2D);
timeseries.add(
new Month(112001), 131.8D);
timeseries.add(
new Month(122001), 139.6D);
timeseries.add(
new Month(12002), 142.9D);
timeseries.add(
new Month(22002), 138.7D);
timeseries.add(
new Month(32002), 137.3D);
timeseries.add(
new Month(42002), 143.9D);
timeseries.add(
new Month(52002), 139.8D);
timeseries.add(
new Month(62002), 137D);
timeseries.add(
new Month(72002), 132.8D);

TimeSeries timeseries1 
= new TimeSeries(”L&G UK Index Trust”,Month.class);
timeseries1.add(
new Month(22001), 129.6D);
timeseries1.add(
new Month(32001), 123.2D);
timeseries1.add(
new Month(42001), 117.2D);
timeseries1.add(
new Month(52001), 124.1D);
timeseries1.add(
new Month(62001), 122.6D);
timeseries1.add(
new Month(72001), 119.2D);
timeseries1.add(
new Month(82001), 116.5D);
timeseries1.add(
new Month(92001), 112.7D);
timeseries1.add(
new Month(102001), 101.5D);
timeseries1.add(
new Month(112001), 106.1D);
timeseries1.add(
new Month(122001), 110.3D);
timeseries1.add(
new Month(12002), 111.7D);
timeseries1.add(
new Month(22002), 111D);
timeseries1.add(
new Month(32002), 109.6D);
timeseries1.add(
new Month(42002), 113.2D);
timeseries1.add(
new Month(52002), 111.6D);
timeseries1.add(
new Month(62002), 108.8D);
timeseries1.add(
new Month(72002), 101.6D);
TimeSeriesCollection timeseriescollection 
= new TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
timeseriescollection.setDomainIsPointsInTime(
true); //domain轴上的刻度点代表的是时间点而不是时间段
return timeseriescollection;
}

2 、由ChartFactory 产生 JFreeChart 对象
private   static  JFreeChart createChart(XYDataset xydataset)
{
JFreeChart jfreechart 
= ChartFactory.createTimeSeriesChart(”Legal & General Unit Trust Prices”,
“Date”,
“Price Per Unit”,
xydataset,
true,
true,
false);
jfreechart.setBackgroundPaint(Color.white);
XYPlot xyplot 
= (XYPlot)jfreechart.getPlot(); //获得 plot : XYPlot!!
xyplot.setBackgroundPaint(Color.lightGray);
xyplot.setDomainGridlinePaint(Color.white);
xyplot.setRangeGridlinePaint(Color.white);
xyplot.setAxisOffset(
new RectangleInsets(5D, 5D, 5D, 5D));
xyplot.setDomainCrosshairVisible(
true);
xyplot.setRangeCrosshairVisible(
true);
org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer 
= xyplot.getRenderer();
if(xyitemrenderer instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer xylineandshaperenderer 
= (XYLineAndShapeRenderer)xyitemrenderer;
xylineandshaperenderer.setDefaultShapesVisible(
true); //数据点可见
xylineandshaperenderer.setDefaultShapesFilled(true); //数据点是实心点
}

DateAxis dateaxis 
= (DateAxis)xyplot.getDomainAxis(); //对domain 轴上日期显示格式定义
dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”));
return jfreechart;
}

一些重要的方法:
A、增加标记线:
xyplot.addRangeMarker(
new  ValueMarker(550D));  // 数值轴
Quarter quarter  =   new  Quarter( 2 2002 );
xyplot.addDomainMarker(
new  ValueMarker(quarter.getMiddleMillisecond()));  // 时间轴
B、数据点的调整
XYLineAndShapeRenderer xylineandshaperenderer 
=  (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(
true );  // 数据点可见
xylineandshaperenderer.setSeriesFillPaint( 0 , Color.red);  // 数据点填充为红色
xylineandshaperenderer.setSeriesFillPaint( 1 , Color.white);  // 数据点填充为白色
xylineandshaperenderer.setUseFillPaint( true );  // 应用
C、平均值曲线
这个曲线有什么用呢?很简单的例子,这里有一个以半年每天为单位的数据绘制的曲线,我们想看看以月为单位数据
的变化,这时就可以用到它了。
TimeSeries timeseries 
=  createEURTimeSeries();  // 就是以半年每天为单位的数据
TimeSeries timeseries1  =  MovingAverage.createMovingAverage(timeseries,
30  day moving average”,
30 // 30天为一个周期
30 );  // 最开始的30天跳过
TimeSeriesCollection timeseriescollection  =   new  TimeSeriesCollection();
timeseriescollection.addSeries(timeseries);
timeseriescollection.addSeries(timeseries1);
return  timeseriescollection;

六、总结一下
dataset plot renderer
饼图 PieDataset(DefaultPieDataset) PiePlot ——
柱状图 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer
折线图 CatagoryDataset(DefaultCategoryDataset) CategoryPlot LineAndShapeRenderer
XYDataset(XYSeriesCollection) XYPlot XYLineAndShapeRenderer
时间序列图 XYDataset (TimeSeriesCollection) XYPlot XYLineAndShapeRenderer
这里只是一些常用的方法,具体还是看API
七、Item Lable
这里以柱状图为例说明,具体来说就是在每个柱状上显示它的数据,具体有下面内容:
A、使 Item Lable 可见
B、调整 Item Lable 的颜色、字体等
C、调整 Item Lable 的位置
D、定制 Item Lable 的内容
1 、分配一个 Lable Generator 给 renderer
BarRenderer barrenderer 
=  (BarRenderer)categoryplot.getRenderer();
GategoryLableGenerator generator 
= new  StandardGategoryLableGenerator(
{2} ”,  new  DecimalFormat(” 0.00 ″)  // 调整显示的数字和字符格式
);
barrenderer.setLableGenerator(generator);
2 、使 Item Lable 可见
barrenderer.setItemLableVisible(
true );
3 、调整 Item Lable 的颜色、字体等
barrenderer.setItemLablePaint(Color.red);
barrenderer.setItemLableFont(
new  Font(”SansSerif”,Font.PLAIN, 10 ));
4 、调整 Item Lable 的位置
这里涉及到一个新的对象 ItemLablePosition , ItemLablePosition的构造函数有两个或四个参数
public  ItemLabelPosition(ItemLabelAnchor itemLabelAnchor,
org.jfree.ui.TextAnchor textAnchor,
org.jfree.ui.TextAnchor rotationAnchor,
double  angle)
itemLabelAnchor 
-  Item Lable 的位置 (最重要的!!)
textAnchor 
-  Item Lable里包含的正文相对于Item Lable 的位置
rotationAnchor 
-  Item Lable里包含的正文旋转的位置
angle 
-  旋转的角度
ItemLabelPosition itemlabelposition 
=   new  ItemLabelPosition(ItemLabelAnchor.INSIDE12,
TextAnchor.CENTER_RIGHT,
TextAnchor.CENTER_RIGHT,
- 1.57D );
barrenderer.setPositiveItemLabelPosition(itemlabelposition);
这样就可以每个柱状上显示它的数据了,当然可以定制 Item Lable 的内容,比如 Item Lable text 超过100的才
显示,这样就需要定制自己的类,它要实现GategoryLableGenerator 接口,实现generateItemLable()方法

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值