- 浏览: 972413 次
- 性别:
- 来自: 山西
文章分类
最新评论
-
白小默:
你好 可以提供下源码DEMO吗,不知为何,我导出来的excel ...
jxls 使用模板文件导出生成excel -
zkzqzzz:
博主威武!
让微信二维码扫描您的APK -
zkzqzzz:
感谢博主 原来那些类都不是必须的 或者自己写!!博主真棒 ...
抢红包插件实现原理浅析 -
zkzqzzz:
博主 请问你的其他类在哪里呢?
抢红包插件实现原理浅析 -
zkzqzzz:
其他类在哪呢?
抢红包插件实现原理浅析
一、JFreeChart获取。
JFreeChart是JFreeChart公司在开源网站SourceForge.net上的一个项目,该公司的主要产品有如下:
1、JFreeReport:报表解决工具
2、JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp)
3、JCommon:JFreeReport和JFreeChart的公共类库
4、JFreeDesigner:JFreeReport的报表设计工具
我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),
获取地址:http://www.jfree.org/jfreechart/index.html(同时可以获得简明介绍)
我们以当前最新版本:jfreechart_0.9.21.zip为例子进行说明。
二、JFreeChart配置安装
1、解压jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源码,jfreechart-0.9.21-demo.jar
是例子程序(该部分留给大家自己去研究)
2、为了配置成功,我们需要关注的文件有如下三个:jfreechart-0.9.21.jar、lib\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文件,在其中加入如下代码:
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
(态图表,饼图(二维和三维) , 柱状图 (水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表)
图形可以导出成PNG和JPEG格式,同时还可以与PDF和EXCEL关联
JFreeChart核心类库介绍:
研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。其中前者主要与图形
本身有关,后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究,以后有时间我会告诉大家怎么去
研究源码。
核心类主要有:
org.jfree.chart.JFreeChart:图表对象,任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
org.jfree.data.category.XXXDataSet:数据集对象,用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类
org.jfree.chart.plot.XXXPlot:图表区域对象,基本上这个对象决定着什么样式的图表,创建该对象的时候需要Axis、Renderer以及数据集对象的支持
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 对象获得 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); //纵坐标网格线白色
//设置series1与category的显示位置;类似效果图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 接口
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(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 点(即数据点)间有连线可见
2、XYDataset 接口:
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(); //获得 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(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,
“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()方法
其他说明:
//设置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);
final 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;
}
本文转自:http://hi.baidu.com/iheejun23/blog/item/03acea18e1f7dc7ddbb4bd92.html
相关推荐
**JFreeChart 学习指南** JFreeChart 是一个用于Java平台的开源图表库,它提供了丰富的图表类型,包括柱状图、饼图、线形图、散点图、甘特图等,使得开发者能够方便地在应用程序中生成高质量的可视化数据。...
**JFreeChart简介** JFreeChart是一个开源的Java库,用于...这个"JFreechar报表一个简单例子"是学习和理解JFreeChart的一个良好起点,通过深入研究和实践,你将能够熟练地利用JFreeChart创建各种复杂的图表和报表。
**JFreeChart 教程** JFreeChart 是一个流行的开源Java库,用于生成高质量的图表。这个库广泛应用于各种Java应用程序中,包括Web应用、桌面应用以及报告和数据分析工具。JFreeChart 支持多种图表类型,如饼图、柱状...
总的来说,JFreeChart是Java开发中一款不可或缺的数据可视化工具,无论你是要为应用程序创建交互式图表,还是为报表生成静态图像,它都能提供全面的支持。掌握JFreeChart不仅可以提升你的数据呈现能力,也有助于你更...
### jfreechart饼图简单示例 #### 一、引言 `jfreechart`是一款功能强大且开源的Java图表库,它支持多种类型的图表绘制,包括饼图、柱状图、折线图等。本篇文章将通过一个简单的示例来介绍如何使用`jfreechart`来...
JFreeChar 动态曲线图,定时刷新,带节点事件
JFreeChar 动态横向柱状图,带纵向滚动条,可根据数据自动计算滚动条长度,可自定义系统柱子颜色,定时刷新
jfreechar最新jar包 JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面: pie charts (2D and 3D):饼图(平面和立体) bar charts (regular and stacked, with ...
这个压缩包“JfreeChar完整的例子”包含了使用JFreeChart创建图表的详细示例,既有在Web环境下运行的例子,也有通过main方法直接执行的Java应用。 首先,我们来了解一下JFreeChart的基本使用。在Java程序中,你可以...
- "jfreecharss"和"jfreechar"可能是包含JFreeChart示例代码或资源的文件。分析这些文件可以帮助理解如何在实际项目中使用JFreeChart。 综上所述,JFreeChart是一个强大的Java图表库,能够方便地生成各种图表,...
在`jfreechar.txt`文件中,可能包含了创建不同图表的Java代码示例。例如,创建一个简单的柱状图可能如下所示: ```java CategoryDataset dataset = createSampleData(); JFreeChart chart = ChartFactory....
JFreeChart它主要是用来制作各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
JFreeChart 是一个Java库,它提供了一套丰富的图表组件,可以帮助开发者轻松地在Java应用程序或Web应用中创建各种图表,如柱状图、饼形图和线性图。在这个项目中,我们将深入探讨如何使用JFreeChart来实现这些基本的...
在"jfreechar 例子下载"这个资源中,你将获得两个展示JFreeChart功能的示例,一个可能是饼图示例,另一个可能是条形图或线形图示例。这些例子对于理解和学习如何在Java项目中使用JFreeChart非常有帮助。 首先,我们...
总结,JFreeChart 1.0.17 提供了全面的图形绘制功能,配合中文 API 文档,使得 Java 开发者能够更加便捷地实现数据可视化,为项目增色添彩。无论你是初学者还是经验丰富的开发者,都能从中受益。
### JFreeChart 柱图实现详解 #### 引言 在数据分析与展示领域,柱状图(Bar Chart)是一种非常常见的数据可视化工具,它能够直观地比较不同类别的数值大小,尤其适用于显示离散数据集。JFreeChart作为Java平台上...
JFreeChart是一款强大的Java图形库,它允许开发者创建各种类型的统计图表,如饼图、柱状图、线图、散点图等。在Java应用程序中,JFreeChart为数据可视化提供了丰富的功能,使得数据的展示更为直观易懂。...
以下是关于 JFreeChart 及其在 JSP、Servlet 和 DAO 框架中的应用的详细讲解。 1. **JFreeChart 概述** JFreeChart 支持多种图表类型,包括: - **柱状图(Bar Chart)**:适用于比较不同类别的数值。 - **折线...
本资料提供的"jfreechar画图源代码"包含了作者自己编写的能运行并显示结果的示例代码,这对于学习和理解JFreeChart的使用非常有帮助。 JFreeChart库提供了丰富的图表类型,包括但不限于: 1. **饼状图(Pie Chart...