`

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,year
	private 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);
			// 保存为PNG
			ChartUtilities.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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics