jfreechart+sql实现时间曲线图(显示曲线数据点)
- 格式:doc
- 大小:36.00 KB
- 文档页数:4
JFreeChart实现曲线走势图由于公司需要开发一个短信监控系统.需要用曲线图对短信的发送情况进行实时的走势图。
由于没有找到JfreeChart的中文文档,花了二天时间才把第一个Applet + JfreeChart 实现曲线图的简单例子给弄出来!现在跟大家共享。
大家一起讨论,学习JfreeChart.jfreechart-1.0.3下载址址解压jfreechart-1.0.3后,将lib目录中的jfreechart-1.0.3.jar,jcommon-1.0.6.jar二个类库加入到工程classpath中.新建一个类abc.java,代码如下.import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JApplet;import javax.swing.Timer;import org.jfree.chart.ChartPanel;import org.jfree.chart.JFreeChart;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.ChartFactory;import org.jfree.chart.axis.ValueAxis;import org.jfree.data.time.*;/*** 一个简单的曲线图例子* @author tf* date 2007-01-30*/public class abc extends JApplet {private static final long serialVersionUID=3257566209007171634L;private double cpuValue1;private double cpuValue2;private double cpuValue3private TimeSeries cpu1;private TimeSeries cpu2;private TimeSeries cpu3;/*** 内部类--实现动态随机产生虚拟CPU使用率的值* @author tf**/class DataGenerator extends Timer implements ActionListener {private static final long serialVersionUID = 3977867288743720505L;public void actionPerformed(ActionEvent actionevent) {cpuValue1 = 100;cpuValue2 = 100;cpuValue3 = 100;double d1 = Math.random();cpuValue1 = cpuValue1 * d1;//cpuValue1 += 10;double d2 = Math.random();cpuValue2 = cpuValue2 * d2;double d3 = Math.random();cpuValue3 = cpuValue3 * d3;addcpu1Observation(cpuValue1);addcpu2Observation(cpuValue2);addcpu3Observation(cpuValue3);}DataGenerator() {super(100, null);addActionListener(this);}}public abc() {cpu1 = new TimeSeries("处理器1", lisecond.class);//增加一条走势曲线//cpu1.setHistoryCount(2000); //---比方法在新版本中的TimeSeries类中不存在cpu2 = new TimeSeries("处理器2", Millisecond.class);//free.setHistoryCount(2000); //---比方法在新版本中的TimeSeries类中不存在cpu3 = new TimeSeries("处理器3", Millisecond.class);TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();//将所有走势曲线加入到时间条中timeseriescollection.addSeries(cpu1);timeseriescollection.addSeries(cpu2);timeseriescollection.addSeries(cpu3);//创建JFreeChart对象JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("处理器利用率","时间", "值", timeseriescollection, true, true, true);//设置图表样式XYPlot xyplot = jfreechart.getXYPlot();xyplot.setOutlinePaint(Color.CYAN);//设置数据区的边界线条颜色ValueAxis valueaxis = xyplot.getDomainAxis();// valueaxis.setAutoRange(true); //自动设置数据轴数据范围valueaxis.setFixedAutoRange(10000D);//设置时间轴显示的数据valueaxis = xyplot.getRangeAxis();valueaxis.setRange(0.0D, 100D);//数据轴固定数据范围(设置100的话就是显示MAXVALUE 到MAXVALUE-100那段数据范围)// valueaxis.setAutoRange(true);valueaxis.setVisible(true);//设置是否显示数据轴//设置曲线图面版ChartPanel chartpanel = new ChartPanel(jfreechart);chartpanel.setPopupMenu(null);ChartPanel chartpanel1 = new ChartPanel(jfreechart);chartpanel1.setPopupMenu(null);getContentPane().add(chartpanel);getContentPane().add(chartpanel1);(new DataGenerator()).start();}private void addcpu1Observation(double d) {cpu1.add(new Millisecond(), d);}private void addcpu2Observation(double d) {cpu2.add(new Millisecond(), d);}private void addcpu3Observation(double d) {cpu3.add(new Millisecond(), d);}}代码运行成功如下:呵呵,忙了二天终于搞定了这么个简单的例子.希望大家共同学习.多多提意见.其它与JfreeChart相关设置的类和方法JFreeChart类:void setAntiAlias(boolean flag) 字体模糊边界void setBackgroundImage(Image image) 背景图片void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundImageAlpha(float alpha) 背景图片透明度(0.0~1.0)void setBackgroundPaint(Paint paint) 背景色void setBorderPaint(Paint paint) 边界线条颜色void setBorderStroke(Stroke stroke) 边界线条笔触void setBorderVisible(boolean visible) 边界线条是否可见TextTitle类:void setFont(Font font) 标题字体void setPaint(Paint paint) 标题字体颜色void setText(String text) 标题内容StandardLegend(Legend)类:void setBackgroundPaint(Paint paint) 图示背景色void setTitle(String title) 图示标题内容void setTitleFont(Font font) 图示标题字体void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高void setOutlinePaint(Paint paint) 图示边界线条颜色void setOutlineStroke(Stroke stroke) 图示边界线条笔触void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效)void setItemFont(Font font) 图示项字体void setItemPaint(Paint paint) 图示项字体颜色void setAnchor(int anchor) 图示在图表中的显示位置(参数常量在Legend类中定义)Axis类:void setVisible(boolean flag) 坐标轴是否可见void setAxisLinePaint(Paint paint) 坐标轴线条颜色(3D轴无效)void setAxisLineStroke(Stroke stroke) 坐标轴线条笔触(3D轴无效)void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效)void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)void setLabel(String label) 坐标轴标题void setLabelFont(Font font) 坐标轴标题字体void setLabelPaint(Paint paint) 坐标轴标题颜色void setLabelAngle(double angle)` 坐标轴标题旋转角度(纵坐标可以旋转)void setTickLabelFont(Font font) 坐标轴标尺值字体void setTickLabelPaint(Paint paint) 坐标轴标尺值颜色void setTickLabelsVisible(boolean flag) 坐标轴标尺值是否显示void setTickMarkPaint(Paint paint) 坐标轴标尺颜色void setTickMarkStroke(Stroke stroke) 坐标轴标尺笔触void setTickMarksVisible(boolean flag) 坐标轴标尺是否显示ValueAxis(Axis)类:void setAutoRange(boolean auto) 自动设置数据轴数据范围void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true)void setFixedAutoRange(double length) 数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)void setInverted(boolean flag) 数据轴是否反向(默认为false)void setLowerMargin(double margin) 数据轴下(左)边距void setUpperMargin(double margin) 数据轴上(右)边距void setLowerBound(double min) 数据轴上的显示最小值void setUpperBound(double max) 数据轴上的显示最大值void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效)void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效)void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)NumberAxis(ValueAxis)类:void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0 void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection 设false)DateAxis(ValueAxis)类:void setMaximumDate(Date maximumDate) 日期轴上的最小日期void setMinimumDate(Date minimumDate) 日期轴上的最大日期void setRange(Date lower,Date upper) 日期轴范围void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式void setTickUnit(DateTickUnit unit) 日期轴的日期标签(需要将AutoTickUnitSelection设false)void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)CategoryAxis(Axis)类:void setCategoryMargin(double margin) 分类轴边距void setLowerMargin(double margin) 分类轴下(左)边距void setUpperMargin(double margin) 分类轴上(右)边距void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度Plot类:void setBackgroundImage(Image image) 数据区的背景图片void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundPaint(Paint paint) 数据区的背景图片背景色void setBackgroundAlpha(float alpha) 数据区的背景透明度(0.0~1.0)void setForegroundAlpha(float alpha) 数据区的前景透明度(0.0~1.0)void setDataAreaRatio(double ratio) 数据区占整个图表区的百分比void setOutLinePaint(Paint paint) 数据区的边界线条颜色void setOutLineStroke(Stroke stroke) 数据区的边界线条笔触void setNoDataMessage(String message) 没有数据时显示的消息void setNoDataMessageFont(Font font) 没有数据时显示的消息字体void setNoDataMessagePaint(Paint paint) 没有数据时显示的消息颜色CategoryPlot(Plot)类:void setDataset(CategoryDataset dataset) 数据区的2维数据表void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式void setAxisOffset(RectangleInsets args) 坐标轴到数据区的间距void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL 或PlotOrientation.VERTICAL)void setDomainAxis(CategoryAxis axis) 数据区的分类轴void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setDomainGridlinesVisible(boolean visible) 分类轴网格是否可见void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触void setRangeAxis(ValueAxis axis) 数据区的数据轴void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见void setRangeGridlinePaint(Paint paint) 数据轴网格线条颜色void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组)void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域PiePlot(Plot)类:void setDataset(PieDataset dataset) 数据区的1维数据表void setIgnoreNullValues(boolean flag) 忽略无值的分类void setCircular(boolean flag) 饼图是否一定是正圆void setStartAngle(double angle) 饼图的初始角度void setDirection(Rotation direction) 饼图的旋转方向void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效void setLabelBackgroundPaint(Paint paint) 分类标签的底色void setLabelFont(Font font) 分类标签的字体void setLabelPaint(Paint paint) 分类标签的字体颜色void setLabelLinkMargin(double margin) 分类标签与图的连接线边距void setLabelLinkPaint(Paint paint) 分类标签与图的连接线颜色void setLabelLinkStroke(Stroke stroke) 分类标签与图的连接线笔触void setLabelOutlinePaint(Paint paint) 分类标签边框颜色void setLabelOutlineStroke(Paint paint) 分类标签边框笔触void setLabelShadowPaint(Paint paint) 分类标签阴影颜色void setMaximumLabelWidth(double width) 分类标签的最大长度(0.0~1.0)void setPieIndex(int index) 饼图的索引(复合饼图中用到)void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触void setSectionPaint(int section,Paint paint) 指定分类饼的颜色void setShadowPaint(Paint paint) 饼图的阴影颜色void setShadowXOffset(double offset) 饼图的阴影相对图的水平偏移void setShadowYOffset(double offset) 饼图的阴影相对图的垂直偏移void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null 则整个标签包括连接线都不显示void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式void setURLGenerator(PieURLGenerator generator) MAP中钻取链接格式PiePlot3D(PiePlot)类:void setDepthFactor(double factor) 3D饼图的Z轴高度(0.0~1.0)MultiplePiePlot(Plot)类:void setLimit(double limit) 每个饼图之间的数据关联(详细比较复杂)void setPieChart(JFreeChart pieChart) 每个饼图的显示方式(见JFreeChart类个PiePlot类)AbstractRenderer类:void setItemLabelAnchorOffset(double offset) 数据标签的与数据点的偏移void setItemLabelsVisible(boolean visible) 数据标签是否可见void setItemLabelFont(Font font) 数据标签的字体void setItemLabelPaint(Paint paint) 数据标签的字体颜色void setItemLabelPosition(ItemLabelPosition position) 数据标签位置void setPositiveItemLabelPosition(ItemLabelPosition position) 正数标签位置void setNegativeItemLabelPosition(ItemLabelPosition position) 负数标签位置void setOutLinePaint(Paint paint) 图形边框的线条颜色void setOutLineStroke(Stroke stroke) 图形边框的线条笔触void setPaint(Paint paint) 所有分类图形的颜色void setShape(Shape shape) 所有分类图形的形状(如折线图的点)void setStroke(Stroke stroke) 所有分类图形的笔触(如折线图的线)void setSeriesItemLabelsVisible(int series,boolean visible) 指定分类的数据标签是否可见void setSeriesItemLabelFont(int series,Font font) 指定分类的数据标签的字体void setSeriesItemLabelPaint(int series,Paint paint) 指定分类的数据标签的字体颜色void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置void setSeriesOutLinePaint(int series,Paint paint) 指定分类的图形边框的线条颜色void setSeriesOutLineStroke(int series,Stroke stroke) 指定分类的图形边框的线条笔触void setSeriesPaint(int series,Paint paint) 指定分类图形的颜色void setSeriesShape(int series,Shape shape) 指定分类图形的形状(如折线图的点)void setSeriesStroke(int series,Stroke stroke) 指定分类图形的笔触(如折线图的线)AbstractCategoryItemRenderer(AbstractRenderer)类:void setLabelGenerator(CategoryLabelGenerator generator) 数据标签的格式void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠标移上的显示格式void setItemURLGenerator(CategoryURLGenerator generator) MAP中钻取链接格式void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式BarRenderer(AbstractCategoryItemRenderer)类:void setDrawBarOutline(boolean draw) 是否画图形边框void setItemMargin(double percent) 每个BAR之间的间隔void setMaxBarWidth(double percent) 每个BAR的最大宽度void setMinimumBarLength(double min) 最短的BAR长度,避免数值太小而显示不出void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置BarRenderer3D(BarRenderer)类:void setWallPaint(Paint paint) 3D坐标轴的墙体颜色StackedBarRenderer(BarRenderer)类StackedBarRenderer3D(BarRenderer3D)类GroupedStackedBarRenderer(StackedBarRenderer)类:void setSeriesToGroupMap(KeyToGroupMap map) 将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))LayeredBarRenderer(BarRenderer)类:void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖)WaterfallBarRenderer(BarRenderer)类:void setFirstBarPaint(Paint paint) 第一个柱图的颜色void setLastBarPaint(Paint paint) 最后一个柱图的颜色void setPositiveBarPaint(Paint paint) 正值柱图的颜色void setNegativeBarPaint(Paint paint) 负值柱图的颜色IntervalBarRenderer(BarRenderer)类:需要传IntervalCategoryDataset作为数据源GanttBarRenderer(IntervalBarRenderer)类:void setCompletePaint(Paint paint) 完成进度颜色void setIncompletePaint(Paint paint) 未完成进度颜色void setStartPercent(double percent) 设置进度条在整条中的起始位置(0.0~1.0)void setEndPercent(double percent) 设置进度条在整条中的结束位置(0.0~1.0)StatisticBarRenderer(BarRenderer)类:需要传StatisticCategoryDataset作为数据源LineAndShapeRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean draw) 是否折线的数据点之间用线连void setDrawShapes(boolean draw) 是否折线的数据点根据分类使用不同的形状void setShapesFilled(boolean filled) 所有分类是否填充数据点图形void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框LevelRenderer(AbstractCategoryItemRenderer)类:void setItemMargin(double percent) 每个分类之间的间隔void setMaxItemWidth(double percent) 每个分类的最大宽度CategoryStepRenderer(AbstractCategoryItemRenderer)类:void setStagger(boolean shouldStagger) 不同分类的图是否交错MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean drawLines) 是否在每个分类线间画连接线void setGroupPaint(Paint groupPaint) 一组图形连接线的颜色void setGroupStroke(Stroke groupStroke) 一组图形连接线的笔触void setMaxIcon(Icon maxIcon) 最大值的ICONvoid setMinIcon(Icon minIcon) 最小值的ICONvoid setObjectIcon(Icon objectIcon) 所有值的ICONAreaRender(AbstractCategoryItemRenderer)类StackedAreaRender(AreaRender)类。
jfreechart createlinechart参数JFreeChart是一个开源的Java图表库,可以用来创建各种类型的图表,包括线图(Line Chart)。
创建线图的主要参数如下:1.数据集(dataset):用于存储线图的数据。
JFreeChart支持多种类型的数据集,如DefaultCategoryDataset(默认类别数据集)、DefaultXYDataset(默认XY数据集)等。
数据集可以通过添加数据项来包含实际的数据。
2.绘图区(plot):线图的绘图区由CategoryPlot(类别绘图区)或XYPlot(XY绘图区)构成。
类别绘图区适用于类别数据集,而XY绘图区适用于XY数据集。
绘图区包含了线的样式、颜色等属性,并负责将数据集中的数据绘制到图表上。
3. X轴(x-axis)和Y轴(y-axis):X轴和Y轴用于显示线图上的数值范围。
JFreeChart提供了多种类型的坐标轴,如NumberAxis (数值坐标轴)、CategoryAxis(类别坐标轴)等。
坐标轴负责定义刻度、标签等属性,并将数据集中的数据映射到坐标轴上。
4.渲染器(renderer):渲染器用于控制线的样式、颜色等属性。
JFreeChart为类别数据集和XY数据集分别提供了不同的渲染器,如LineAndShapeRenderer(线和形状渲染器)、XYLineAndShapeRenderer(XY线和形状渲染器)等。
5.图例(legend):图例用于标识线图中的各个线的含义。
JFreeChart提供了多种图例类型,如StandardLegend(标准图例)、GradientLegend(渐变图例)等。
图例可以自定义位置和样式。
6.标题(title):标题用于描述线图的内容。
JFreeChart提供了多种标题类型,如TextTitle(文本标题)、LegendTitle(图例标题)等。
标题可以设置文本内容、字体、颜色等属性。
使用JfreeChart开发图表经验总结(含源码)使用JfreeChart开发图表经验总结(含源码)Keith He 2005年10月27日最近,公司一项目要出很多的图表。
由于项目是B/S架构的,所以生成的图表也要考虑能在浏览器上动态显示。
生成基于浏览器的图表方式比较多。
据我所知道的,常用的有三种:1、VML方式实现。
这种方式是通过产生客户端的代码,由客户端根据代码生成相应的图表。
但这种方式产生的图表有很多的局限性,如受限于浏览器,有些浏览器可能并不支持VML。
另外,没有封装完整的图表开发包。
2、通过applet来产生图表。
这种方式也对客户端要求比较高,必须要有JRE,而且通过applet生成的图表在加载过程中会有个Java的Log动画。
用户看了可能会感觉不太舒服。
3、通过服务端直接生成图表的图片。
这种方式对客户端几乎没有什么要求,缺点是加重了服务端的负担,对服务端要求就相对高了点。
经过比较,根据项目自身特点,我们打算采用第三种方式来开发图表。
为了缩短开发周期、节约成本,我们选用了开源的JFreeChart(/jfreechart/)。
jfreechart是一个免费创建图表的java工具,目前最新版本是JFreeChart-1.0.0-rc1。
它可以生成各式各样的图表。
这些图表包括饼图、柱状图、线形图、区域图、甘特图等等,基本可以满足各种项目的要求。
但在开发过程中我也发现了JFreeChart的一些不足,或者说有些称得上是BUG。
总体说来,JFreeChart还是个优秀的开源项目。
关于JFreeChart生成图表的文章比较多了,我主要谈谈使用JFreeChart的一些比较棘手问题以及解决方法。
同时也会将问题所用到的源码(JFreeChart-1.0.0-rc1+Struts1.2.4)从项目中抽象出来一起提供给大家。
一、图片上热点链接中文乱码的解决方法这个问题是在我查阅关于JFreeChart相关资料时出现频率最高的一个问题。
JFreeChart 是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。
它能够用在Swing 和Web等中制作自定义的图表或报表,并且得到广泛的应用。
本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用,来达到熟练使用JFreeChart的目的。
一.下载与环境配置1. 下载JFreeChartJFreeChart是开放源代码的免费软件,但是它的支持文档需要付费才能得到。
其下载地址为:/projects/jfreechart/files/,当前最新版本为1.0.14。
笔者下载的是1.0.14最新版。
说明:1)source目录:为jfreechart的源码目录;2)lib目录:为包目录,我们需要关注的包为jfreechart-1.0.13.jar、gnujaxp.jar和jcommon-1.0.16.jar这三个包;3)根目录下的jfreechart-1.0.13-demo.jar是例子程序,大家双击后可看到其中有很多例子的运行结果。
2. 环境配置笔者的开发环境如下:JDK:1.6MyEclipse:6.6Tomcat:6.0.18为了后续的“用JFreeChart创建基于Web的图表”的一个例子的展示,我们在MyEclipse中创建一个名为jfreechart的Web工程。
将下载的JFreeChart1.0.14下lib目录下的jar包拷贝到WebRoot/WEB-INF/lib目录下。
另外还需要在web.xml文件中增加如下配置:<servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/DisplayChart</url-pattern></servlet-mapping>参数介绍利用JF reeC ha rt插件生成动态统计图表的基本步骤如下:1.准备绘图时需要的相关属性2.创建Datas et对象3.创建JF reeC ha rt实例4.生成自定格式的图片J F r e e C h a r t核心简介:JF r e e Char t:图表对象。
JFreeChart支持的图表类型总结JFreeChart类:void setAntiAlias(boolean flag) 字体模糊边界void setBackgroundImage(Image image) 背景图片void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundImageAlpha(float alpha) 背景图片透明度(0.0~1.0)void setBackgroundPaint(Paint paint) 背景色void setBorderPaint(Paint paint) 边界线条颜色void setBorderStroke(Stroke stroke) 边界线条笔触void setBorderVisible(boolean visible) 边界线条是否可见-----------------------------------------------------------------------------------------------------------TextTitle类:void setFont(Font font) 标题字体void setPaint(Paint paint) 标题字体颜色void setText(String text) 标题内容-----------------------------------------------------------------------------------------------------------StandardLegend(Legend)类:void setBackgroundPaint(Paint paint) 图示背景色void setTitle(String title) 图示标题内容void setTitleFont(Font font) 图示标题字体void setBoundingBoxArcWidth(int arcWidth) 图示边界圆角宽void setBoundingBoxArcHeight(int arcHeight) 图示边界圆角高void setOutlinePaint(Paint paint) 图示边界线条颜色void setOutlineStroke(Stroke stroke) 图示边界线条笔触void setDisplaySeriesLines(boolean flag) 图示项是否显示横线(折线图有效)void setDisplaySeriesShapes(boolean flag) 图示项是否显示形状(折线图有效)void setItemFont(Font font) 图示项字体void setItemPaint(Paint paint) 图示项字体颜色void setAnchor(int anchor) 图示在图表中的显示位置(参数常量在Legend类中定义)-----------------------------------------------------------------------------------------------------------Axis类:void setVisible(boolean flag) 坐标轴是否可见void setAxisLinePaint(Paint paint) 坐标轴线条颜色(3D轴无效)void setAxisLineStroke(Stroke stroke) 坐标轴线条笔触(3D轴无效)void setAxisLineVisible(boolean visible) 坐标轴线条是否可见(3D轴无效)void setFixedDimension(double dimension) (用于复合表中对多坐标轴的设置)void setLabel(String label) 坐标轴标题void setLabelFont(Font font) 坐标轴标题字体void setLabelPaint(Paint paint) 坐标轴标题颜色void setLabelAngle(double angle)` 坐标轴标题旋转角度(纵坐标可以旋转)void setTickLabelFont(Font font) 坐标轴标尺值字体void setTickLabelPaint(Paint paint) 坐标轴标尺值颜色void setTickLabelsVisible(boolean flag) 坐标轴标尺值是否显示void setTickMarkPaint(Paint paint) 坐标轴标尺颜色void setTickMarkStroke(Stroke stroke) 坐标轴标尺笔触void setTickMarksVisible(boolean flag) 坐标轴标尺是否显示ValueAxis(Axis)类:void setAutoRange(boolean auto) 自动设置数据轴数据范围void setAutoRangeMinimumSize(double size) 自动设置数据轴数据范围时数据范围的最小跨度void setAutoTickUnitSelection(boolean flag) 数据轴的数据标签是否自动确定(默认为true)void setFixedAutoRange(double length) 数据轴固定数据范围(设置100的话就是显示MAXVALUE到MAXVALUE-100那段数据范围)void setInverted(boolean flag) 数据轴是否反向(默认为false)void setLowerMargin(double margin) 数据轴下(左)边距void setUpperMargin(double margin) 数据轴上(右)边距void setLowerBound(double min) 数据轴上的显示最小值void setUpperBound(double max) 数据轴上的显示最大值void setPositiveArrowVisible(boolean visible) 是否显示正向箭头(3D轴无效)void setNegativeArrowVisible(boolean visible) 是否显示反向箭头(3D轴无效)void setVerticalTickLabels(boolean flag) 数据轴数据标签是否旋转到垂直void setStandardTickUnits(TickUnitSource source) 数据轴的数据标签(可以只显示整数标签,需要将AutoTickUnitSelection设false)NumberAxis(ValueAxis)类:void setAutoRangeIncludesZero(boolean flag) 是否强制在自动选择的数据范围中包含0void setAutoRangeStickyZero(boolean flag) 是否强制在整个数据轴中包含0,即使0不在数据范围中void setNumberFormatOverride(NumberFormat formatter) 数据轴数据标签的显示格式void setTickUnit(NumberTickUnit unit) 数据轴的数据标签(需要将AutoTickUnitSelection设false)DateAxis(ValueAxis)类:void setMaximumDate(Date maximumDate) 日期轴上的最小日期void setMinimumDate(Date minimumDate) 日期轴上的最大日期void setRange(Date lower,Date upper) 日期轴范围void setDateFormatOverride(DateFormat formatter) 日期轴日期标签的显示格式void setTickUnit(DateTickUnit unit) 日期轴的日期标签(需要将AutoTickUnitSelection设false)void setTickMarkPosition(DateTickMarkPosition position) 日期标签位置(参数常量在org.jfree.chart.axis.DateTickMarkPosition类中定义)CategoryAxis(Axis)类:void setCategoryMargin(double margin) 分类轴边距void setLowerMargin(double margin) 分类轴下(左)边距void setUpperMargin(double margin) 分类轴上(右)边距void setVerticalCategoryLabels(boolean flag) 分类轴标题是否旋转到垂直void setMaxCategoryLabelWidthRatio(float ratio) 分类轴分类标签的最大宽度-----------------------------------------------------------------------------------------------------------Plot类:void setBackgroundImage(Image image) 数据区的背景图片void setBackgroundImageAlignment(int alignment) 数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义)void setBackgroundPaint(Paint paint) 数据区的背景图片背景色void setBackgroundAlpha(float alpha) 数据区的背景透明度(0.0~1.0)void setForegroundAlpha(float alpha) 数据区的前景透明度(0.0~1.0)void setDataAreaRatio(double ratio) 数据区占整个图表区的百分比void setOutLinePaint(Paint paint) 数据区的边界线条颜色void setOutLineStroke(Stroke stroke) 数据区的边界线条笔触void setNoDataMessage(String message) 没有数据时显示的消息void setNoDataMessageFont(Font font) 没有数据时显示的消息字体void setNoDataMessagePaint(Paint paint) 没有数据时显示的消息颜色CategoryPlot(Plot)类:void setDataset(CategoryDataset dataset) 数据区的2维数据表void setColumnRenderingOrder(SortOrder order) 数据分类的排序方式void setAxisOffset(Spacer offset) 坐标轴到数据区的间距void setOrientation(PlotOrientation orientation) 数据区的方向(PlotOrientation.HORIZONTAL或PlotOrientation.VERTICAL)void setDomainAxis(CategoryAxis axis) 数据区的分类轴void setDomainAxisLocation(AxisLocation location) 分类轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setDomainGridlinesVisible(boolean visible) 分类轴网格是否可见void setDomainGridlinePaint(Paint paint) 分类轴网格线条颜色void setDomainGridlineStroke(Stroke stroke) 分类轴网格线条笔触void setRangeAxis(ValueAxis axis) 数据区的数据轴void setRangeAxisLocation(AxisLocation location) 数据轴的位置(参数常量在org.jfree.chart.axis.AxisLocation类中定义)void setRangeGridlinesVisible(boolean visible) 数据轴网格是否可见void setRangeGridlinePaint(Paint paint) 数据轴网格线条颜色void setRangeGridlineStroke(Stroke stroke) 数据轴网格线条笔触void setRenderer(CategoryItemRenderer renderer) 数据区的表示者(详见Renderer组)void addAnnotation(CategoryAnnotation annotation) 给数据区加一个注释void addRangeMarker(Marker marker,Layer layer) 给数据区加一个数值范围区域PiePlot(Plot)类:void setDataset(PieDataset dataset) 数据区的1维数据表void setIgnoreNullValues(boolean flag) 忽略无值的分类void setCircular(boolean flag) 饼图是否一定是正圆void setStartAngle(double angle) 饼图的初始角度void setDirection(Rotation direction) 饼图的旋转方向void setExplodePercent(int section,double percent) 抽取的那块(1维数据表的分类下标)以及抽取出来的距离(0.0~1.0),3D饼图无效void setLabelBackgroundPaint(Paint paint) 分类标签的底色void setLabelFont(Font font) 分类标签的字体void setLabelPaint(Paint paint) 分类标签的字体颜色void setLabelLinkMargin(double margin) 分类标签与图的连接线边距void setLabelLinkPaint(Paint paint) 分类标签与图的连接线颜色void setLabelLinkStroke(Stroke stroke) 分类标签与图的连接线笔触void setLabelOutlinePaint(Paint paint) 分类标签边框颜色void setLabelOutlineStroke(Paint paint) 分类标签边框笔触void setLabelShadowPaint(Paint paint) 分类标签阴影颜色void setMaximumLabelWidth(double width) 分类标签的最大长度(0.0~1.0)void setPieIndex(int index) 饼图的索引(复合饼图中用到)void setSectionOutlinePaint(int section,Paint paint) 指定分类饼的边框颜色void setSectionOutlineStroke(int section,Stroke stroke) 指定分类饼的边框笔触void setSectionPaint(int section,Paint paint) 指定分类饼的颜色void setShadowPaint(Paint paint) 饼图的阴影颜色void setShadowXOffset(double offset) 饼图的阴影相对图的水平偏移void setShadowYOffset(double offset) 饼图的阴影相对图的垂直偏移void setLabelGenerator(PieSectionLabelGenerator generator) 分类标签的格式,设置成null则整个标签包括连接线都不显示void setToolTipGenerator(PieToolTipGenerator generator) MAP中鼠标移上的显示格式void setURLGenerator(PieURLGenerator generator) MAP中钻取链接格式PiePlot3D(PiePlot)类:void setDepthFactor(double factor) 3D饼图的Z轴高度(0.0~1.0)MultiplePiePlot(Plot)类:void setLimit(double limit) 每个饼图之间的数据关联(详细比较复杂)void setPieChart(JFreeChart pieChart) 每个饼图的显示方式(见JFreeChart类个PiePlot类)-----------------------------------------------------------------------------------------------------------AbstractRenderer类:void setItemLabelAnchorOffset(double offset) 数据标签的与数据点的偏移void setItemLabelsVisible(boolean visible) 数据标签是否可见void setItemLabelFont(Font font) 数据标签的字体void setItemLabelPaint(Paint paint) 数据标签的字体颜色void setItemLabelPosition(ItemLabelPosition position) 数据标签位置void setPositiveItemLabelPosition(ItemLabelPosition position) 正数标签位置void setNegativeItemLabelPosition(ItemLabelPosition position) 负数标签位置void setOutLinePaint(Paint paint) 图形边框的线条颜色void setOutLineStroke(Stroke stroke) 图形边框的线条笔触void setPaint(Paint paint) 所有分类图形的颜色void setShape(Shape shape) 所有分类图形的形状(如折线图的点)void setStroke(Stroke stroke) 所有分类图形的笔触(如折线图的线)void setSeriesItemLabelsVisible(int series,boolean visible) 指定分类的数据标签是否可见void setSeriesItemLabelFont(int series,Font font) 指定分类的数据标签的字体void setSeriesItemLabelPaint(int series,Paint paint) 指定分类的数据标签的字体颜色void setSeriesItemLabelPosition(int series,ItemLabelPosition position) 数据标签位置void setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正数标签位置void setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 负数标签位置void setSeriesOutLinePaint(int series,Paint paint) 指定分类的图形边框的线条颜色void setSeriesOutLineStroke(int series,Stroke stroke) 指定分类的图形边框的线条笔触void setSeriesPaint(int series,Paint paint) 指定分类图形的颜色void setSeriesShape(int series,Shape shape) 指定分类图形的形状(如折线图的点)void setSeriesStroke(int series,Stroke stroke) 指定分类图形的笔触(如折线图的线)AbstractCategoryItemRenderer(AbstractRenderer)类:void setLabelGenerator(CategoryLabelGenerator generator) 数据标签的格式void setToolTipGenerator(CategoryToolTipGenerator generator) MAP中鼠标移上的显示格式void setItemURLGenerator(CategoryURLGenerator generator) MAP中钻取链接格式void setSeriesLabelGenerator(int series,CategoryLabelGenerator generator) 指定分类的数据标签的格式void setSeriesToolTipGenerator(int series,CategoryToolTipGenerator generator) 指定分类的MAP中鼠标移上的显示格式void setSeriesItemURLGenerator(int series,CategoryURLGenerator generator) 指定分类的MAP中钻取链接格式BarRenderer(AbstractCategoryItemRenderer)类:void setDrawBarOutline(boolean draw) 是否画图形边框void setItemMargin(double percent) 每个BAR之间的间隔void setMaxBarWidth(double percent) 每个BAR的最大宽度void setMinimumBarLength(double min) 最短的BAR长度,避免数值太小而显示不出void setPositiveItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的正数标签位置void setNegativeItemLabelPositionFallback(ItemLabelPosition position) 无法在BAR中显示的负数标签位置BarRenderer3D(BarRenderer)类:void setWallPaint(Paint paint) 3D坐标轴的墙体颜色StackedBarRenderer(BarRenderer)类:没有特殊的设置StackedBarRenderer3D(BarRenderer3D)类:没有特殊的设置GroupedStackedBarRenderer(StackedBarRenderer)类:void setSeriesToGroupMap(KeyToGroupMap map) 将分类自由的映射成若干个组(KeyToGroupMap.mapKeyToGroup(series,group))LayeredBarRenderer(BarRenderer)类:void setSeriesBarWidth(int series,double width) 设定每个分类的宽度(注意设置不要使某分类被覆盖)WaterfallBarRenderer(BarRenderer)类:void setFirstBarPaint(Paint paint) 第一个柱图的颜色void setLastBarPaint(Paint paint) 最后一个柱图的颜色void setPositiveBarPaint(Paint paint) 正值柱图的颜色void setNegativeBarPaint(Paint paint) 负值柱图的颜色IntervalBarRenderer(BarRenderer)类:需要传IntervalCategoryDataset作为数据源GanttBarRenderer(IntervalBarRenderer)类:void setCompletePaint(Paint paint) 完成进度颜色void setIncompletePaint(Paint paint) 未完成进度颜色void setStartPercent(double percent) 设置进度条在整条中的起始位置(0.0~1.0)void setEndPercent(double percent) 设置进度条在整条中的结束位置(0.0~1.0)StatisticBarRenderer(BarRenderer)类:需要传StatisticCategoryDataset作为数据源LineAndShapeRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean draw) 是否折线的数据点之间用线连void setDrawShapes(boolean draw) 是否折线的数据点根据分类使用不同的形状void setShapesFilled(boolean filled) 所有分类是否填充数据点图形void setSeriesShapesFilled(int series,boolean filled) 指定分类是否填充数据点图形void setUseFillPaintForShapeOutline(boolean use) 指定是否填充数据点的Paint也被用于画数据点形状的边框LevelRenderer(AbstractCategoryItemRenderer)类:void setItemMargin(double percent) 每个分类之间的间隔void setMaxItemWidth(double percent) 每个分类的最大宽度CategoryStepRenderer(AbstractCategoryItemRenderer)类:void setStagger(boolean shouldStagger) 不同分类的图是否交错MinMaxCategoryRenderer(AbstractCategoryItemRenderer)类:void setDrawLines(boolean drawLines) 是否在每个分类线间画连接线void setGroupPaint(Paint groupPaint) 一组图形连接线的颜色void setGroupStroke(Stroke groupStroke) 一组图形连接线的笔触void setMaxIcon(Icon maxIcon) 最大值的ICONvoid setMinIcon(Icon minIcon) 最小值的ICONvoid setObjectIcon(Icon objectIcon) 所有值的ICONAreaRender(AbstractCategoryItemRenderer)类:没有特殊的设置StackedAreaRender(AreaRender)类:没有特殊的设置。
JFreeChart折线图的⽣成⽅法JFreeChart是JAVA平台上的⼀个开放的图表绘制类库。
它完全使⽤JAVA语⾔编写,是为applications, applets, servlets 以及JSP等使⽤所设计。
JFreeChart可⽣成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、⽢特图(Gantt charts)等等多种图表,并且可以产⽣PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。
折线图的实例package com.sprite.test;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import bels.StandardCategoryItemLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.data.category.CategoryDataset;import org.jfree.data.general.DatasetUtilities;//JFreeChart Line Chart(折线图)public class TestJFreeChart {/*** 创建JFreeChart Line Chart(折线图)*/public static void main(String[] args) {// 步骤1:创建CategoryDataset对象(准备数据)CategoryDataset dataset = createDataset();// 步骤2:根据Dataset ⽣成JFreeChart对象,以及做相应的设置JFreeChart freeChart = createChart(dataset);// 步骤3:将JFreeChart对象输出到⽂件,Servlet输出流等saveAsFile(freeChart, "E:\\line.jpg", 600, 400);}// 保存为⽂件public static void saveAsFile(JFreeChart chart, String outputPath,int weight, int height) {FileOutputStream out = null;try {File outFile = new File(outputPath);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}out = new FileOutputStream(outputPath);// 保存为PNG// ChartUtilities.writeChartAsPNG(out, chart, 600, 400);// 保存为JPEGChartUtilities.writeChartAsJPEG(out, chart, 600, 400);out.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {// do nothing}}}}// 根据CategoryDataset创建JFreeChart对象public static JFreeChart createChart(CategoryDataset categoryDataset) {// 创建JFreeChart对象:ChartFactory.createLineChartJFreeChart jfreechart = ChartFactory.createLineChart("不同类别按⼩时计算拆线图", // 标题"年分", // categoryAxisLabel (category轴,横轴,X轴标签)"数量", // valueAxisLabel(value轴,纵轴,Y轴的标签)categoryDataset, // datasetPlotOrientation.VERTICAL, true, // legendfalse, // tooltipsfalse); // URLs// 使⽤CategoryPlot设置各种参数。
各类统计程序实现杨方 531115121 矢量图的生成矢量统计图,即是以矢量图形格式生成、存在和输出的统计图。
这种统计图图形要素丰富、交互编辑简单、存储格式多样,打印输出方便,是GIS应用系统最优先选择的统计图。
最常用的三类矢量统计图是直方图、曲线图、饼图。
矢量统计图的生成,首先要将数据组织为一定的格式,然后进行图形参数的计算和设置,再生成图形,最后进行浏览显示或者保存输出。
当然,如果对生成的图形不满意,可以进行参数修改,然后重新生成,最后再显示或保存。
1.1 数据组织原始数据可以整理为二维表格的形式,通过文件(*.txt,*.xls,*.doc)导入,也可以将数据整理为二维数组的形式输入。
统计图只支持为数值型的数据,包括整型、长整型、浮点型和双精度型等4种数据类型。
1.2 设置参数图形参数可以由用户外部输入,也可以根据数据生成默认参数,分为基本参数、坐标参数、图例参数和数据参数等。
(1)基本参数包括图形类型,图形名称,图形范围,点、线、区参数等。
(2)坐标轴参数包括是否绘制轴线、刻度线、标注、网格线的标志,刻度数,颜色,名称,比例尺,以及是否绘制包围盒或箭头的标志。
(3)图例参数包括是否绘制图例的标志和图例显示位置标志。
(4)数据参数包括数据类型,是否绘制数据表的标志,图形单元的宽度或间隔、图形单元的颜色,系列和类别显示标志等。
1.3 图形生成生成图形的基本步骤如下:(1)确认存在点、线、面工作区。
生成的图形要暂时存入工作区中,然后才能进行显示或保存。
点线面工作区可以由外部输入,也可以在软件中生成。
(2)确认各项图形参数有效。
必须保证每项图形参数都有效,否则软件将出错。
对于没有设置有效值的参数,要重新设置默认参数。
(3)依次生成图形的各个要素:生成坐标轴、生成图形主体、生成数据表、生成图例和生成图形。
在生成统计图的过程中,要随时计算图形的当前范围,以控制后续元素的位置。
1.4 图形显示统计图生成后,保存在MAPGIS的点线面工作区中,可以调用MAPGIS的图形显示视图进行显示。
java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1. jfreec hart-1.0.13.jar2. jcommo n-1.0.16.jar3. gnujax p.jar先来看一下,最终效果图:主要是jfr eecha rt-1.0.13.jar,但这三个包要齐全,我已经将所有与jfre echar t有关的j ar包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载,下载地址:http://downlo /detail/pzhtpf/4327700接下来,我们一步步来实现本程序。
一,前期准备工作,也就把这三个第三方包添加进本文工程,添加过程特别简单,前面写过一篇博客,讲的是jav a如何读取Excel表格中的数据(有兴趣的同学可以看一看:/pzhtpf/articl e/detail s/7506135),也要添加第三方包,添加过程一模一样,这里我们在复习一遍:1,建,立java项目,在这个项目在建立一个新的文件夹l i b;2,将上述三个jar包,复制到lib3,然后右键点击这个jav a项目,选择Prop ertie s4,在左侧列表里选中Jav a BuildPath,右侧选中Li brari es5,点击AddJARs6,然后去选择这个项目中lib文件夹中的三个jar,点击确定成功后,项目中会多一个文件夹为:Refere ncedLibrar ies二,实现柱形图的java代码:import java.awt.Font;import org.jfree.chart.ChartF actor y;import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.axis.Catego ryAxi s;import org.jfree.chart.axis.ValueA xis;import org.jfree.chart.plot.Catego ryPlo t;import org.jfree.chart.plot.PlotOr ienta tion;import org.jfree.data.catego ry.Catego ryDat aset;import org.jfree.data.catego ry.Defaul tCate goryD atase t;public classBarCha rt {ChartP anelframe1;public BarCha rt(){Catego ryDat asetdatase t = getDat aSet();JFreeC hartchart= ChartF actor y.create BarCh art3D("水果", // 图表标题"水果种类", // 目录轴的显示标签"数量", // 数值轴的显示标签datase t, // 数据集PlotOr ienta tion.VERTIC AL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成UR L链接);//从这里开始Catego ryPlo t plot=chart.getCat egory Plot();//获取图表区域对象Catego ryAxi s domain Axis=plot.getDom ainAx is(); //水平底部列表domain Axis.setLab elFon t(new Font("黑体",Font.BOLD,14)); //水平底部标题domain Axis.setTic kLabe lFont(new Font("宋体",Font.BOLD,12)); //垂直标题ValueA xis rangeA xis=plot.getRan geAxi s();//获取柱状rangeA xis.setLab elFon t(new Font("黑体",Font.BOLD,15));chart.getLeg end().setIte mFont(new Font("黑体", Font.BOLD, 15));chart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体//到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题frame1=new ChartP anel(chart,true); //这里也可以用chart Frame,可以直接生成一个独立的Frame}privat e static Catego ryDat asetgetDat aSet() {Defaul tCate goryD atase t datase t = new Defaul tCate goryD atase t();datase t.addVal ue(100, "北京", "苹果");datase t.addVal ue(100, "上海", "苹果");datase t.addVal ue(100, "广州", "苹果");datase t.addVal ue(200, "北京", "梨子");datase t.addVal ue(200, "上海", "梨子");datase t.addVal ue(200, "广州", "梨子"); datase t.addVal ue(300, "北京", "葡萄"); datase t.addVal ue(300, "上海", "葡萄"); datase t.addVal ue(300, "广州", "葡萄"); datase t.addVal ue(400, "北京", "香蕉"); datase t.addVal ue(400, "上海", "香蕉"); datase t.addVal ue(400, "广州", "香蕉"); datase t.addVal ue(500, "北京", "荔枝"); datase t.addVal ue(500, "上海", "荔枝"); datase t.addVal ue(500, "广州", "荔枝"); return datase t;}public ChartP anelgetCha rtPan el(){return frame1;}}效果图如下:但我们把pr ivate static Catego ryDat asetgetDat aSet(){}方法中的数据变化一下后,又会形成另一种效果,比如说我们改成:privat e static Catego ryDat asetgetDat aSet() {Defaul tCate goryD atase t datase t = new Defaul tCate goryD atase t(); datase t.addVal ue(100, "苹果", "苹果");datase t.addVal ue(200, "梨子", "梨子");datase t.addVal ue(300, "葡萄", "葡萄");datase t.addVal ue(400, "香蕉", "香蕉");datase t.addVal ue(500, "荔枝", "荔枝");return datase t;}效果图如下:三,实现饼状图的java代码:packag e com.njue.testJF reeCh art;import java.awt.Font;import java.text.Decima lForm at; import java.text.Number Forma t;import javax.swing.JPanel;import org.jfree.chart.ChartF actor y;import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.labels.Standa rdPie Secti onLab elGen erato r;import org.jfree.chart.plot.PiePlo t;import org.jfree.data.genera l.Defaul tPieD atase t;public classPieCha rt {ChartP anelframe1;public PieCha rt(){Defaul tPieD atase t data = getDat aSet();JFreeC hartchart= ChartF actor y.create PieCh art3D("水果产量",data,true,false,false);//设置百分比PiePlo t pieplo t = (PiePlo t) chart.getPlo t();Decima lForm at df = new Decima lForm at("0.00%");//获得一个De cimal Forma t对象,主要是设置小数问题Number Forma t nf = Number Forma t.getNum berIn stanc e();//获得一个Nu mberF ormat对象Standa rdPie Secti onLab elGen erato r sp1 = newStanda rdPie Secti onLab elGen erato r("{0} {2}", nf, df);//获得Stan dardP ieSec tionL abelG enera tor对象pieplo t.setLab elGen erato r(sp1);//设置饼图显示百分比//没有数据的时候显示的内容pieplo t.setNoD ataMe ssage("无数据显示");pieplo t.setCir cular(false);pieplo t.setLab elGap(0.02D);pieplo t.setIgn oreNu llVal ues(true);//设置不显示空值pieplo t.setIgn oreZe roVal ues(true);//设置不显示负值frame1=new ChartP anel(chart,true);chart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体PiePlo t piePlo t= (PiePlo t) chart.getPlo t();//获取图表区域对象packag e com.njue.testJF reeCh art;import java.awt.Font;import java.text.Simple DateF ormat;import org.jfree.chart.ChartF actor y; import org.jfree.chart.ChartP anel;import org.jfree.chart.JFreeC hart;import org.jfree.chart.axis.DateAx is; import org.jfree.chart.axis.ValueA xis;import org.jfree.chart.plot.XYPlot;import org.jfree.data.time.Month;import org.jfree.data.time.TimeSe ries;import org.jfree.data.time.TimeSe riesC ollec tion;import org.jfree.data.xy.XYData set;public classTimeSe riesC hart{ChartP anelframe1;public TimeSe riesC hart(){XYData set xydata set = create Datas et();JFreeC hartjfreec hart=ChartF actor y.create TimeS eries Chart("Legal& Genera l单位信托基金价格", "日期", "价格",xydata set, true, true, true);XYPlot xyplot = (XYPlot) jfreec hart.getPlo t();DateAx is dateax is = (DateAx is) xyplot.getDom ainAx is();dateax is.setDat eForm atOve rride(new Simple DateF ormat("MMM-yyyy"));frame1=new ChartP anel(jfreec hart,true);dateax is.setLab elFon t(new Font("黑体",Font.BOLD,14)); //水平底部标题dateax is.setTic kLabe lFont(new Font("宋体",Font.BOLD,12)); //垂直标题 ValueA xis rangeA xis=xyplot.getRan geAxi s();//获取柱状rangeA xis.setLab elFon t(new Font("黑体",Font.BOLD,15));jfreec hart.getLeg end().setIte mFont(new Font("黑体", Font.BOLD, 15)); jfreec hart.getTit le().setFon t(new Font("宋体",Font.BOLD,20));//设置标题字体}privat e static XYData set create Datas et() { //这个数据集有点多,但都不难理解TimeSe riestimese ries= new TimeSe ries("legal& genera l欧洲指数信任",org.jfree.data.time.Month.class);timese ries.add(new Month(2, 2001), 181.80000000000001D);timese ries.add(new Month(3, 2001), 167.30000000000001D);timese ries.add(new Month(4, 2001), 153.80000000000001D);timese ries.add(new Month(5, 2001), 167.59999999999999D);timese ries.add(new Month(6, 2001), 158.80000000000001D);timese ries.add(new Month(7, 2001), 148.30000000000001D);timese ries.add(new Month(8, 2001), 153.90000000000001D);timese ries.add(new Month(9, 2001), 142.69999999999999D);timese ries.add(new Month(10, 2001), 123.2D);timese ries.add(new Month(11, 2001), 131.80000000000001D);timese ries.add(new Month(12, 2001), 139.59999999999999D);timese ries.add(new Month(1, 2002), 142.90000000000001D);timese ries.add(new Month(2, 2002), 138.69999999999999D);timese ries.add(new Month(3, 2002), 137.30000000000001D);timese ries.add(new Month(4, 2002), 143.90000000000001D);timese ries.add(new Month(5, 2002), 139.80000000000001D);timese ries.add(new Month(6, 2002), 137D);timese ries.add(new Month(7, 2002), 132.80000000000001D);TimeSe riestimese ries1 = new TimeSe ries("legal& genera l英国指数信任",org.jfree.data.time.Month.class);timese ries1.add(new Month(2, 2001), 129.59999999999999D);timese ries1.add(new Month(3, 2001), 123.2D);timese ries1.add(new Month(4, 2001), 117.2D);timese ries1.add(new Month(5, 2001), 124.09999999999999D);timese ries1.add(new Month(6, 2001), 122.59999999999999D);timese ries1.add(new Month(7, 2001), 119.2D);timese ries1.add(new Month(8, 2001), 116.5D);timese ries1.add(new Month(9, 2001), 112.7D);timese ries1.add(new Month(10, 2001), 101.5D);timese ries1.add(new Month(11, 2001), 106.09999999999999D);timese ries1.add(new Month(12, 2001), 110.3D);timese ries1.add(new Month(1, 2002), 111.7D);timese ries1.add(new Month(2, 2002), 111D);timese ries1.add(new Month(3, 2002), 109.59999999999999D);timese ries1.add(new Month(4, 2002), 113.2D);timese ries1.add(new Month(5, 2002), 111.59999999999999D);timese ries1.add(new Month(6, 2002), 108.8D);timese ries1.add(new Month(7, 2002), 101.59999999999999D);TimeSe riesC ollec tiontimese riesc ollec tion= newTimeSe riesC ollec tion();timese riesc ollec tion.addSer ies(timese ries);timese riesc ollec tion.addSer ies(timese ries1);return timese riesc ollec tion;}public ChartP anelgetCha rtPan el(){return frame1;}}效果图如下:再来看一下主方法:import java.awt.GridLa yout;import javax.swing.JFrame;public classmainCl ass {public static void main(String args[]){JFrame frame=new JFrame("Java数据统计图");frame.setLay out(new GridLa yout(2,2,10,10));frame.add(new BarCha rt().getCha rtPan el()); //添加柱形图frame.add(new BarCha rt1().getCha rtPan el()); //添加柱形图的另一种效果frame.add(new PieCha rt().getCha rtPan el()); //添加饼状图frame.add(new TimeSe riesC hart().getCha rtPan el()); //添加折线图frame.setBou nds(50, 50, 800, 600);frame.setVis ible(true);}}五,总结以上都是一个简单的例子去实现了,想了解更深的同学可自行查询资料,其实以上代码都通俗易懂,只要结合自己的实际情况,便可开发出属于自己的A pplic ation,大家可以看出我这里是在Appli catio n上实现的,其实更多情况数据统计图在java web上应用更多,大家也可自行了解。
jfreechart+sql实现时间曲线图(显示曲线数据点)一、JFreeChart获取。
JFreeChart是JFreeChart公司在开源网站上的一个项目,该公司的主要产品有如下:1、JFreeReport:报表解决工具2、JFreeChart:Java图形解决方案(Application/Applet/Servlet/Jsp)3、JCommon:JFreeReport和JFreeChart的公共类库4、JFreeDesigner:JFreeReport的报表设计工具我们可以从jfree官方网站上获取最新版本和相关资料(但是jfree的document需要40美金才能获取),获取地址:/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.jar3、如果是Application开发,把上述三个文件拷贝到%JAVA_HOME%\LIB中,同时在环境变量CLASSPATH中加入如果是WEB开发,以TOMCAT中的一个WEB项目TEST为例子说明:把上述三个文件拷贝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代码:<servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-cl ass></servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/servlet/DisplayChart</url-pattern></servlet-mapping>至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。
这里值得提出的是jfreechart的类结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。
如果是中文显示的时候可能依据观感需要改变源码的字体,不过我个人觉得这个版本比以前版本要好一些。
三、Demo<%@ page contentType="text/html;charset=GBK"%><%@ page import =" java.awt.*,java.text.SimpleDateFormat,javax.swing.JPanel,org.jfree.chart.ChartFactory,org.jfree.chart.ChartPanel,org.jfree.chart.JFreeChart,org.jfree.chart.axis.DateAxis,org.jfree.chart.plot.XYPlot,org.jfree.chart.renderer.xy.XYItemRenderer,org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,org.jfree.data.time.*,org.jfree.data.time.TimeSeries,org.jfree.data.time.TimeSeriesCollection,org.jfree.data.xy.XYDataset"%><%@ page import="org.jfree.chart.servlet.ServletUtilities"%><%@ page import="java.util.*"%><%@ page import = "org.jfree.ui.RectangleInsets"%><%@ page import = "java.sql.*"%><%//连接数据库Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jfree";String usr="sa";String pwd="";Connection conn=DriverManager.getConnection(url,usr,pwd);Statement stmt=conn.createStatement();String sql="select * from jfree order by id";ResultSet rs=stmt.executeQuery(sql);//设置曲线,共三条曲线TimeSeries timeseries = new TimeSeries("平均",Minute.class);//时间的最小单位为分,线值名是“平均”TimeSeries timeseries1 = new TimeSeries("usl",Minute.class);TimeSeries timeseries2 = new TimeSeries("lsl",Minute.class);//从数据库中取值,数据和时间while(rs.next()){float y0=rs.getFloat("lengthavg");float y1=rs.getFloat("lengthusl");float y2=rs.getFloat("lengthlsl");String s=rs.getString("addtime");//从yyyyMMddHHmm时间格式的char中取出年月日小时分设为int值int x=Integer.parseInt(s.substring(0,4));int y=Integer.parseInt(s.substring(4,6));int z=Integer.parseInt(s.substring(6,8));int a=Integer.parseInt(s.substring(8,10));int b=Integer.parseInt(s.substring(10,12));timeseries.add(new Minute(b,new Hour(a,new Day(z,y,x))),y0);timeseries1.add(new Minute(b,new Hour(a,new Day(z,y,x))),y1);timeseries2.add(new Minute(b,new Hour(a,new Day(z,y,x))),y2);}//连接曲线TimeSeriesCollection dataset = new TimeSeriesCollection();dataset.addSeries(timeseries);dataset.addSeries(timeseries1);dataset.addSeries(timeseries2);dataset.setDomainIsPointsInTime(true);//设置曲线图XYDataset xydataset = (XYDataset) dataset;JFreeChart chart = ChartFactory.createTimeSeriesChart("走势图","时间","值",xydataset,true,true,true);chart.setBackgroundPaint(Color.white);//设置曲线图背景色XYPlot plot = (XYPlot) chart.getPlot();XYLineAndShapeRenderer xylineandshaperenderer =(XYLineAndShapeRenderer)plot.getRenderer();plot.setBackgroundPaint(Color.white));//设置网格背景颜色plot.setDomainGridlinePaint(Color.pink);//设置网格竖线颜色plot.setRangeGridlinePaint(Color.pink);//设置网格横线颜色plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));//设置曲线图与xy轴的距离xylineandshaperenderer.setBaseShapesVisible(true);//设置曲线是否显示数据点String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;%><img src="<%= graphURL %>" border=0 usemap="#<%= filename %>">另外说一下,以前看到有很多人都说不能显示图,出来一个叉,一般那都是设置的servlet的错,我看到有的人就是用设置为servlets的所以就要在String graphURL = request.getContextPath() +"/servlet/DisplayChart?filename=" + filename;中改为String graphURL = request.getContextPath() + "/servlets /DisplayChart?filename=" + filename;的这个都要具体对待,出来叉的话有一点是肯定的,程序代码中没有程序错误,只是路径错误而已。