JFreeChart全面讲解

 

JFreeChart全面讲解

 

 

一、JFreeChart获取。

         JFreeChartJFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:

         1JFreeReport:报表解决工具

         2JFreeChartJava图形解决方案(Application/Applet/Servlet/Jsp

         3JCommonJFreeReportJFreeChart的公共类库

         4JFreeDesignerJFreeReport的报表设计工具

 

     我们可以从jfree官方网站上获取最新版本和相关资料(但是jfreedocument需要40美金才能获取),

     获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)

     我们以当前最新版本:jfreechart_0.9.21.zip为例子进行说明。

 

二、JFreeChart配置安装

     1、解压jfreechart_0.9.21.zip到指定位置,其中sourcejfreechart的源码,jfreechart-0.9.21-demo.jar

        是例子程序(该部分留给大家自己去研究)

     2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jarlib/jcommon-0.9.6.jar

        lib/gnujaxp.jar

     3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%/LIB中,同时在环境变量CLASSPATH中加入

        如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明:

        把上述三个文件拷贝到TEST/WEB-INF/LIB中,然后修改TEST/WEB-INF/web.xml文件,在其中加入如下代码:

               

Servlet used for streaming charts to the client browser from the temporary directory. You need to add this servlet and mapping to your deployment descriptor (web.xml) in order to get it to work. The syntax is as follows:

 

    DisplayChart

    org.jfree.chart.servlet.DisplayChart

 

 

     DisplayChart

     /servlet/DisplayChart

 

               

                至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类

        结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。如果

        是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。

 

三、JFreeChart功能介绍

     JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面:

     pie charts (2D and 3D):饼图(平面和立体)

     bar charts (regular and stacked, with an optional 3D effect):柱状图

     line and area charts:曲线图

     scatter plots and bubble charts

     time series, high/low/open/close charts and candle stick charts:时序图

     combination charts:复合图

     Pareto charts

     Gantt charts:甘特图

     wind plots, meter charts and symbol charts

     wafer map charts

     (态图表,饼图(二维和三维) , 柱状图 (水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表)

     图形可以导出成PNGJPEG格式,同时还可以与PDFEXCEL关联

   

     JFreeChart核心类库介绍:

             研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形

     本身有关,后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究,以后有时间我会告诉大家怎么去

     研究源码。

          核心类主要有:

            org.jfree.chart.JFreeChart:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象

            org.jfree.data.category.XXXDataSet:数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类

            org.jfree.chart.plot.XXXPlot:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要AxisRenderer以及数据集对象的支持

            org.jfree.chart.axis.XXXAxis:用于处理图表的两个轴:纵轴和横轴

            org.jfree.chart.render.XXXRender:负责如何显示一个图表对象

            org.jfree.chart.urls.XXXURLGenerator:用于生成Web图表中每个项目的鼠标点击链接

            XXXXXToolTipGenerator:用于生成图象的帮助提示,不同类型图表对应不同类型的工具提示类

 

四、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 对象获得 plotPiePlot!!

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(); //获得 plotCategoryPlot!!

categoryplot.setBackgroundPaint(Color.lightGray); //设定图表数据显示部分背景色

categoryplot.setDomainGridlinePaint(Color.white); //横坐标网格线白色

categoryplot.setDomainGridlinesVisible(true); //可见

categoryplot.setRangeGridlinePaint(Color.white); //纵坐标网格线白色

//设置series1category的显示位置;类似效果图http://www.chinabs.net/webimages/PieChart7.png

categoryplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);

categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

 

//使纵坐标的最小单位格为整数

NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();

numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

 

BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //获得renderer 注意这里是下嗍造型到BarRenderer!!

//显示每个柱的数值,并修改该数值的字体属性;类似效果图http://www.chinabs.net/webimages/PieChart6.png

barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());

barrenderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));

barrenderer.setItemLabelsVisible(true);

 

barrenderer.setDrawBarOutline(false); // Bar的外轮廓线不画

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); //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 接口

1CatagoryDataset接口:

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(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {

10F, 6F

}, 0.0F)); //定义series为”First”的(即series1)点之间的连线 ,这里是虚线,默认

是直线

lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {

6F, 6F

}, 0.0F)); //定义series为”Second”的(即series2)点之间的连线

lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {

2.0F, 6F

}, 0.0F)); //定义series为”Third”的(即series3)点之间的连线

return jfreechart;

}

