JFreeChart生成折线图并保存为图片
JSP动态图表
JSP动态图表JFreeChart是一个Java开源项目,是一款优秀的Java图表生成插件,它提供了在Java Application、Servlet和JSP下生成各种图片格式的图表,包括柱形图、饼形图、线图、区域图、时序图和多轴图等。
1 JFreeChart的下载与使用在JFreeChart的官方网站(/jfreechart/index.html)上可以下载到该插件,该插件有两个版本:●jfreechart-1.0.13.zip,该版本适用于Windows系统;●jfreechart-1.0.13.tar.gz,该版本适用于UNIX/Linux系统。
解压缩jfreechart-1.0.13.zip后将得到一个名为jfreechart-1.0.13的文件夹,只需将lib子文件夹内的jfreechart-1.0.13.jar和jcommon-1.0.16.jar两个文件拷贝到Web 应用程序的WEB-INF下的lib文件夹内,并且在该Web应用程序的web.xml文件2 JFreeChart的核心类在使用JFreeChart组件之前,首先应该了解该组件的核心类及其功能。
JFreeChart核心类如表8-1所示。
表8-1 JFreeChart核心类表中给出的各对象的关系如下:JFreeChart中的图表对象用JFreeChart对象表示,图表对象由Title(标题或子标题)、Plot(图表的绘制结构)、BackGround(图表背景)、toolstip(图表提示条)等几个主要的对象组成。
其中Plot对象又包括了Render(图表的绘制单元——绘图域)、Dataset(图表数据源)、domainAxis(x轴)、rangeAxis(y轴)等一系列对象组成,而Axis(轴)是由更细小的刻度、标签、间距、刻度单位等一系列对象组成。
3 利用JFreeChart生成动态图表通过JFreeChart插件可以生成多种动态图表,包括柱形图、饼形图、折线图、区域图、时序图、多轴图和组合图等七种图表。
JFreeChart文档
JFREECHART学习总结目录一、JFreeChart简介 (2)二、JFreeChart的获取 (3)三、JFreeChart环境配置 (3)四、JFreeChart功能介绍 (5)五、JFreeChart核心类库介绍 (6)六、JFreeChart支持的图表介绍 (6)七、JFreeChart开发 (7)第一步:建立DataSet数据源 (8)第二步:创造JFreeChart (9)第三步:设置图形显示的属性 (10)第四步:写入图片或输出界面 (11)八、JFREECHART图片在web中的应用 (13)8.1在eclipse中创建tomcat工程 (14)8.2 创建web.xml (14)8.3 配置web.xml (15)8.4 创建含有JFreeChart图片的页面 (16)8.5 配置server.xml (22)8.6测试页面 (24)九、JFreeChart使用的优缺点 (25)1.优点: (25)2.缺点: (26)九、使用JfreeChart开发图表经验总结-------------------------25十、JFreeChart中文API (25)一、JFreeChart简介JFreeChart是开放源代码站点上的一个JA V A项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。
这些不同式样的图表基本上可以满足目前的要求。
当在项目中客户需要图标分析时,JFreeChart便是最好的选择,JFreeChart是开源项目,可以方便的从其官方网站上获得其源代码,可以方便的与Swing相结合使用,还可以导入到Web页面中,更是可以方便的利用其工厂方法将图表写入jpeg或者png格式的图片中,本文档将简要介绍小JFreeChart的使用。
二、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-1.0.12.zip为例子进行说明。
JFreeChart使用教程(中文)
用JFreeChart增强JSP报表的用户体验JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。
它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。
本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用,来达到熟练使用JFreeChart的目的。
一.下载与环境配置1. 下载JFreeChartJFreeChart是开放源代码的免费软件,但是它的支持文档需要付费才能得到。
其下载地址为:/project/showfiles.php?g roup_id=15494,当前最新版本为1.0.6。
笔者下载的是1.0.6最新版。
说明:1)source目录:为jfreechart的源码目录;2)lib目录:为包目录,我们需要关注的包为jfreechart-1.0.6.ja r、gnujaxp.jar和jcommon-1.0.10.jar这三个包;3)根目录下的jfreechart-1.0.6-demo.jar是例子程序,大家双击后可看到其中有很多例子的运行结果。
2. 环境配置笔者的开发环境如下:JDK:1.5MyEclipse:5.1.1 GATomcat:5.5.28为了后续的“用JFreeChart创建基于Web的图表”的一个例子的展示,我们在MyEclipse中创建一个名为jfreechart的Web工程。
将下载的JFreeChart1.0.6下lib目录下的jar包拷贝到WebRoot/WEB-INF/lib目录下。
另外还需要在web.xml文件中增加如下配置:<servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-clas s></servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/DisplayChart</url-pattern></servlet-mapping>二.柱状图在WebRoot目录下建立bar目录,用来存放柱状图的各个例子。
jfreechart生成图片乱码问题
关于JFreeChart形成图片的汉字乱码问题在形成图片的过程中一些文字设置问题,如下在形成柱形图、曲线图等汉字乱码(数据库返回或直接写在方法里面的)可能是如下原因:/**** 解决JFREECHART的中文显示问题下面代码中的几个变量:chart plot domainAxis rAxis所属对象如下JFreeChart chart;CategoryPlot plot = chart.getCategoryPlot();CategoryAxis domainAxis = plot.getDomainAxis();V alueAxis rAxis = plot.getRangeAxis();*** *//*----------设置消除字体的锯齿渲染(解决中文问题)--------------*/chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.V ALUE_TEXT_ANTIALIAS_OFF);/*----------设置标题字体--------------------------*/TextTitle textTitle = chart.getTitle();textTitle.setFont(new Font("黑体", Font.PLAIN, 20));/*------设置X轴坐标上的文字-----------*/domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));/*------设置X轴的标题文字------------*/domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));/*------设置Y轴坐标上的文字-----------*/rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));/*------设置Y轴的标题文字------------*/rAxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));chart.getLegend().setItemFont(new Font("宋体",Font.PLAIN,12));/*------这句代码解决了底部汉字乱码的问题-----------*//*---------设置柱状体上的显示的字体---------*/renderer.setItemLabelGenerator(new LabelGenerator(0.0));renderer.setItemLabelFont(new Font("宋体", Font.PLAIN, 12));renderer.setItemLabelsVisible(true);原因:jfreechart主要是用来动态产生各种数据图形的,可最初使用的时候大都会碰到图片中的中文乱码或是一个小方块的情况。
利用JfreeChart开发包绘制图表
作者 简介:王征强(97 ,湖北黄 冈人 ,邢台职业技术学院电子工程 系,北京航 空航天大学在读硕士。 17 一)
确 ,但 有着 不直 观 、不 易被 人脑所 理 解 的缺 点 。人们 从可 视化 图表 中吸 取信 息远 比从 数据 形式 中吸取 信 息 更快 、更 有效 ,更方便 。为 了提 供 更强 大 的信 息 ,这 就需要 我们 把统 计数 据进 行可 视化 ,为此把 统计
数据转化为可视化的图表显得尤为必要。本文使用当今计算机界最热门的语言 Jv 和 J eC a 开发包 aa f e hr r t
出各 种 复杂 、漂亮 的图表 。
在 目前广 泛 应用 的 BS结构 中 ,看看 如何 用 Jv 语言 实现 We / aa b统计 图表 。
使用 J a p l 显示图形,适用于支持 Jv A pe 的浏览器。缺点是开发难度较高,速度慢, a Apt v e aa p l t 需 要针 对 具体 的应用 要求 编制 Jv 图程序 。 aa绘
在 服 务器端 使用 控件动 态 生成 图形 文件 ,此 方法可 以适用于 任何 流行 的客户 端浏 览器 。基于 Jv aa 语言 的 Jre hr包 、PA(ueJV f C at e J P r aaAWT包 和 Jc Jv jc o c ne ) si(aaObetfr i c)包 ,这 几个都 是开放源 代 s Se
码的包,开发简单 ,使用方便 ,客户端无需安装其他软件 ,只要使用通用浏览器 即可显示统计图形。 各种控件虽然使用语言各不相 同, 但是使用方法大同小异。 大致步骤如下: . 1 首先创建一个图表对象;
2给 图表 的各个 属性 赋值 ,如 图表 的标题 、长 、宽 ,要 绘制什 么类 型 的图表等 ;3建 立数据 集 ,给 图表 中 . . 加 入数据 :4生成统 计 图形文 件 ;5把 图形文 件放 在合 适 的位 置上进 行显 示 。 . .
JFreeChartAPI中文文档
JFreeChartAPI中文文档JFreeChart目前是最好的java图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面: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)分类轴分类标签的最大宽度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长度,避免数值太小而显示不出voidsetPositiveItemLabelPositionFallback(ItemLabelPosition position)无法在BAR中显示的正数标签位置voidsetNegativeItemLabelPositionFallback(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(AbstractCategoryItemRender er)类: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)类:没有特殊的设置关键就是用好Renderer这个类了,再贴个例子:1.String sFont = "宋体";2.chart.setBorderVisible(true);3.chart.setBorderPaint(new Color(0xFF,0x66,0x00));4.chart.setBackgroundPaint(new Color(0xFF,0xF3,0xDE));5.chart.getTitle().setPaint(Color.red);6.chart.getTitle().setFont(new Font(sFont,Font.BOLD,14));7.8.//设置Plot,不显示所有网格9.((CategoryPlot)chart.getPlot()).setOutlinePaint(null);10.((CategoryPlot)chart.getPlot()).setDomainGridline sVisible(false);11.((CategoryPlot)chart.getPlot()).setRangeGridlines Visible(false);12.13.//设置横轴字体,设定横轴轴线不可见,隐藏纵轴14.((CategoryPlot)chart.getPlot()).getDomainAxis().se tTickLabelFont(new Font(sFont,Font.PLAIN,12));15.((CategoryPlot)chart.getPlot()).getDomainAxis().se tAxisLineVisible(false);16.((CategoryPlot)chart.getPlot()).getRangeAxis().set Visible(false);17.18.//采用BarRenderer作为表示器19.BarRenderer renderer = new BarRenderer();20.renderer.setPaint(new GradientPaint(0.0f,0.0f,Color .orange,0.0f,0.0f,Color.yellow));21.renderer.setOutlinePaint(Color.orange);22.renderer.setDrawBarOutline(true);23.24.//在条中央显示投票数值25.renderer.setItemLabelAnchorOffset(-20.0f);26.renderer.setLabelGenerator(new StandardCategor yLabelGenerator("{2}",new DecimalFormat()));27.renderer.setPositiveItemLabelPosition(new ItemLa belPosition());28.renderer.setItemLabelsVisible(true);pie charts (2D and 3D):饼图(平面和立体)bar charts (regular and stacked, with an optional 3D effect):柱状图line and area charts:曲线图scatter plots and bubble chartstime series, high/low/open/close charts and candle stick charts:时序图combination charts:复合图Pareto chartsGantt charts:甘特图wind plots, meter charts and symbol chartswafer map charts(态图表,饼图(二维和三维) , 柱状图(水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表) 图形可以导出成PNG和JPEG格式,同时还可以与PDF和EXCEL 关联JFreeChart核心类库介绍:研究jfreechart源码发现源码的主要由两个大的包组成:org.jfree.chart,org.jfree.data。
利用JFreeChart生成折线图
利用JFreeChart生成折线图通过JFreeChart插件,既可以生成普通效果的折线图,也可以生成3D效果的折线图。
如果想生成普通效果的折线图,需要通过工厂类ChartFactory的createLineChart()方法获得JFreeChart类的实例;如果想生成3D效果的折线图,需要通过工厂类ChartFactory的createLineChart3D()方法获得JFreeChart类的实例。
这两个方法的入口参数是完全相同的,各个入口参数的类型及功能请参见14.2.1节的表14.2。
可以分别通过绘图区对象CategoryPlot的getDomainAxis()方法和getRangeAxis()方法,获得横轴对象和纵轴对象,通过得到的轴对象可以设置绘制坐标轴的相关属性,常用方法及实现功能如表14.4所示。
表14.4 设置坐标轴绘制属性的部分通用方法纵轴对象还提供了设置坐标最大值的方法setUpperBound(double max),在默认情况下将最大值控制在能够正常绘制统计图的范围内。
通过java.awt.BasicStroke类可以绘制出各种各样的线段,大体分为实线段和虚线段,可控的绘制条件包括线条的宽度、线段端点的风格、折线段的折点风格、虚线段的绘制风格和虚线段的绘制偏移量,BasicStroke类提供的所有构造方法如表14.5所示。
表14.5 BasicStroke类提供的所有构造方法线段端点的修饰风格有3种,分别由3个常量表示,具体信息如表14.6所示。
表14.6 线段端点修饰风格简介线段折点的修饰风格同样有3种,也由3个常量表示,具体信息如表14.7所示。
表14.7 线段折点修饰风格简介入口参数dash 用来定义虚线,为float 型数组,当dash 数组由偶数个元素组成时,索引值为偶数的元素值代表虚线段的长度,索引值为奇数的元素值代表两个虚线段之间的空白部分的长度,需要注意的是,数组的索引值是从0开始的;当数组中只有一个元素时,例如dash={6},等同于dash={6,6}。
JAVA用POI从Excel读取数据进行相关统计,JFreeChart绘制图表
代码大概三百行吧,不多。
本来连接数据库做是个不错的选择,但是我刚刷了系统木有了又懒得装,从txt输入又感觉太low,最后就作死选择了以前从未尝试过的从Excel 输入,并碰到了各种问题_(:зゝ∠)_比如Cannot get a String value from a numeric cell 的异常错误,卡了我好久,直到无语地发现POI操作Excel时会无视Excel里的单元格设置,自判数据类型,所以还要使用setCellType.(*゜ー゜*)实现步骤(1)我用javax.swing.JFileChooser类来显示文件对话框,让用户选择一个Excel文件。
(2)使用Apache POI API从Excel文件中读取数据,对Employee类进行批量初始化。
(3)实现公司员工收入的相关统计,这里我实现了人数统计、最大/最小工龄查找、最大/最小工资查找、男女比例、平均工资、平均年龄、平均工龄等。
(4)建立Dataset。
将你所想要显示的数据都放到这个库中。
(5)建立JFreeChart对象。
将你的dataset填入到这个对象中。
(6)处理Chart中文显示问题(7)设置各种JFreeChart的属性和效果。
通过它提供的各种方法和接口设置相关的属性。
(8)用JFreeChart绘制图表,然后按照个人的需求进行执行。
(9)写界面,以swing形式输出。
测试截图(1)生成消息对话框,要求用户选择一个Excel文件,单击“确定”(2)生成文件选择器,我打开了存放在D盘BUAA文件夹里的Employee.xls补充说明:这是文件Employee.xls的内容(3)进行相关统计,并通过消息对话框显示统计结果(4)询问用户是否生成统计图,如果点“取消”或“否”,运行完毕;如果点是,系统将生成统计图,以员工为横轴,以年龄、工龄、工资三项数值为纵轴。
图表的显示效果会根据窗口大小自适应,改变横纵轴的比例尺。
下面是窗口最大化的效果程序清单1 2 3 4 5 6 7 8public class Employee {String ID;String name;String sex;double age;double workAge;double sal;9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) {this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}一共有两个:Employee.Java和EmployeeStatic.javaEmployeeStatic.javaimport java.awt.RenderingHints;import java.io.FileInputStream;import java.util.ArrayList;import java.util.List;import javax.swing.JFileChooser;import javax.swing.JOptionPane;//org.apache.poiimport ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import ermodel.Cell;import ermodel.Row;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;//org.jfreeimport org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import java.awt.Font;public class EmployeeStatics {public static void main(String[] args) {// TODO Auto-generated method stubJOptionPane.showMessageDialog(null,"\n您好,我是智能机器人小紫\n\n" + "很高兴为您提供员工数据统计分析服务\n\n"+ "请选择一个Excel文件 ^_^\n\n","选择Excel文件",RMATION_MESSAGE); ArrayList<Employee> Employees = null;//从Excel文件读取数据try {Employees = ReadFileUsingFileChooser();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}//人数统计int n = Employees.size();//最大最小工资、工龄、工资初始化int maxA = 0;int minA = Integer.MAX_VALUE;int maxWA = 0;int minWA = Integer.MAX_VALUE;int maxS = 0;int minS = Integer.MAX_VALUE;//男女性别人数int M = 0;int FM = 0;double sumS, sumA, sumWA, avgS, avgA, avgWA, MFM; sumS = sumA = sumWA = 0;//遍历实现相关统计for (Employee e : Employees) {if(e.age > maxA)maxA = (int) e.age;if(e.age < minA)minA = (int) e.age;if(e.workAge > maxWA)maxWA = (int) e.workAge;if(e.workAge < minWA)minWA = (int) e.workAge;if(e.sal > maxS)maxS = (int) e.sal;if(e.sal < minS)minS = (int) e.sal;sumS += e.sal;sumA += e.age;sumWA += e.workAge;if (e.sex.equals("男"))M++;if (e.sex.equals("女"))FM++;}//计算平均值avgS = sumS / n;avgA = sumA / n;avgWA = sumWA / n;//计算男女比例MFM = (double) M / FM;JOptionPane.showMessageDialog(null,"员工人数为" + n + ",男女比例为" + MFM + "(男/女)\n"+ "平均年龄为" + avgA + ",平均工龄为" + avgWA + ",平均工资为" + avgS + "\n"+ "最高年龄为" + maxA + ",最低年龄为" + minA + ",最高工龄为" + maxWA + ",最低工龄为" + minWA + "\n"+ "最高工资为" + maxS + "K,最低工资为" + minS + "K\n");int option=JOptionPane.YES_OPTION;option=JOptionPane.showConfirmDialog(null, "是否显示员工数据统计图?");if (option==JOptionPane.YES_OPTION) {CategoryDataset dataset = getDataSet(Employees);//构造chartJFreeChart chart = ChartFactory.createBarChart3D("员工数据统计图", // 图表标题"员工属性", // 目录轴的显示标签--横轴"数值", // 数值轴的显示标签--纵轴dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、true, // 是否显示图例(对于简单的柱状图必须false, // 是否生成工具false// 是否生成URL链接);//处理chart中文显示问题processChart(chart);//chart 以swing形式输出ChartFrame pieFrame = new ChartFrame("员工数据统计图", chart);pieFrame.pack();pieFrame.setVisible(true);}}public static ArrayList<Employee>ReadFileUsingFileChooser()throws Ex ception {// TODO Auto-generated method stubJFileChooser fileChooser = new JFileChooser();ArrayList temp = new ArrayList();if (fileChooser.showOpenDialog(null)==JFileChooser.APPROVE_OPTION) {java.io.File file = fileChooser.getSelectedFile();FileInputStream fileIn = new FileInputStream(file);//根据指定的文件输入流导入Excel从而产生Workbook对象HSSFWorkbook wb0 = new HSSFWorkbook(fileIn);//获取Excel文档中的第一个表单HSSFSheet sht0 = wb0.getSheetAt(0);//对Sheet中的每一行进行迭代int r;int rowNum = sht0.getPhysicalNumberOfRows();for (r = 1; r <= rowNum; r++) {Row row = sht0.getRow(r);if (row == null) {break;}//创建实体类Employee info=new Employee();//取出当前行第1个单元格数据,并封装在info实体stuName属性上row.getCell(0).(Cell.);info.setID(row.getCell(0).getStringCellValue());info.setName(row.getCell(1).getStringCellValue());info.setSex(row.getCell(2).getStringCellValue());info.setAge(row.getCell(3).getNumericCellValue());info.setWorkAge(row.getCell(4).getNumericCellValue());info.setSal(row.getCell(5).getNumericCellValue());temp.add(info);}fileIn.close();}else {System.out.println("No file selected");}return temp;}//获取一个演示用的组合数据集对象private static CategoryDatasetgetDataSet(ArrayList<Employee> Employe es) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();for (Employee e : Employees){dataset.addValue(e.workAge, "工龄", );dataset.addValue(e.sal, "工资", );dataset.addValue(e.age, "年龄", );}return dataset;}//解决图表汉字显示问题private static void processChart(JFreeChart chart) {CategoryPlot plot = chart.getCategoryPlot();CategoryAxis domainAxis = plot.getDomainAxis();ValueAxis rAxis = plot.getRangeAxis();chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASI NG,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);TextTitle textTitle = chart.getTitle();textTitle.setFont(new Font("宋体", Font.PLAIN, 20));domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));rAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));// renderer.setItemLabelGenerator(newLabelGenerator(0.0));// renderer.setItemLabelFont(newFont("宋体", Font.PLAIN, 12));//renderer.setItemLabelsVisible(true);}}Employee.javapublic class Employee {String ID;String name;String sex;double age;double workAge;double sal;public void setID(String ID) {this.ID = ID;}public void setName(String name) { = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(double age) {this.age = age;}public void setWorkAge(double workAge) { this.workAge = workAge;}public void setSal(double sal) {this.sal = sal;}}。
免费 jfreechart_生成折线图,饼图,柱状图,堆栈柱状图
最近公司使用jfreechart来生成统计图,使用了折线图,饼图等,因为用的1.0.8a版的jfreechart,与1.0.0版本的地方有很多不同,而且图片生成清晰度比老版的高,如下是我做的demo.1.所需包(1) jfreechart-1.0.8a.jar(2) jcommon-1.0.12.jar2.运行环境JDK 1.53.源代码import java.awt.Color;import java.awt.Font;import java.io.File;import java.io.FileOutputStream;import java.text.DecimalFormat;import java.text.NumberFormat;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.CategoryLabelPositions;import org.jfree.chart.axis.NumberAxis;import org.jfree.chart.axis.V alueAxis;import bels.StandardCategoryItemLabelGenerator;import bels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PiePlot3D;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.BarRenderer;import org.jfree.chart.renderer.category.LineAndShapeRenderer;import org.jfree.chart.renderer.category.StackedBarRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.general.DatasetUtilities;import org.jfree.data.general.DefaultPieDataset;import org.jfree.data.general.PieDataset;/*** 实际取色的时候一定要16位的,这样比较准确** @author new*/public class CreateChartServiceImpl{private static final String CHART_PA TH = "E:/test/";public static void main(String[] args){// TODO Auto-generated method stubCreateChartServiceImpl pm = new CreateChartServiceImpl();// 生成饼状图pm.makePieChart();// 生成单组柱状图pm.makeBarChart();// 生成多组柱状图pm.makeBarGroupChart();// 生成堆积柱状图pm.makeStackedBarChart();// 生成折线图pm.makeLineAndShapeChart();}/*** 生成折线图*/public void makeLineAndShapeChart(){double[][] data = new double[][]{{ 672, 766, 223, 540, 126 },{ 325, 521, 210, 340, 106 },{ 332, 256, 523, 240, 526 } };String[] rowKeys ={ "苹果", "梨子", "葡萄" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createTimeXYChar("折线图", "x轴", "y轴", dataset, "lineAndShap.png"); }/*** 生成分组的柱状图*/public void makeBarGroupChart(){double[][] data = new double[][]{ 672, 766, 223, 540, 126 },{ 325, 521, 210, 340, 106 },{ 332, 256, 523, 240, 526 } };String[] rowKeys ={ "苹果", "梨子", "葡萄" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createBarChart(dataset, "x坐标", "y坐标", "柱状图", "barGroup.png");}/*** 生成柱状图*/public void makeBarChart(){double[][] data = new double[][]{{ 672, 766, 223, 540, 126 } };String[] rowKeys ={ "苹果" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createBarChart(dataset, "x坐标", "y坐标", "柱状图", "bar.png");}/*** 生成堆栈柱状图*/public void makeStackedBarChart(){double[][] data = new double[][]{{ 0.21, 0.66, 0.23, 0.40, 0.26 },{ 0.25, 0.21, 0.10, 0.40, 0.16 } };String[] rowKeys ={ "苹果", "梨子" };String[] columnKeys ={ "北京", "上海", "广州", "成都", "深圳" };CategoryDataset dataset = getBarData(data, rowKeys, columnKeys); createStackedBarChart(dataset, "x坐标", "y坐标", "柱状图", "stsckedBar.png"); }/*** 生成饼状图*/public void makePieChart(){double[] data ={ 9, 91 };String[] keys ={ "失败率", "成功率" };createValidityComparePimChar(getDataPieSetByUtil(data, keys), "饼状图", "pie2.png", keys);}// 柱状图,折线图数据集public CategoryDataset getBarData(double[][] data, String[] rowKeys, String[] columnKeys){return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);}// 饼状图数据集public PieDataset getDataPieSetByUtil(double[] data,String[] datadescription){if (data != null && datadescription != null){if (data.length == datadescription.length){DefaultPieDataset dataset = new DefaultPieDataset();for (int i = 0; i < data.length; i++){dataset.setValue(datadescription[i], data[i]);}return dataset;}}return null;/*** 柱状图**@param dataset 数据集* @param xName x轴的说明(如种类,时间等)* @param yName y轴的说明(如速度,时间等)* @param chartTitle 图标题* @param charName 生成图片的名字* @return*/public String createBarChart(CategoryDataset dataset, String xName,String yName, String chartTitle, String charName){JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题xName, // 目录轴的显示标签yName, // 数值轴的显示标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成URL链接);Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);/** V ALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,* 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看*///chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.V ALUE_TEXT_ANTIALIAS_OFF);chart.setTextAntiAlias(false);chart.setBackgroundPaint(Color.white);// create plotCategoryPlot plot = chart.getCategoryPlot();// 设置横虚线可见plot.setRangeGridlinesVisible(true);// 虚线色彩plot.setRangeGridlinePaint(Color.gray);// 数据轴精度NumberAxis vn = (NumberAxis) plot.getRangeAxis();// vn.setAutoRangeIncludesZero(true);DecimalFormat df = new DecimalFormat("#0.00");vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式// x轴设置CategoryAxis domainAxis = plot.getDomainAxis();domainAxis.setLabelFont(labelFont);// 轴标题domainAxis.setTickLabelFont(labelFont);// 轴数值// Lable(Math.PI/3.0)度倾斜// domainAxis.setCategoryLabelPositions(CategoryLabelPositions// .createUpRotationLabelPositions(Math.PI / 3.0));domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的Lable 是否完整显示// 设置距离图片左端距离domainAxis.setLowerMargin(0.1);// 设置距离图片右端距离domainAxis.setUpperMargin(0.1);// 设置columnKey 是否间隔显示// domainAxis.setSkipCategoryLabelsToFit(true);plot.setDomainAxis(domainAxis);// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)plot.setBackgroundPaint(new Color(255, 255, 204));// y轴设置ValueAxis rangeAxis = plot.getRangeAxis();rangeAxis.setLabelFont(labelFont);rangeAxis.setTickLabelFont(labelFont);// 设置最高的一个Item 与图片顶端的距离rangeAxis.setUpperMargin(0.15);// 设置最低的一个Item 与图片底端的距离rangeAxis.setLowerMargin(0.15);plot.setRangeAxis(rangeAxis);BarRenderer renderer = new BarRenderer();// 设置柱子宽度renderer.setMaximumBarWidth(0.05);// 设置柱子高度renderer.setMinimumBarLength(0.2);// 设置柱子边框颜色renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱子边框可见renderer.setDrawBarOutline(true);// // 设置柱的颜色renderer.setSeriesPaint(0, new Color(204, 255, 255));renderer.setSeriesPaint(1, new Color(153, 204, 255));renderer.setSeriesPaint(2, new Color(51, 204, 204));// 设置每个地区所包含的平行柱的之间距离renderer.setItemMargin(0.0);// 显示每个柱的数值,并修改该数值的字体属性renderer.setIncludeBaseInRange(true);renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setBaseItemLabelsVisible(true);plot.setRenderer(renderer);// 设置柱的透明度plot.setForegroundAlpha(1.0f);FileOutputStream fos_jpg = null;try{isChartPathExist(CHART_PATH);String chartName = CHART_PA TH + charName;fos_jpg = new FileOutputStream(chartName);ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);return chartName;}catch (Exception e){e.printStackTrace();return null;}finally{try{fos_jpg.close();}catch (Exception e){e.printStackTrace();}}/*** 横向图** @param dataset 数据集* @param xName x轴的说明(如种类,时间等)* @param yName y轴的说明(如速度,时间等)* @param chartTitle 图标题* @param charName 生成图片的名字* @return*/public String createHorizontalBarChart(CategoryDataset dataset,String xName, String yName, String chartTitle, String charName){JFreeChart chart = ChartFactory.createBarChart(chartTitle, // 图表标题xName, // 目录轴的显示标签yName, // 数值轴的显示标签dataset, // 数据集PlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例(对于简单的柱状图必须是false)false, // 是否生成工具false // 是否生成URL链接);CategoryPlot plot = chart.getCategoryPlot();// 数据轴精度NumberAxis vn = (NumberAxis) plot.getRangeAxis();//设置刻度必须从0开始// vn.setAutoRangeIncludesZero(true);DecimalFormat df = new DecimalFormat("#0.00");vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式CategoryAxis domainAxis = plot.getDomainAxis();domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); // 横轴上的// LableFont labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);domainAxis.setLabelFont(labelFont);// 轴标题domainAxis.setTickLabelFont(labelFont);// 轴数值domainAxis.setMaximumCategoryLabelWidthRatio(0.8f);// 横轴上的Lable 是否完整显示// domainAxis.setVerticalCategoryLabels(false);plot.setDomainAxis(domainAxis);ValueAxis rangeAxis = plot.getRangeAxis();// 设置最高的一个Item 与图片顶端的距离rangeAxis.setUpperMargin(0.15);// 设置最低的一个Item 与图片底端的距离rangeAxis.setLowerMargin(0.15);plot.setRangeAxis(rangeAxis);BarRenderer renderer = new BarRenderer();// 设置柱子宽度renderer.setMaximumBarWidth(0.03);// 设置柱子高度renderer.setMinimumBarLength(30);renderer.setBaseOutlinePaint(Color.BLACK);// 设置柱的颜色renderer.setSeriesPaint(0, Color.GREEN);renderer.setSeriesPaint(1, new Color(0, 0, 255));// 设置每个地区所包含的平行柱的之间距离renderer.setItemMargin(0.5);// 显示每个柱的数值,并修改该数值的字体属性renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); // 设置柱的数值可见renderer.setBaseItemLabelsVisible(true);plot.setRenderer(renderer);// 设置柱的透明度plot.setForegroundAlpha(0.6f);FileOutputStream fos_jpg = null;try{isChartPathExist(CHART_PATH);String chartName = CHART_PA TH + charName;fos_jpg = new FileOutputStream(chartName);ChartUtilities.writeChartAsPNG(fos_jpg, chart, 500, 500, true, 10);return chartName;}catch (Exception e){e.printStackTrace();return null;}finally{try{fos_jpg.close();}catch (Exception e){e.printStackTrace();}}}/*** 饼状图** @param dataset 数据集* @param chartTitle 图标题* @param charName 生成图的名字* @param pieKeys 分饼的名字集* @return*/public String createValidityComparePimChar(PieDataset dataset,String chartTitle, String charName, String[] pieKeys){JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // chart// titledataset,// datatrue,// include legendtrue, false);// 使下说明标签字体清晰,去锯齿类似于//chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.V ALUE_TEXT_ANTIALIAS_OFF);的效果chart.setTextAntiAlias(false);// 图片背景色chart.setBackgroundPaint(Color.white);// 设置图标题的字体重新设置titleFont font = new Font("隶书", Font.BOLD, 25);TextTitle title = new TextTitle(chartTitle);title.setFont(font);chart.setTitle(title);PiePlot3D plot = (PiePlot3D) chart.getPlot();// 图片中显示百分比:默认方式// 指定饼图轮廓线的颜色// plot.setBaseSectionOutlinePaint(Color.BLACK);// plot.setBaseSectionPaint(Color.BLACK);// 设置无数据时的信息plot.setNoDataMessage("无对应的数据,请重新查询。
Excel中制作柱状图和折线图并作单独保存的操作方法
Excel中制作柱状图和折线图并作单独保存的操作方法
大家都用过excel吧,你有没有用过excel来制作图标呢?是不是很有趣呢?他可以用来制作各种各样的图标,只要你有数据,然后通过正确的方法,就可以按照你的要求来制作出图标。
今天,店铺就教大家在Excel中制作柱状图和折线图并作单独保存的操作方法。
Excel中制作柱状图和折线图并作单独保存的操作步骤如下:
在你的电脑桌面上找到excel图标,双击它,将会启动这个程序,之后,它会在弹出来的界面叫你选择文档,此时选择一篇空白文档。
在第一行输入你所要描述数据的名称或者代号。
如图中的姓氏,每个姓氏占据一个单元格,以便区分开来。
然后在每个姓氏的下面输入你的数据,数据与单元格里面的姓氏要相对应,不然到时做出来的图像就格格不入了。
点击上面的菜单栏里面的“插入”选项,然后在子菜单中选择找到“图表”那一板块,然后点击该板块的右下角三角形。
如图所示。
然后在所弹射出来的选项框中选择“所有图表”选项。
接着在左边的选项中就可以找到“柱形图”,在右边的框里就会预览你的图像的表现模式。
折线图的基本步骤与上面的4个步骤一致,只需要在左边找到并点击”折线图“,然后在右边选择预览效果就行了。
在表格右上方找到‘位置’中的”移动图标“单击它,并在选项框中的”新工作表“中打上点。
点击确定就可以单独保存在另外一张表格中了。
Excel中制作柱状图和折线图并作单独保存的操作。
JFreeChart教程
JFreeChart教程--入门一、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 文件,在其中加入如下代码:Java代码至此jfreechart的配置就完成了,下面就可以进行jfreechart的开发了。
这里值得提出的是jfreechart的类结构设计前后兼容性不是很好,不同版本的jfreechart中类库结构可能不一样,有时候可能需要查源码。
利用JFreeChart在JSP中制作图表
t o g e n e r a t e c h a r t s i n J S P p a g e s t h r o u g h t h e d a t a s e t o b j e c t s u p p l i e d b y J F r e e C h a t r i s i n t r o d u c e d .T h e c o n c r e t e r e a l i z a t i o n me t h o d
・
3 4 ・
Co mp u t e r Er a No. 4 2 01 3
利用 J F r e e C h a r t 在J S P中制作 图表
张玉 叶 。马春清
f 1 .济南职 业 学院计 算机 系,山 东 济 南 2 5 0 0 1 4 ;2 .济南信 息 工程 学校 )
表功能 , 能 以图表 的形式来清晰直观地显 示统 计报 表 中的各种
数据 。J F r e e C h a r t 是J a v a 平 台上的一个开放的图表绘制类库 , 它 完全使用 J a v a 语 言编 写 , 可应 用于 J a v a A p p l i c a t i o n s 、 A p p l e t s 、
Zh a n g Yu y e ,M a Ch u n qi n g
( J .De p t .o f c o m p u t e r ,J i n a n V o c a t i o n a l C o U e a g e ,J i n a n ,S h a n d o n g 2 5 0 0 1 4 ,C h i n a ;2 .J i n a n I n f o r m a t i o n E n g i n e e r i n g S c h o o 1 )
java利用JFreeChart实现各种数据统计图(柱形图_饼图_折线图)
各类统计程序实现杨方 531115121 矢量图的生成矢量统计图,即是以矢量图形格式生成、存在和输出的统计图。
这种统计图图形要素丰富、交互编辑简单、存储格式多样,打印输出方便,是GIS应用系统最优先选择的统计图。
最常用的三类矢量统计图是直方图、曲线图、饼图。
矢量统计图的生成,首先要将数据组织为一定的格式,然后进行图形参数的计算和设置,再生成图形,最后进行浏览显示或者保存输出。
当然,如果对生成的图形不满意,可以进行参数修改,然后重新生成,最后再显示或保存。
1.1 数据组织原始数据可以整理为二维表格的形式,通过文件(*.txt,*.xls,*.doc)导入,也可以将数据整理为二维数组的形式输入。
统计图只支持为数值型的数据,包括整型、长整型、浮点型和双精度型等4种数据类型。
1.2 设置参数图形参数可以由用户外部输入,也可以根据数据生成默认参数,分为基本参数、坐标参数、图例参数和数据参数等。
(1)基本参数包括图形类型,图形名称,图形范围,点、线、区参数等。
(2)坐标轴参数包括是否绘制轴线、刻度线、标注、网格线的标志,刻度数,颜色,名称,比例尺,以及是否绘制包围盒或箭头的标志。
(3)图例参数包括是否绘制图例的标志和图例显示位置标志。
(4)数据参数包括数据类型,是否绘制数据表的标志,图形单元的宽度或间隔、图形单元的颜色,系列和类别显示标志等。
1.3 图形生成生成图形的基本步骤如下:(1)确认存在点、线、面工作区。
生成的图形要暂时存入工作区中,然后才能进行显示或保存。
点线面工作区可以由外部输入,也可以在软件中生成。
(2)确认各项图形参数有效。
必须保证每项图形参数都有效,否则软件将出错。
对于没有设置有效值的参数,要重新设置默认参数。
(3)依次生成图形的各个要素:生成坐标轴、生成图形主体、生成数据表、生成图例和生成图形。
在生成统计图的过程中,要随时计算图形的当前范围,以控制后续元素的位置。
1.4 图形显示统计图生成后,保存在MAPGIS的点线面工作区中,可以调用MAPGIS的图形显示视图进行显示。
linechart使用
linechart使用
Line chart(折线图)是一种常见的数据可视化工具,通常用
于显示随时间或连续变量而变化的数据趋势。
使用折线图可以直观
地展示数据的变化规律和趋势,有助于分析数据的走势和变化。
要使用折线图,首先需要准备好要展示的数据。
通常,折线图
的数据是一系列的数据点,每个数据点包括一个x轴值和一个对应
的y轴值。
x轴通常代表时间或者是连续的变量,y轴代表对应的数值。
在准备好数据之后,可以使用各种数据可视化工具或编程语言(如Python中的Matplotlib库、R语言中的ggplot2包、JavaScript中的D3.js等)来创建折线图。
通常的步骤包括创建一
个坐标系,将数据点映射到坐标系上,并连接数据点以形成折线图。
在创建折线图时,需要考虑一些设计原则,比如选择合适的颜色、线条粗细、添加数据标签、坐标轴标签等,以确保图表清晰易懂。
另外,还可以根据需要添加图例、注释、标题等元素,以增强
折线图的表达能力。
折线图通常用于展示时间序列数据的趋势,比如股票走势、气温变化、销售额变化等。
它也可以用于比较不同组别或实体的数据变化,以及预测未来的趋势。
总的来说,折线图是一种简单而强大的数据可视化工具,能够直观地展示数据的变化趋势,帮助人们更好地理解数据。
希望这些信息能够帮助你更好地使用折线图进行数据可视化。
jfreechat制作柱、饼、曲线图型
jfreechat制作拄、饼、曲线图型准备工作jFreeChart下载地址:/jfreechart/index.php把jcommon-1.0.0.jar,jfreechart-1.0.1.jar放到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>/servlet/DisplayChart</url-pattern></servlet-mapping>拄型图<%@ page contentType="text/html;charset=GBK"%><%@ page import="java.awt.Color,java.awt.Font,org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.CategoryDataset,org.jfree.data.general.DatasetUtilities,org.jfree.chart.plot.CategoryPlot,org.jfree.chart.axis.CategoryAxis,org.jfree.chart.axis.ValueAxis,org.jfree.chart.renderer.category.BarRenderer3D,bels.StandardCategoryItemLabelGenerator,org.jfree.chart.axis.AxisLocation"%><%double[][] data = new double[][] {{672, 766, 223, 540, 126},{325, 521, 210, 340, 106},{332, 256, 523, 240, 526}};String[] rowKeys = {"苹果","梨子","葡萄"};String[] columnKeys = {"北京","上海","广州","成都","深圳"};CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);JFreeChart chart = ChartFactory.createBarChart3D("水果销量图统计",null,null,dataset,PlotOrientation.VERTICAL,true,false,false);chart.setBackgroundPaint(Color.WHITE);CategoryPlot plot = chart.getCategoryPlot();//CategoryAxis domainAxis = plot.getDomainAxis();//domainAxis.setVerticalCategoryLabels(false);//plot.setDomainAxis(domainAxis);ValueAxis rangeAxis = plot.getRangeAxis();//设置最高的一个Item 与图片顶端的距离rangeAxis.setUpperMargin(0.15);//设置最低的一个Item 与图片底端的距离rangeAxis.setLowerMargin(0.15);plot.setRangeAxis(rangeAxis);BarRenderer3D renderer = new BarRenderer3D();renderer.setBaseOutlinePaint(Color.BLACK);//设置Wall 的颜色renderer.setWallPaint(Color.gray);//设置每种水果代表的柱的颜色renderer.setSeriesPaint(0, new Color(0, 0, 255));renderer.setSeriesPaint(1, new Color(0, 100, 255));renderer.setSeriesPaint(2, Color.GREEN);//设置每个地区所包含的平行柱的之间距离renderer.setItemMargin(0.1);//显示每个柱的数值,并修改该数值的字体属性renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());renderer.setItemLabelsVisible(true);plot.setRenderer(renderer);//设置柱的透明度plot.setForegroundAlpha(0.6f);//设置地区、销量的显示位置plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; %><img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>"> 饼图<%@ page contentType="text/html;charset=GBK"%><%@ page import="org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.plot.PiePlot,org.jfree.data.general.DefaultPieDataset,org.jfree.chart.title.TextTitle,org.jfree.chart.plot.CategoryPlot,org.jfree.chart.ChartUtilities,org.jfree.data.time.Day,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.DefaultCategoryDataset"%><%//图片标题String title = "空调2002年市场占有率";//设定数据源DefaultPieDataset piedata = new DefaultPieDataset();//第一个参数为名称,第二个参数是double数piedata.setValue("联想", 27.3);piedata.setValue("长城", 12.2);piedata.setValue("海尔", 5.5);piedata.setValue("美的", 17.1);piedata.setValue("松下", 9.0);piedata.setValue("科龙", 19.0);//创建JFreeChart,都使用ChartFactory来创建JFreeChart,很标准的工厂设计模式JFreeChart chart =ChartFactory.createPieChart(title, piedata, true, true, true);String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; %><img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>"> 曲线图<%@ page contentType="text/html;charset=GBK"%><%@ page import="org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.plot.PiePlot,org.jfree.data.general.DefaultPieDataset,org.jfree.chart.title.TextTitle,org.jfree.chart.plot.CategoryPlot,org.jfree.chart.ChartUtilities,org.jfree.data.time.Day,org.jfree.data.time.TimeSeries,org.jfree.data.time.TimeSeriesCollection,org.jfree.data.time.TimeSeriesDataItem,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.DefaultCategoryDataset"%> <%// create a default chart based on some sample data...//曲线图标题String title = "趋势分析";//曲线图X轴提示String domain = "月份走势";//曲线图Y轴提示String range = "应收余额";//曲线图自标题String subtitleStr = "2003财年分析";//创建时间数据源//每一个TimeSeries在图上是一条曲线TimeSeries ca = new TimeSeries("用友");for (int i = 1999; i < 2005; i++) {for (int mon = 0; mon < 12; mon++) {//ca.add(new Month(mon + 1, i), new Double(500 + Math.random() * 100)); //TimeSeriesDataPair是一个时间点的数值体现ca.add(new TimeSeriesDataItem(new Day(1, mon + 1, i),new Double(500 + Math.random() * 100)));}}TimeSeries ibm = new TimeSeries("金碟");for (int i = 1999; i < 2005; i++) {for (int mon = 0; mon < 12; mon++) {//ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100)); ibm.add(new TimeSeriesDataItem(new Day(1, mon + 1, i),new Double(400 - Math.random() * 100)));}}TimeSeries king = new TimeSeries("东软");for (int i = 1999; i < 2005; i++) {for (int mon = 0; mon < 12; mon++) {//ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));king.add(new TimeSeriesDataItem(new Day(1, mon + 1, i),new Double(300 - Math.random() * 100)));}}TimeSeries lx = new TimeSeries("联想");for (int i = 1999; i < 2005; i++) {for (int mon = 0; mon < 12; mon++) {//ibm.add(new Month(mon+1,i),new Double(400-Math.random()*100));lx.add(new TimeSeriesDataItem(new Day(1, mon + 1, i),new Double(200 - Math.random() * 100)));}}//时间曲线数据集合TimeSeriesCollection dataset = new TimeSeriesCollection();dataset.addSeries(ca);dataset.addSeries(ibm);dataset.addSeries(king);dataset.addSeries(lx);//dataset.addSeries(jpy);//dataset.addSeries(mav);//时间曲线元素JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,dataset,true,true,false);String filename = ServletUtilities.saveChartAsPNG(chart, 600, 300, null, session);String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; %><img src="<%= graphURL %>" width=600 height=300 border=0 usemap="#<%= filename %>"> 优惠促销打折网5号仓库。
jfreechart图片直接转为byte[]然后转为base64导入xml,最后图片导入word
jfreechart图片直接转为byte[]然后转为base64导入xml,最后图片导入word/*** 把jfreechart生成的图片转化为xml字符串,jfreechart图片导入word* @param chart* @return* @throws IOException*/public static String getImageStr(JFreeChart chart) throws IOException {//方法一,从硬盘上读取图片转化为xml_str/*FileOutputStream fos_jpg = null;// ObjectOutputStream oos = new ObjectOutputStream(baos);try {fos_jpg = new FileOutputStream("D://bar.jpg");//ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null);ChartUtilities.writeChartAsJPEG(fos_jpg, 1.0f, chart, 400, 300, null);} finally {try {fos_jpg.close();} catch (Exception e) {}}InputStream in = null;byte[] data = null;try {in = new FileInputStream("D://bar.jpg");data = new byte[in.available()];in.read(data);in.close();} catch (IOException e) {e.printStackTrace();}BASE64Encoder encoder = new BASE64Encoder();String ss = encoder.encode(data);*///方法二,通过url获取图片,此处需要服务器权限Url url=new Url("http:\\....."+fileName);InputStream is = url.openStream();。
JFreeChart调用技术文档(JSP页面实现折线图)
创建柱状图1 引入jFreechart的包jcommon-1.0.15.jarjfreechart-1.0.12.jarjfreechart-1.0.12-experimental.jar2 在web.xml中加入<servlet><servlet-nam e>DisplayChart</servlet-nam e><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class></servlet><servlet-m apping><servlet-nam e>DisplayChart</servlet-nam e><url-pattern>/servlet/DisplayChart</url-pattern></servlet-m apping>3 在jsp或者servlet或者action中写// 创建一个柱状图DefaultCategoryDataset dataSet =new DefaultCategoryDataset();// 数据装入for(int i=0;i<list.size();i++){Item item =(Item)list.get(i);dataSet.setValue(Item.getRating(), "testNam e", Item.getTime());}JFreeChart chart = ChartFactory.createBarChart("统计图","ratings", "time", dataSet, PlotOrientation.VERTICAL,false, true, false);try{String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, ses sion);String graphURL = request.getContextPath() + "/servlet/DisplayChart?filen am e=" + filename;request.setAttribute("graphURL",graphURL);} catch (Exception e){}4 在页面引入<img src="<%= request.getAttribute("graphURL") %>">这种方式会生成临时图片文件,默认是不对其进行清理的,所以要手工进行处理对于临时文件的清除,jfreechart提供了一个实现了HttpSessionBindingListener的类Chart Deleter,里面有个valueUnbound方法,这个方法是在session执行remove的时候被自动执行,所以我们只需要在页面刚进入的时候调用session.removeAttribute("JFreeChart_Deleter");这样会删除当前session之前生成的图表。
java实现各种数据统计图(柱形图,饼图,折线图)
java实现各种数据统计图(柱形图,饼图,折线图)最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了:1. jfreechart-1.0.13.jar2. jcommon-1.0.16.jar3. gnujaxp.jar先来看一下,最终效果图:主要是jfreechart-1.0.13.jar,但这三个包要齐全,我已经将所有与jfreechart有关的jar包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载,下载地址:/detail/pzhtpf/4327700接下来,我们一步步来实现本程序。
一,前期准备工作,也就把这三个第三方包添加进本文工程,添加过程特别简单,前面写过一篇博客,讲的是java如何读取Excel表格中的数据(有兴趣的同学可以看一看:/pzhtpf/article/details/7506135),也要添加第三方包,添加过程一模一样,这里我们在复习一遍:1,建,立java项目,在这个项目在建立一个新的文件夹lib;2,将上述三个jar包,复制到lib3,然后右键点击这个java项目,选择Properties4,在左侧列表里选中Java Build Path,右侧选中Libraries5,点击Add JARs6,然后去选择这个项目中lib文件夹中的三个jar,点击确定成功后,项目中会多一个文件夹为:Referenced Libraries二,实现柱形图的java代码:[plain]view plaincopy1.import java.awt.Font;2.3.import org.jfree.chart.ChartFactory;4.import org.jfree.chart.ChartPanel;5.import org.jfree.chart.JFreeChart;6.import org.jfree.chart.axis.CategoryAxis;7.import org.jfree.chart.axis.ValueAxis;8.import org.jfree.chart.plot.CategoryPlot;9.import org.jfree.chart.plot.PlotOrientation;10.import org.jfree.data.category.CategoryDataset;11.import org.jfree.data.category.DefaultCategoryDataset ;12.13.public class BarChart {14.ChartPanel frame1;15.public BarChart(){16.CategoryDataset dataset = getDataSet();17.JFreeChart chart = ChartFactory.createBarChart3D(18."水果", // 图表标题19."水果种类", // 目录轴的显示标签20."数量", // 数值轴的显示标签21.dataset, // 数据集22.PlotOrientation.VERTICAL, // 图表方向:水平、垂直23.true, // 是否显示图例(对于简单的柱状图必须是false)24.false, // 是否生成工具25.false // 是否生成URL链接26.);27.28.//从这里开始29.CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象30.CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表31.domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题32.domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题33.ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状34.rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));35.chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));36.chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体37.38.//到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题39.40.frame1=new ChartPanel(chart,true); //这里也可以用chartFrame,可以直接生成一个独立的Frame41.42.}43.private static CategoryDataset getDataSet() {44.DefaultCategoryDataset dataset = new DefaultCatego ryDataset();45.dataset.addValue(100, "北京", "苹果");46.dataset.addValue(100, "上海", "苹果");47.dataset.addValue(100, "广州", "苹果");48.dataset.addValue(200, "北京", "梨子");49.dataset.addValue(200, "上海", "梨子");50.dataset.addValue(200, "广州", "梨子");51.dataset.addValue(300, "北京", "葡萄");52.dataset.addValue(300, "上海", "葡萄");53.dataset.addValue(300, "广州", "葡萄");54.dataset.addValue(400, "北京", "香蕉");55.dataset.addValue(400, "上海", "香蕉");56.dataset.addValue(400, "广州", "香蕉");57.dataset.addValue(500, "北京", "荔枝");58.dataset.addValue(500, "上海", "荔枝");59.dataset.addValue(500, "广州", "荔枝");60.return dataset;61.}62.public ChartPanel getChartPanel(){63.return frame1;64.65.}66.}效果图如下:但我们把private static CategoryDataset getDataSet(){}方法中的数据变化一下后,又会形成另一种效果,比如说我们改成:[plain]view plaincopy1.private static CategoryDataset getDataSet() {2.DefaultCategoryDataset dataset = new DefaultCategoryD ataset();3.dataset.addValue(100, "苹果", "苹果");4.dataset.addValue(200, "梨子", "梨子");5.dataset.addValue(300, "葡萄", "葡萄");6.dataset.addValue(400, "香蕉", "香蕉");7.dataset.addValue(500, "荔枝", "荔枝");8.return dataset;9.}效果图如下:三,实现饼状图的java代码:[plain]view plaincopy1.package com.njue.testJFreeChart;2.3.import java.awt.Font;4.import java.text.DecimalFormat;5.import java.text.NumberFormat;6.7.import javax.swing.JPanel;8.9.import org.jfree.chart.ChartFactory;10.import org.jfree.chart.ChartPanel;11.import org.jfree.chart.JFreeChart;12.import bels.StandardPieSectionLabelG enerator;13.import org.jfree.chart.plot.PiePlot;14.import org.jfree.data.general.DefaultPieDataset;15.16.public class PieChart {17.ChartPanel frame1;18.public PieChart(){19.DefaultPieDataset data = getDataSet();20.JFreeChart chart = ChartFactory.createPieChart3D("水果产量",data,true,false,false);21.//设置百分比22.PiePlot pieplot = (PiePlot) chart.getPlot();23.DecimalFormat df = new DecimalFormat("0.00%");//获得一个DecimalFormat对象,主要是设置小数问题24.NumberFormat nf = NumberFormat.getNumberInstan ce();//获得一个NumberFormat对象25.StandardPieSectionLabelGenerator sp1 = new Standar dPieSectionLabelGenerator("{0} {2}", nf, df);//获得StandardPieSectionLabelGenerator对象26.pieplot.setLabelGenerator(sp1);//设置饼图显示百分比27.28.//没有数据的时候显示的内容29.pieplot.setNoDataMessage("无数据显示");30.pieplot.setCircular(false);31.pieplot.setLabelGap(0.02D);32.33.pieplot.setIgnoreNullValues(true);//设置不显示空值34.pieplot.setIgnoreZeroValues(true);//设置不显示负值35.frame1=new ChartPanel (chart,true);36.chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体37.PiePlot piePlot= (PiePlot) chart.getPlot();//获取图表区域对象38.piePlot.setLabelFont(new Font("宋体",Font.BOLD,10));//解决乱码39.chart.getLegend().setItemFont(new Font("黑体",Font.BOLD,10));40.}41.private static DefaultPieDataset getDataSet() {42.DefaultPieDataset dataset = new DefaultPieDataset();43.dataset.setValue("苹果",100);44.dataset.setValue("梨子",200);45.dataset.setValue("葡萄",300);46.dataset.setValue("香蕉",400);47.dataset.setValue("荔枝",500);48.return dataset;49.}50.public ChartPanel getChartPanel(){51.return frame1;52.53.}54.}效果图如下:四,实现折线图的java代码:[plain]view plaincopy1.package com.njue.testJFreeChart;2.3.import java.awt.Font;4.import java.text.SimpleDateFormat;5.6.import org.jfree.chart.ChartFactory;7.import org.jfree.chart.ChartPanel;8.import org.jfree.chart.JFreeChart;9.import org.jfree.chart.axis.DateAxis;10.import org.jfree.chart.axis.ValueAxis;11.import org.jfree.chart.plot.XYPlot;12.import org.jfree.data.time.Month;13.import org.jfree.data.time.TimeSeries;14.import org.jfree.data.time.TimeSeriesCollection;15.import org.jfree.data.xy.XYDataset;16.17.public class TimeSeriesChart {18.ChartPanel frame1;19.public TimeSeriesChart(){20.XYDataset xydataset = createDataset();21.JFreeChart jfreechart = ChartFactory.createTimeSeries Chart("Legal & General单位信托基金价格", "日期", "价格",xydataset, true, true, true);22.XYPlot xyplot = (XYPlot) jfreechart.getPlot();23.DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis() ;24.dateaxis.setDateFormatOverride(new SimpleDateForm at("MMM-yyyy"));25.frame1=new ChartPanel(jfreechart,true);26.dateaxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题27.dateaxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题28.ValueAxis rangeAxis=xyplot.getRangeAxis();//获取柱状29.rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));30.jfreechart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));31.jfreechart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体32.33.}34.private static XYDataset createDataset() { //这个数据集有点多,但都不难理解35.TimeSeries timeseries = new TimeSeries("legal & gene ral欧洲指数信任",.jfree.data.time.Month.class);37.timeseries.add(new Month(2, 2001), 181.80000000000 001D);38.timeseries.add(new Month(3, 2001), 167.30000000000 001D);39.timeseries.add(new Month(4, 2001), 153.80000000000 001D);40.timeseries.add(new Month(5, 2001), 167.59999999999 999D);41.timeseries.add(new Month(6, 2001), 158.80000000000 001D);42.timeseries.add(new Month(7, 2001), 148.30000000000 001D);43.timeseries.add(new Month(8, 2001), 153.90000000000 001D);44.timeseries.add(new Month(9, 2001), 142.69999999999 999D);45.timeseries.add(new Month(10, 2001), 123.2D);46.timeseries.add(new Month(11, 2001), 131.8000000000 0001D);47.timeseries.add(new Month(12, 2001), 139.5999999999 9999D);48.timeseries.add(new Month(1, 2002), 142.90000000000 001D);49.timeseries.add(new Month(2, 2002), 138.69999999999 999D);50.timeseries.add(new Month(3, 2002), 137.30000000000 001D);51.timeseries.add(new Month(4, 2002), 143.90000000000 001D);52.timeseries.add(new Month(5, 2002), 139.80000000000 001D);53.timeseries.add(new Month(6, 2002), 137D);54.timeseries.add(new Month(7, 2002), 132.80000000000 001D);55.TimeSeries timeseries1 = new TimeSeries("legal & gen eral英国指数信任",.jfree.data.time.Month.class);57.timeseries1.add(new Month(2, 2001), 129.5999999999 9999D);58.timeseries1.add(new Month(3, 2001), 123.2D);59.timeseries1.add(new Month(4, 2001), 117.2D);60.timeseries1.add(new Month(5, 2001), 124.0999999999 9999D);61.timeseries1.add(new Month(6, 2001), 122.5999999999 9999D);62.timeseries1.add(new Month(7, 2001), 119.2D);63.timeseries1.add(new Month(8, 2001), 116.5D);64.timeseries1.add(new Month(9, 2001), 112.7D);65.timeseries1.add(new Month(10, 2001), 101.5D);66.timeseries1.add(new Month(11, 2001), 106.099999999 99999D);67.timeseries1.add(new Month(12, 2001), 110.3D);68.timeseries1.add(new Month(1, 2002), 111.7D);69.timeseries1.add(new Month(2, 2002), 111D);70.timeseries1.add(new Month(3, 2002), 109.59999999999999D);71.timeseries1.add(new Month(4, 2002), 113.2D);72.timeseries1.add(new Month(5, 2002), 111.5999999999 9999D);73.timeseries1.add(new Month(6, 2002), 108.8D);74.timeseries1.add(new Month(7, 2002), 101.5999999999 9999D);75.TimeSeriesCollection timeseriescollection = new Time SeriesCollection();76.timeseriescollection.addSeries(timeseries);77.timeseriescollection.addSeries(timeseries1);78.return timeseriescollection;79.}80.public ChartPanel getChartPanel(){81.return frame1;82.83.}84.}效果图如下:再来看一下主方法:[plain]view plaincopy1.import java.awt.GridLayout;2.3.import javax.swing.JFrame;4.5.public class mainClass {6.public static void main(String args[]){7.JFrame frame=new JFrame("Java数据统计图");8.frame.setLayout(new GridLayout(2,2,10,10));9.frame.add(new BarChart().getChartPanel()); //添加柱形图10.frame.add(new BarChart1().getChartPanel()); //添加柱形图的另一种效果11.frame.add(new PieChart().getChartPanel()); //添加饼状图12.frame.add(new TimeSeriesChart().getChartPanel()); / /添加折线图13.frame.setBounds(50, 50, 800, 600);14.frame.setVisible(true);15.}16.}五,总结以上都是一个简单的例子去实现了,想了解更深的同学可自行查询资料,其实以上代码都通俗易懂,只要结合自己的实际情况,便可开发出属于自己的Application,大家可以看出我这里是在Application上实现的,其实更多情况数据统计图在javaweb上应用更多,大家也可自行了解。
Jfreechart 图表开发文档
Jfreechart 图表开发文档目标简介:只要按要求写好sql 语句就能生成相应的图表。
实现步骤:1.置图表属性2.写sql 语句3.取图表数据对象4.生成图表5.显示图表详细说明:1.置图表属性图表属性类中定义了图表的属性信息,如,图表标题,图表热链接,是否3D效果显示code:String title = "统计图2";ChartProperty cp = new ChartProperty(title);cp.setChart3D(false);cp.setHitUrl("/servlet/_test");2.写sql 语句sql语句要求:饼型图,柱型图要求sql 语句的select 字段,第一个为String 型,第二个为number 型,曲线图第一个字段要求为日期型,第二个字段为number型,可以有第三个字段,第四个字段…..(n个)这个可生成多曲线图表。
code:1.String sql = "select basepricetype, sum(saleprice)" +" from tb_builsrc_contractinfo" +" where affirm_date >= to_date('2004-06-01', 'yyyy-MM-dd') and" +" affirm_date <= to_date('2004-06-02', 'yyyy-MM-dd')" +" group by basepricetype";2.sql = "select affirm_date, baseprice, saleprice" +" from tb_builsrc_contractinfo" +" where affirm_date >= to_date('2004-06-01 00:00:00', 'yyyy-MM-dd HH24:mi:SS') and " +" affirm_date <= to_date('2004-06-01 23:59:59', 'yyyy-MM-dd HH24:mi:SS')" +" order by affirm_date ";3.取图表数据对象生成不同图表所在生成的jfreechart 数据对象不同,jfreechart提供三个接口,饼型图为,PieDataset,要柱型图为CategoryDataset, 曲线图为XYDataset,同时在交易系统包中提供有DbChartCenter类,静态封装生成不同图表。
用JFreeChart绘制股票K线图完整解决方案
⽤JFreeChart绘制股票K线图完整解决⽅案因为⼯作的需要,接触了⼀些股票图形绘制类的⼯作,其中最主要的还是股票K线图的绘制了,如果利⽤编程语⾔最底层的图形绘制⽅法去绘制这类图形,如果对编程语⾔不是特别熟悉的话,⼀般是有很⼤的困难的,通过在⽹上搜索发现,以⾃⼰最熟悉的两门语⾔为例,其中有PHP版的开源JPGraph画图程序和 JAVA版的JFreeChart画图⼯具包,jpgraph⽤过⼀段时间,但是发现,其中图形细节⽅⾯处理的不够细腻和精致,最后转向使⽤ jfreechart,这是国外⼀个开源的图形绘制的java包,⾥⾯的画图功能也相当的强⼤,更主要的利⽤java强⼤的⾯向对象的功能,可以进⾏很多⽅⾯的定制和修改。
⽹上有很多⼈在询问如何使⽤jfreechart来绘制股票K线图,通过阅读其中的⼀些例⼦来看,⼤多⽐较的凌乱,没有给出⼀个符合中国股票市场的K线图实例,因为中国的股票市场K线图的颜⾊表⽰与国外存在⼀点差异,也有很多⼈遇到了如何去掉周六,周⽇这类不存在交易的⽇期,⽹上没有⼀个很满意的答案,通过实践,本⼈整理出⼀个完整的实例,给出完整的注释,只要在eclipse中配置好相应的classpath,甚⾄不要修改就可以运⾏,得到⼀个包含⽇K 线和⽇成交量的组合图,希望给⼤家提供⼀点帮助,同时也希望⼤家能够⼀起交流,改进和挖掘更多的功能!在进⾏源代码讲解之前,有必要将本⼈所领悟到的⼀些关于jfreechart的概念讲述下,jfreechart⼯具基本上把⼀个图形分成了⼏个逻辑部分。
1.⾸先是整个的画布对象(chart),画布就相当与⼀个⼤的容器,包含⼀些图形元素,⽐如为⼀张⽩纸2.然后是画图区域对象(plot),就是实际图形所占据的区域,⽐如为⽩纸上的⼀个长⽅形3.然后是图形所需要两条轴对象(axis),⽐如为⽩纸上的两条轴线4.最后是如何进⾏图像的绘制对象(render),⽐如为⼀只画图的笔5.除开上⾯的这些对象,还有⼀个最主要的就是通过必须的数据集(dataset)来⽣成图形了⾄于⼀些具体的对象细节,就只好请各位去阅读相关的API⽂档了,在这⾥就不详细的说明 package chart; import java.awt.Color;//颜⾊系统 import java.text.SimpleDateFormat;//时间格式 import java.awt.Paint;//画笔系统 import org.jfree.data.time.*; importorg.jfree.data.time.Day; import org.jfree.data.time.ohlc.OHLCSeries; import org.jfree.data.time.ohlc.OHLCSeriesCollection; importorg.jfree.chart.renderer.xy.*; import org.jfree.chart.axis.*; import org.jfree.chart.plot.*; import org.jfree.chart.*;public class KLineCombineChart {public static void main(String[] args) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");//设置⽇期格式 double highValue = Double.MIN_VALUE;//设置K线数据当中的最⼤值 double minValue = Double.MAX_VALUE;//设置K线数据当中的最⼩值double high2Value = Double.MIN_VALUE;//设置成交量的最⼤值 double min2Value = Double.MAX_VALUE;//设置成交量的最低值OHLCSeries series = new OHLCSeries("");//⾼开低收数据序列,股票K线图的四个数据,依次是开,⾼,低,收 series.add(newDay(28, 9, 2007), 9.2, 9.58, 9.16, 9.34); series.add(new Day(27, 9, 2007), 8.9, 9.06, 8.83, 8.96); series.add(new Day(26, 9, 2007), 9.0, 9.1, 8.82, 9.04); series.add(new Day(25, 9, 2007), 9.25, 9.33, 8.88, 9.00); series.add(new Day(24, 9, 2007), 9.05, 9.50, 8.91, 9.25); series.add(new Day(21, 9, 2007), 8.68, 9.05, 8.40, 9.00); series.add(new Day(20, 9, 2007), 8.68, 8.95, 8.50, 8.69); series.add(new Day(19, 9, 2007), 8.80, 8.94, 8.50, 8.66); series.add(new Day(18, 9, 2007), 8.88, 9.17, 8.69, 8.80); series.add(new Day(17, 9, 2007), 8.26, 8.98, 8.15, 8.89); series.add(new Day(14, 9, 2007), 8.44, 8.45, 8.13, 8.33); series.add(new Day(13, 9, 2007), 8.13, 8.46, 7.97, 8.42); series.add(new Day(12, 9, 2007), 8.2, 8.4, 7.81, 8.13); series.add(new Day(11, 9, 2007), 9.0, 9.0, 8.1, 8.24); series.add(new Day(10, 9, 2007), 8.6, 9.03, 8.40, 8.95); series.add(new Day(7, 9, 2007), 8.89, 9.04, 8.70, 8.73); series.add(new Day(6, 9, 2007), 8.4, 9.08, 8.33, 8.88); series.add(new Day(5, 9, 2007), 8.2, 8.74, 8.17, 8.36); series.add(new Day(4, 9, 2007), 7.7, 8.46, 7.67, 8.27); series.add(new Day(3, 9, 2007), 7.5, 7.8, 7.48, 7.69); series.add(new Day(31, 8, 2007), 7.4, 7.6, 7.28, 7.43); series.add(new Day(30, 8, 2007), 7.42, 7.56, 7.31, 7.40); series.add(new Day(29, 8, 2007), 7.42, 7.66, 7.22, 7.33); series.add(new Day(28, 8, 2007), 7.31, 7.70, 7.15, 7.56); series.add(new Day(27, 8, 2007), 7.05, 7.46, 7.02, 7.41); series.add(new Day(24, 8, 2007), 7.05, 7.09, 6.90, 6.99); series.add(new Day(23, 8, 2007), 7.12, 7.16, 7.00, 7.03); series.add(new Day(22, 8, 2007), 6.96, 7.15, 6.93, 7.11); series.add(new Day(21, 8, 2007), 7.10, 7.15, 7.02, 7.07); series.add(new Day(20, 8, 2007), 7.02, 7.19, 6.94, 7.14); final OHLCSeriesCollection seriesCollection = new OHLCSeriesCollection();//保留K线数据的数据集,必须申明为final,后⾯要在匿名内部类⾥⾯⽤到seriesCollection.addSeries(series); TimeSeries series2=new TimeSeries("");//对应时间成交量数据 series2.add(new Day(28, 9, 2007), 260659400/100); series2.add(new Day(27, 9, 2007), 119701900/100); series2.add(new Day(26, 9, 2007), 109719000/100); series2.add(new Day(25, 9, 2007), 178492400/100); series2.add(new Day(24, 9, 2007), 269978500/100); series2.add(new Day(21, 9, 2007), 361042300/100); series2.add(new Day(20, 9, 2007), 173912600/100); series2.add(new Day(19, 9, 2007), 154622600/100); series2.add(new Day(18, 9, 2007), 200661600/100); series2.add(new Day(17, 9, 2007), 312799600/100); series2.add(newDay(14, 9, 2007), 141652900/100); series2.add(new Day(13, 9, 2007), 221260400/100); series2.add(new Day(12, 9, 2007), 274795400/100); series2.add(new Day(11, 9, 2007), 289287300/100); series2.add(new Day(10, 9, 2007), 289063600/100); series2.add(new Day(7, 9, 2007), 351575300/100); series2.add(new Day(6, 9, 2007), 451357300/100); series2.add(new Day(5, 9, 2007), 442421200/100); series2.add(new Day(4, 9, 2007), 671942600/100); series2.add(new Day(3, 9, 2007), 349647800/100); series2.add(new Day(31, 8, 2007), 225339300/100); series2.add(new Day(30, 8, 2007), 160048200/100); series2.add(new Day(29, 8, 2007), 247341700/100); series2.add(new Day(28, 8, 2007), 394975400/100); series2.add(new Day(27, 8, 2007), 475797500/100); series2.add(new Day(24, 8, 2007), 297679500/100); series2.add(new Day(23, 8, 2007), 191760600/100); series2.add(newDay(22, 8, 2007), 232570200/100); series2.add(new Day(21, 8, 2007), 215693200/100); series2.add(new Day(20, 8, 2007), 200287500/100); TimeSeriesCollection timeSeriesCollection=new TimeSeriesCollection();//保留成交量数据的集合timeSeriesCollection.addSeries(series2); //获取K线数据的最⾼值和最低值 int seriesCount = seriesCollection.getSeriesCount();//⼀共有多少个序列,⽬前为⼀个 for (int i = 0; i < seriesCount; i++) { int itemCount = seriesCollection.getItemCount(i);//每⼀个序列有多少个数据项 for (int j = 0; j < itemCount; j++) { if (highValue < seriesCollection.getHighValue(i, j)) {//取第i个序列中的第j个数据项的最⼤值 highValue = seriesCollection.getHighValue(i, j); } if (minValue > seriesCollection.getLowValue(i, j)) {//取第i个序列中的第j个数据项的最⼩值 minValue = seriesCollection.getLowValue(i, j); } }} //获取最⾼值和最低值 int seriesCount2 = timeSeriesCollection.getSeriesCount();//⼀共有多少个序列,⽬前为⼀个 for (int i = 0;i < seriesCount2; i++) { int itemCount = timeSeriesCollection.getItemCount(i);//每⼀个序列有多少个数据项 for (int j = 0; j < itemCount; j++) { if (high2Value < timeSeriesCollection.getYValue(i,j)) {//取第i个序列中的第j个数据项的值 high2Value = timeSeriesCollection.getYValue(i,j); } if (min2Value > timeSeriesCollection.getYValue(i, j)) {//取第i个序列中的第j个数据项的值min2Value = timeSeriesCollection.getYValue(i, j); } }} final CandlestickRenderer candlestickRender=new CandlestickRenderer();//设置K线图的画图器,必须申明为final,后⾯要在匿名内部类⾥⾯⽤到 candlestickRender.setUseOutlinePaint(true); //设置是否使⽤⾃定义的边框线,程序⾃带的边框线的颜⾊不符合中国股票市场的习惯 candlestickRender.setAutoWidthMethod(CandlestickRenderer.WIDTHMETHOD_AVERAGE);//设置如何对K线图的宽度进⾏设定 candlestickRender.setAutoWidthGap(0.001);//设置各个K线图之间的间隔 candlestickRender.setUpPaint(Color.RED);//设置股票上涨的K线图颜⾊ candlestickRender.setDownPaint(Color.GREEN);//设置股票下跌的K线图颜⾊ DateAxis x1Axis=new DateAxis();//设置x轴,也就是时间轴 x1Axis.setAutoRange(false);//设置不采⽤⾃动设置时间范围 try{ x1Axis.setRange(dateFormat.parse("2007-08-20"),dateFormat.parse("2007-09- 29"));//设置时间范围,注意时间的最⼤值要⽐已有的时间最⼤值要多⼀天 }catch(Exception e){ e.printStackTrace(); } x1Axis.setTimeline(SegmentedTimeline.newMondayThroughFridayTimeline());// 设置时间线显⽰的规则,⽤这个⽅法就摒除掉了周六和周⽇这些没有交易的⽇期(很多⼈都不知道有此⽅法),使图形看上去连续x1Axis.setAutoTickUnitSelection(false);//设置不采⽤⾃动选择刻度值 x1Axis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);//设置标记的位置 x1Axis.setStandardTickUnits(DateAxis.createStandardDateTickUnits());//设置标准的时间刻度单位x1Axis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,7));//设置时间刻度的间隔,⼀般以周为单位x1Axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));//设置显⽰时间的格式 NumberAxis y1Axis=new NumberAxis();//设定y轴,就是数字轴 y1Axis.setAutoRange(false);//不不使⽤⾃动设定范围 y1Axis.setRange(minValue*0.9, highValue*1.1);//设定y轴值的范围,⽐最低值要低⼀些,⽐最⼤值要⼤⼀些,这样图形看起来会美观些 y1Axis.setTickUnit(new NumberTickUnit((highValue*1.1-minValue*0.9)/10));//设置刻度显⽰的密度 XYPlot plot1=new XYPlot(seriesCollection,x1Axis,y1Axis,candlestickRender);//设置画图区域对象 XYBarRenderer xyBarRender=new XYBarRenderer(){ private static final long serialVersionUID = 1L;//为了避免出现警告消息,特设定此值 public Paint getItemPaint(int i, int j){//匿名内部类⽤来处理当⽇的成交量柱形图的颜⾊与K线图的颜⾊保持⼀致if(seriesCollection.getCloseValue(i,j)>seriesCollection.getOpenValue(i,j)){//收盘价⾼于开盘价,股票上涨,选⽤股票上涨的颜⾊ return candlestickRender.getUpPaint(); }else{ return candlestickRender.getDownPaint(); } }}; xyBarRender.setMargin(0.1);//设置柱形图之间的间隔 NumberAxis y2Axis=new NumberAxis();//设置Y轴,为数值,后⾯的设置,参考上⾯的y轴设置y2Axis.setAutoRange(false); y2Axis.setRange(min2Value*0.9, high2Value*1.1); y2Axis.setTickUnit(newNumberTickUnit((high2Value*1.1-min2Value*0.9)/4)); XYPlot plot2=new XYPlot(timeSeriesCollection,null,y2Axis,xyBarRender);//建⽴第⼆个画图区域对象,主要此时的 x轴设为了null值,因为要与第⼀个画图区域对象共享x轴 CombinedDomainXYPlot combineddomainxyplot = new CombinedDomainXYPlot(x1Axis);//建⽴⼀个恰当的联合图形区域对象,以x轴为共享轴combineddomainxyplot.add(plot1, 2);//添加图形区域对象,后⾯的数字是计算这个区域对象应该占据多⼤的区域2/3 combineddomainxyplot.add(plot2, 1);//添加图形区域对象,后⾯的数字是计算这个区域对象应该占据多⼤的区域1/3 combineddomainxyplot.setGap(10);//设置两个图形区域对象之间的间隔空间 JFreeChart chart = new JFreeChart("中国联通", JFreeChart.DEFAULT_TITLE_FONT, combineddomainxyplot, false); ChartFrame frame = new ChartFrame("中国联通股票", chart); frame.pack(); frame.setVisible(true); }}为了能够保证K线图的上影线和下影线能够和K线图本⾝的颜⾊保持⼀致,找了很多的⽅法设置都不成功,可以说⽬前暂不提供单独绘制K线边框颜⾊的⽅法,所以,经过本⼈的实验,对其中的源代码进⾏了下修改,具体修改的地⽅是在下载回来的⽂件⽬中source\org\jfree\chart\renderer\ xy\CandlestickRenderer.java⽂件,将 Paint p = getItemPaint(series, item); Paint outlinePaint = null; outlinePaint = getItemOutlinePaint(series, item); }修改为如下的代码,这样就会保证K线图的上影线和下影线能够和K线图本⾝的颜⾊保持⼀致,符合中国股票市场K线图形颜⾊的习惯:Paint p = getItemPaint(series, item); Paint outlinePaint = null; if (eOutlinePaint) { if(yClose>yOpen){ if (this.upPaint != null) { outlinePaint=this.upPaint; } else { outlinePaint=p; } }else{ if (this.downPaint != null) { outlinePaint=this.downPaint; } else { outlinePaint=p; } } }然后使⽤ant集成编译⼯具,编译重新⽣成最新的开发包就可以了,如果各位在使⽤过程中遇到什么问题,欢迎留⾔探讨,也希望这个实例对⼤家有所帮助,等有时间了再给⼤家介绍下jpgraph的K线图的绘制,敬请期待,呵呵!。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 保存为JPEG
// ChartUtilities.writeChartAsJPEG(out, chart, weight, height);
out.flush();
} catch (FileNotFoundException e) {
xyseries2.add(1987, 20);
xyseries2.add(1997, 10D);
xyseries2.add(2007, 40D);
XYSeries xyseries3 = new XYSeries("Three");
xysed(1997, 30.0008);
xyseries3.add(2007, 38.24);
XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
// 创建JFreeChart对象:ChartFactory.createXYLineChart
JFreeChart jfreechart = ChartFactory.createXYLineChart("XYLine Chart Demo", // 标题
// 使用CategoryPlot设置各种参数。以下设置可以省略。
XYPlot plot = (XYPlot) jfreechart.getPlot();
// 背景色 透明度
plot.setBackgroundAlpha(0.5f);
/**
* 创建XYDataset对象
*
*/
private static XYDataset createXYDataset() {
XYSeries xyseries1 = new XYSeries("One");
xySeriesCollection.addSeries(xyseries1);
xySeriesCollection.addSeries(xyseries2);
xySeriesCollection.addSeries(xyseries3);
try {
out.close();
} catch (IOException e) {
// do nothing
xyseries1.add(1987, 50);
xyseries1.add(1997, 20);
xyseries1.add(2007, 30);
XYSeries xyseries2 = new XYSeries("Two");
PlotOrientation.VERTICAL,
true, // legend
false, // tooltips
false); // URLs
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
"年分", // categoryAxisLabel (category轴,横轴,X轴标签)
"数量", // valueAxisLabel(value轴,纵轴,Y轴的标签)
dataset, // dataset
XYDataset dataset = createXYDataset();
//步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置
JFreeChart freeChart = createChart(dataset);
// 前景色 透明度
plot.setForegroundAlpha(0.5f);
// 其它设置可以参考XYPlot类
return jfreechart;
}
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class CreateJFreeChartXYLine {
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
// 保存为文件
public static void saveAsFile(JFreeChart chart, String outputPath,
int weight, int height) {
FileOutputStream out = null;
/**
* 创建JFreeChart LineXY Chart(折线图)
*/
public static void main(String[] args) {
//步骤1:创建XYDataset对象(准备数据)
//步骤3:将JFreeChart对象输出到文件,Servlet输出流等
saveAsFile(freeChart, "F:\\jfreechart\\lineXY.png", 600, 400);
}
try {
File outFile = new File(outputPath);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
out = new FileOutputStream(outputPath);
// 保存为PNG
ChartUtilities.writeChartAsPNG(out, chart, weight, height);
}
}
}
}
// 根据XYDataset创建JFreeChart对象
public static JFreeChart createChart(XYDataset dataset) {
return xySeriesCollection;
}
}
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;