java作折线图(转)
引入两jar包:
jcommon-1.0.16.jar
jfreechart-1.0.13.jar
?
直接上代码:
package com.potevio.rnd.tobacco.mine;import java.awt.Font;import java.awt.RenderingHints;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.StandardChartTheme;import org.jfree.data.time.TimeSeriesCollection;/** * @description 构造数据,测试图片生成 * @author Zhou-Jingxian */public class Main { public static void main(String[] args) { TimeSeriesChartUtil util = new TimeSeriesChartUtil("month", "服务端失败率变化曲线图", "2013-4-21至2013-4-27", "时间", "失败率"); List<Bean> datalist = new ArrayList<Bean>(); Bean bean1 = new Bean(); bean1.setGoods_name("中华"); Map<String,Double> priceindexMap1 = new HashMap<String,Double>(); priceindexMap1.put("2013-04-21", 0.23); priceindexMap1.put("2013-04-22", 0.24); priceindexMap1.put("2013-04-23", 0.23); priceindexMap1.put("2013-04-24", 0.22); priceindexMap1.put("2013-04-25", 0.23); priceindexMap1.put("2013-04-26", 0.24); priceindexMap1.put("2013-04-27", 0.23); bean1.setPriceindexMap(priceindexMap1); datalist.add(bean1); // Bean bean2 = new Bean();// bean2.setGoods_name("芙蓉王");// Map<String,Double> priceindexMap2 = new HashMap<String,Double>();// priceindexMap2.put("200903", 100.12);// priceindexMap2.put("200904", 100.2);// priceindexMap2.put("200905", 100.0);// priceindexMap2.put("200906", 100.08);// priceindexMap2.put("200907", 100.12);// priceindexMap2.put("200908", 100.2);// priceindexMap2.put("200909", 100.0);// priceindexMap2.put("200910", 100.08);// bean2.setPriceindexMap(priceindexMap2);// datalist.add(bean2);// // Bean bean3 = new Bean();// bean3.setGoods_name("云烟");// Map<String,Double> priceindexMap3 = new HashMap<String,Double>();// priceindexMap3.put("200903", 99.77);// priceindexMap3.put("200904", 99.7);// priceindexMap3.put("200905", 99.83);// priceindexMap3.put("200906", 99.93);// priceindexMap3.put("200907", 99.77);// priceindexMap3.put("200908", 99.7);// priceindexMap3.put("200909", 99.83);// priceindexMap3.put("200910", 99.93);// bean3.setPriceindexMap(priceindexMap3);// datalist.add(bean3); //步骤1:创建XYDataset对象(准备数据) TimeSeriesCollection dataset = util.createDataset(datalist); //步骤2:根据Dataset 生成JFreeChart对象,以及做相应的设置 JFreeChart freeChart = util.createChart(dataset); //步骤3:将JFreeChart对象输出到文件,Servlet输出流等 util.saveAsFile(freeChart, "D:\\test\\chenwenbiao_qx.png"); } }
?
?
package com.potevio.rnd.tobacco.mine;import java.awt.Color;import java.awt.Font;import java.awt.GradientPaint;import java.awt.RenderingHints;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.StandardChartTheme;import org.jfree.chart.labels.ItemLabelAnchor;import org.jfree.chart.labels.ItemLabelPosition;import org.jfree.chart.labels.StandardXYItemLabelGenerator;import org.jfree.chart.plot.XYPlot;import org.jfree.chart.renderer.xy.XYItemRenderer;import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;import org.jfree.chart.title.TextTitle;import org.jfree.data.time.Day;import org.jfree.data.time.TimeSeries;import org.jfree.data.time.TimeSeriesCollection;import org.jfree.ui.RectangleInsets;import org.jfree.ui.TextAnchor;/** * @description 使用JFreeChart组建,生成一个价格随日期的走势图表 * @author Zhou-Jingxian */public class TimeSeriesChartUtil {private String type;// month,yearprivate int width;// 后台计算private int height;// 后台计算private String title;// 图表的主标题private String subTitle;// 图表的子标题private String xName;// 可默认值:月份private String yName;// 可默认值:价格指数/*************************************************************************** * constructor function * * @param type * @param title * @param subTitle * @param xName * @param yName */public TimeSeriesChartUtil(String type, String title, String subTitle,String xName, String yName) {this.type = type;this.title = title;this.subTitle = subTitle;this.xName = xName;this.yName = yName;if ("month".equals(type)) {this.width = 800;this.height = 600;} else if ("year".equals(type)) {this.width = 600;this.height = 400;}}/** 根据TimeSeriesCollection创建JFreeChart对象 */public JFreeChart createChart(TimeSeriesCollection dataset) {//设置主题解决乱码 StandardChartTheme theme = new StandardChartTheme("unicode") { public void apply(JFreeChart chart) { chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); super.apply(chart); } }; theme.setExtraLargeFont(new Font("宋体", Font.PLAIN, 20)); theme.setLargeFont(new Font("宋体", Font.PLAIN, 14)); theme.setRegularFont(new Font("宋体", Font.PLAIN, 12)); theme.setSmallFont(new Font("宋体", Font.PLAIN, 10)); ChartFactory.setChartTheme(theme);JFreeChart chart = ChartFactory.createTimeSeriesChart(this.title,this.xName, this.yName, dataset, true, true, true);XYPlot plot = (XYPlot) chart.getPlot();XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) plot.getRenderer();// 设置网格背景颜色plot.setBackgroundPaint(Color.white);// 设置网格竖线颜色plot.setDomainGridlinePaint(Color.pink);// 设置网格横线颜色plot.setRangeGridlinePaint(Color.pink);// 设置曲线图与xy轴的距离plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));// 设置曲线是否显示数据点xylineandshaperenderer.setBaseShapesVisible(true);// 设置曲线显示各数据点的值XYItemRenderer xyitem = plot.getRenderer();xyitem.setBaseItemLabelsVisible(true);xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 14));plot.setRenderer(xyitem);// 设置子标题TextTitle subtitle = new TextTitle(this.subTitle, new Font("黑体",Font.BOLD, 12));chart.addSubtitle(subtitle);// 设置主标题chart.setTitle(new TextTitle(this.title,new Font("隶书", Font.ITALIC, 15)));// 设置背景颜色chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0, 1000,Color.blue));chart.setAntiAlias(true);return chart;}/** 创建TimeSeriesCollection对象 */public TimeSeriesCollection createDataset(List<Bean> datalist) {// 时间曲线数据集合TimeSeriesCollection lineDataset = new TimeSeriesCollection();for (int i = 0; i < datalist.size(); i++) {Bean bean = datalist.get(i);TimeSeries series = new TimeSeries(bean.getGoods_name(),Day.class);Map<String, Double> pimap = bean.getPriceindexMap();Set piset = pimap.entrySet();Iterator piIterator = piset.iterator();while (piIterator.hasNext()) {Map.Entry<String, Double> hiddenMapEntry = (Map.Entry<String, Double>) piIterator.next();String key = hiddenMapEntry.getKey();int year = Integer.parseInt(key.substring(0, 4));int month = Integer.parseInt(key.substring(5, 7));int day = Integer.parseInt(key.substring(8,10));System.out.println("year:" + year + "\tmonth:" + month + "\tday:" + day);series.add(new Day(day , month , year), hiddenMapEntry.getValue());}lineDataset.addSeries(series);}return lineDataset;}/** 保存为文件 */public void saveAsFile(JFreeChart chart, String outputPath) {FileOutputStream out = null;try {File outFile = new File(outputPath);if (!outFile.getParentFile().exists()) {outFile.getParentFile().mkdirs();}out = new FileOutputStream(outputPath);// 保存为PNGChartUtilities.writeChartAsPNG(out, chart, width, height);// 保存为JPEG// ChartUtilities.writeChartAsJPEG(out, chart, width, height);out.flush();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {// do nothing}}}}public int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public String getXName() {return xName;}public void setXName(String name) {xName = name;}public String getYName() {return yName;}public void setYName(String name) {yName = name;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getSubTitle() {return subTitle;}public void setSubTitle(String subTitle) {this.subTitle = subTitle;}}
?
package com.potevio.rnd.tobacco.mine;import java.util.Map;/** * @description 数据BEAN * @author Zhou-Jingxian */public class Bean { private String goods_name ; private Map<String,Double> priceindexMap; public String getGoods_name() { return goods_name; } public void setGoods_name(String goods_name) { this.goods_name = goods_name; } public Map<String, Double> getPriceindexMap() { return priceindexMap; } public void setPriceindexMap(Map<String, Double> priceindexMap) { this.priceindexMap = priceindexMap; } }
?
改自:java报表折线图
?
出现如下错误:
Exception?in?thread?"main"?java.lang.NoSuchMethodError:?org.jfree.ui.RectangleInsets.<init>(DDDD)V
原因:
jdk的版本太低了,jfreechart必须在1.0.13以上,jdk必须在1.4.0.b8以上
jcommon.jar?换成?jcommon-1.0.16.jar后在jdk1.4.0.6上跑也ok
jfreechart_1.0.13.jar