一些重要的方法:

lineandshaperenderer.setLineVisible(true) //series 点(即数据点)间有连线可见

2XYDataset 接口:

A、创建一个数据源(dataset):

private static XYDataset createDataset()

{

XYSeries xyseries = new XYSeries(First); //先产生XYSeries 对象

xyseries.add(1.0D, 1.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(); //获得 plotXYPlot!!

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(2, 2001), 181.8D);//这里用的是Month.class,同样还有Day.class Year.class 等等

timeseries.add(new Month(3, 2001), 167.3D);

timeseries.add(new Month(4, 2001), 153.8D);

timeseries.add(new Month(5, 2001), 167.6D);

timeseries.add(new Month(6, 2001), 158.8D);

timeseries.add(new Month(7, 2001), 148.3D);

timeseries.add(new Month(8, 2001), 153.9D);

timeseries.add(new Month(9, 2001), 142.7D);

timeseries.add(new Month(10, 2001), 123.2D);

timeseries.add(new Month(11, 2001), 131.8D);

timeseries.add(new Month(12, 2001), 139.6D);

timeseries.add(new Month(1, 2002), 142.9D);

timeseries.add(new Month(2, 2002), 138.7D);

timeseries.add(new Month(3, 2002), 137.3D);

timeseries.add(new Month(4, 2002), 143.9D);

timeseries.add(new Month(5, 2002), 139.8D);

timeseries.add(new Month(6, 2002), 137D);

timeseries.add(new Month(7, 2002), 132.8D);

 

TimeSeries timeseries1 = new TimeSeries(”L&G UK Index Trust”,Month.class);

timeseries1.add(new Month(2, 2001), 129.6D);

timeseries1.add(new Month(3, 2001), 123.2D);

timeseries1.add(new Month(4, 2001), 117.2D);

timeseries1.add(new Month(5, 2001), 124.1D);

timeseries1.add(new Month(6, 2001), 122.6D);

timeseries1.add(new Month(7, 2001), 119.2D);

timeseries1.add(new Month(8, 2001), 116.5D);

timeseries1.add(new Month(9, 2001), 112.7D);

timeseries1.add(new Month(10, 2001), 101.5D);

timeseries1.add(new Month(11, 2001), 106.1D);

timeseries1.add(new Month(12, 2001), 110.3D);

timeseries1.add(new Month(1, 2002), 111.7D);

timeseries1.add(new Month(2, 2002), 111D);

timeseries1.add(new Month(3, 2002), 109.6D);

timeseries1.add(new Month(4, 2002), 113.2D);

timeseries1.add(new Month(5, 2002), 111.6D);

timeseries1.add(new Month(6, 2002), 108.8D);

timeseries1.add(new Month(7, 2002), 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,

&

ldquo;30 day moving average”,

30, //30天为一个周期

30); //最开始的30天跳过

TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();

timeseriescollection.addSeries(timeseries);

timeseriescollection.addSeries(timeseries1);

return timeseriescollection;

 

九、总结一下

dataset plot renderer

饼图 PieDatasetDefaultPieDataset PiePlot ——

柱状图 CatagoryDatasetDefaultCategoryDataset CategoryPlot BarRenderer

折线图 CatagoryDatasetDefaultCategoryDataset CategoryPlot LineAndShapeRenderer

XYDatasetXYSeriesCollection 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()方法

 

 

 

其他说明:

//设置Legend的位置

        //((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT);

//设置最高的一个 Item 与图片顶端的距离

        plot.getRangeAxis().setUpperMargin(0.15);

        //设置最低的一个 Item 与图片底端的距离

        plot.getRangeAxis().setLowerMargin(0.15);

        //坐标轴字体

        plot.getDomainAxis().setLabelFont(new Font("宋体", Font.PLAIN, 12));

        //横轴每个分类的字体

        plot.getDomainAxis().setTickLabelFont(new Font("宋体", Font.BOLD, 12));

        if(labelPositionsUP_45)

            plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45);

 

//柱图列宽度((BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);

 

2

我想用jfreechart做一个折线图,要求横轴是日1期,竖轴是数量。横轴日期为每个月的所有天数。如1月是1-31日,则页面上是31个点的折线图。根据每个月天数不同横轴坐标有不同的天数,问怎样实现?有样例代码也可以。谢谢了。

 

你的折线图只有一条线?线上有31个点?

 

给你一个例子,参考着改改就行了。jfc_0.9

