JFreeChart生成条形统计图(柱形图)

来源:互联网 发布:高大上ppt制作技巧知乎 编辑:程序博客网 时间:2024/05/11 06:00

最近一个项目中用到JFreeChart,我的代码。 注释比较全,自己看。

后面带效果图

我的实现方法是 在 实现类 里调用 专用来生成统计图 的方法。

参数传过的是来用于生成统计图的数值。

返回所生成图片的名称

package com.zhh.util;import java.awt.Color;import java.awt.Font;import java.io.File;import java.io.IOException;import java.text.DecimalFormat;import java.util.Iterator;import java.util.List;import java.util.Map;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartFrame;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.AxisLocation;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.NumberAxis;import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.renderer.category.BarRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.DefaultCategoryDataset;import com.brief.pojo.InfeNumDTO;import com.brief.pojo.TranMsg;/* *author zhh */public class CreatePic {/* * 升降比的柱形图 * 参数indList<InfeNumDTO>  ind.infeName=病名 ind.infeNum=升降比*10000(转成int型) * tmsg.nameX x轴名称  tmsg.nameY y轴名字  msg  date * return 方法所生成图片的名称 */public String getBarChart(List<InfeNumDTO> indList, TranMsg tmsg) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();Iterator<InfeNumDTO> it = indList.iterator();while (it.hasNext()){InfeNumDTO ind = it.next();String key = ind.getInfeName();Double value = Double.valueOf(ind.getInfeNum())/100;if (value != 10000){  //不是新增病种才统计dataset.addValue(value, key, key);   //转成两位小树的百分百} else{dataset.addValue(null, "均为新增病种", "均为新增病种");}}String msg = tmsg.getMsg();String picTitle = ""; //统计图名称String picName = ""; //生成图片名称if (msg.equals("与上月")) {picTitle = "本月甲乙类传染病与上月相比较";picName = "compMon" + tmsg.getDate() + ".jpg";} else if (msg.equals("与去年")) {picTitle = "本月甲乙类传染病与去年同期相比较";picName = "compYear" + tmsg.getDate() + ".jpg";}JFreeChart chart = ChartFactory.createBarChart(picTitle, // 标题tmsg.getNameX(), // X轴tmsg.getNameY(), // Y轴dataset, // datasetPlotOrientation.HORIZONTAL, // 图表方向:水平、垂直true, // 是否显示图例   true, // 是否显示工具提示   true); // 是否生成URL   CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();CategoryAxis domainAxis = categoryplot.getDomainAxis();TextTitle textTitle = chart.getTitle();//将X轴显示在下方categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//设置X轴参数格式DecimalFormat df = new DecimalFormat("0.00");numberaxis.setNumberFormatOverride(df);// 柱图的呈现器BarRenderer renderer = new BarRenderer();renderer.setIncludeBaseInRange(true); // 显示每个柱的数值,并修改该数值的字体属性renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框颜色 renderer.setDrawBarOutline(true); // 设置柱子边框可见renderer.setItemMargin(0.05);// 组内柱子间隔为组宽的10%renderer.setMaximumBarWidth(0.05);//设置条形柱最大宽度renderer.setBaseItemLabelsVisible(true, true);//设置正数柱子是黑色,负数是白色for (int i=0;i<indList.size();i++){int num = indList.get(i).getInfeNum();if (num > 0){renderer.setSeriesPaint(i,Color.black);} else {renderer.setSeriesPaint(i,Color.white);}}categoryplot.setRenderer(renderer); // 给柱图添加呈现器textTitle.setFont(new Font("黑体", Font.PLAIN, 20));domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 14));numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 14));numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 14));chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 14));ChartFrame frame = new ChartFrame(picTitle, chart);frame.pack();//      frame.setVisible(true);  String path = this.getClass().getResource("").getPath();int index = path.indexOf("WEB-INF");String imgPath = path.substring(1, index) + "StatImg/";try {ChartUtilities.saveChartAsJPEG(new File(imgPath + picName), chart,640, 480);} catch (IOException e) {e.printStackTrace();}System.out.println("升降比统计图" + picName + "生成完成");return picName;}/* *  升降数的柱形图 *  参数 map 存 msg : 三期发病数   keyList 按大到小的顺序寸的key  *  返回  生成图片名称 */public String getNumBarChart(Map<String, List<Integer>> map, List<String> keyList, TranMsg tmsg) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();String picTitle = ""; //统计图名称String picName = ""; //生成图片名称String msg = tmsg.getMsg();if (msg.equals("按病种")) {picTitle = "本月甲乙类传染病与上月及去年同期发病数相比较";picName = "compMY" + tmsg.getDate() + ".jpg";} else if (msg.equals("按街道")) {picTitle = "本月各街道甲乙类传染病与上月及去年同期相比较";picName = "compArea" + tmsg.getDate() + ".jpg";}Iterator<String> it = keyList.iterator();while(it.hasNext()){String key = it.next();List<Integer> vList = map.get(key);    dataset.addValue(vList.get(0), "本月", key);    dataset.addValue(vList.get(1), "上月", key);    dataset.addValue(vList.get(2), "去年同期", key);}JFreeChart chart = ChartFactory.createBarChart(picTitle, // 标题tmsg.getNameX(), // X轴tmsg.getNameY(), // Y轴dataset, // datasetPlotOrientation.VERTICAL, // 图表方向:水平、垂直true, // 是否显示图例   true, // 是否显示工具提示   true); // 是否生成URL   CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();CategoryAxis domainAxis = categoryplot.getDomainAxis();TextTitle textTitle = chart.getTitle();//domainAxis.setLowerMargin(0.05);  //与左边的空区//domainAxis.setUpperMargin(0.05);  //右边的空区//domainAxis.setCategoryMargin(0.04); //不同类别间的间距// 柱图的呈现器BarRenderer renderer = new BarRenderer();//        renderer.setIncludeBaseInRange(true);     // 显示每个柱的数值,并修改该数值的字体属性renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());renderer.setBaseItemLabelsVisible(true);renderer.setBaseOutlinePaint(Color.BLACK); // 设置柱子边框颜色 renderer.setDrawBarOutline(true); // 设置柱子边框可见renderer.setMaximumBarWidth(0.05);//设置柱子最大宽度//柱子最大宽度设置,会使下面设置柱子间距离方法失效renderer.setItemMargin(0);  // 设置同key  三时期的柱子间距离categoryplot.setRenderer(renderer);textTitle.setFont(new Font("黑体", Font.PLAIN, 20));domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));numberaxis.setLabelFont(new Font("黑体", Font.PLAIN, 12));chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));ChartFrame frame = new ChartFrame(picTitle, chart);frame.pack();String path = this.getClass().getResource("").getPath();int index = path.indexOf("WEB-INF");String imgPath = path.substring(1, index) + "StatImg/";try {ChartUtilities.saveChartAsJPEG(new File(imgPath + picName), chart,640, 480);} catch (IOException e) {e.printStackTrace();}System.out.println("发病数统计图" + picName + "生成完成");return picName;}}



---------------------------------------------------------------------------------------------------

今天将前面做的生成统计图 整合进公司项目,发现 jfreechart统计图全部变成了暗红色

最终找到原因: jfreechart jar包版本不同

我用的  jfreechart-1.0.13.jar ,项目用的是1.0.9.jar.


解决方法:

1.升级 jar包

2.saveChartAsJPEG改为saveChartAsPNG

	
				
		
原创粉丝点击