package org.jfree.chart.demo;

 

import java.awt.BasicStroke;

import java.awt.Color;

import java.awt.Polygon;

import java.awt.Shape;

import java.awt.geom.Rectangle2D;

 

import org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.NumberAxis;

import org.jfree.chart.plot.CategoryPlot;

import org.jfree.chart.plot.DefaultDrawingSupplier;

import org.jfree.chart.plot.DrawingSupplier;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.chart.renderer.category.LineAndShapeRenderer;

import org.jfree.data.category.CategoryDataset;

import org.jfree.data.category.DefaultCategoryDataset;

 

字串4

 

 

import org.jfree.ui.ApplicationFrame;

import org.jfree.ui.RefineryUtilities;

 

/**

* A line chart demo showing the use of a custom drawing supplier.

*

*/

public class LineChartDemo5 extends ApplicationFrame {

 

/**

* Creates a new demo.

*

* @param title the frame title.

*/

public LineChartDemo5(final String title) {

super(title);

final CategoryDataset dataset = createDataset();

final JFreeChart chart = createChart(dataset);

final ChartPanel chartPanel = new ChartPanel(chart);

chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));

setContentPane(chartPanel);

 

}

 

/**

* Creates a sample dataset.

*

* @return a sample dataset.

*/

private CategoryDataset createDataset() {

 

// row keys...

final String series1 = "First";

final String series2 = "Second";

 

字串4

 

 

final String series3 = "Third";

 

// column keys...

final String type1 = "Type 1";

final String type2 = "Type 2";

final String type3 = "Type 3";

final String type4 = "Type 4";

final String type5 = "Type 5";

final String type6 = "Type 6";

final String type7 = "Type 7";

final String type8 = "Type 8";

 

// create the dataset...

final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

 

dataset.addValue(1.0, series1, type1);

dataset.addValue(4.0, series1, type2);

dataset.addValue(3.0, series1, type3);

dataset.addValue(5.0, series1, type4);

dataset.addValue(5.0, series1, type5);

dataset.addValue(7.0, series1, type6);

dataset.addValue(7.0, series1, type7);

dataset.addValue(8.0, series1, type8);

 

 

字串5

 

 

dataset.addValue(5.0, series2, type1);

dataset.addValue(7.0, series2, type2);

dataset.addValue(6.0, series2, type3);

dataset.addValue(8.0, series2, type4);

dataset.addValue(4.0, series2, type5);

dataset.addValue(4.0, series2, type6);

dataset.addValue(2.0, series2, type7);

dataset.addValue(1.0, series2, type8);

 

dataset.addValue(4.0, series3, type1);

dataset.addValue(3.0, series3, type2);

dataset.addValue(2.0, series3, type3);

dataset.addValue(3.0, series3, type4);

dataset.addValue(6.0, series3, type5);

dataset.addValue(3.0, series3, type6);

dataset.addValue(4.0, series3, type7);

dataset.addValue(3.0, series3, type8);

 

return dataset;

 

}

 

/**

* Creates a sample chart.

*

* @param dataset the dataset.

*

* @return a chart. 字串2

*/

private JFreeChart createChart(final CategoryDataset dataset) {

 

final JFreeChart chart = ChartFactory.createLineChart(

"Line Chart Demo 5", // chart title

"Type", // domain axis label

"Value", // range axis label

dataset, // data

PlotOrientation.VERTICAL, // orientation

true, // include legend

true, // tooltips

false // urls

);

 

// final StandardLegend legend = (StandardLegend) chart.getLegend();

// legend.setDisplaySeriesShapes(true);

 

f inal Shape[] shapes = new Shape[3];

int[] xpoints;

int[] ypoints;

 

// right-pointing triangle

 

3

/****

* 获取一个演示用的组合数据集对象   (时间曲线图)

* @return

*/

private   static   XYDataset   createDataset()

{  

       TimePeriodValues   timeseries1   =   new   TimePeriodValues("Chart   Title");  

        

       //这地方可以使用循环,把x轴,y   的值   辅给timeseries1

       TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();  

       for(int i =1;i<10;i++)

       {

        Minute   min   = new Minute(new Date());

        timeseries1.add(min,   i);  

     

       

        timeseriescollection.addSeries(timeseries1);  

       }

       return   timeseriescollection;  

   }

 

 

 

 

 

你可能感兴趣的:(JFreeChart全面讲解)