`
远去的渡口
  • 浏览: 472910 次
  • 性别: Icon_minigender_2
  • 来自: 上海转北京
社区版块
存档分类
最新评论

JfreeChart折线图

阅读更多

  在这个公司,用到了太多的JfreeChart,今天就对折线图作一个总结,希望对大家有点帮助,我这里直接是与业务逻辑相关的,业务需要的数据加载到数据集等,不过我会作一些注释的,呵,之前有网友建议写注释。

   折线图,大可分为两种,

(1)X轴值类型为String的。

2)常用的是X轴值是日期的,并且,有时需要满足这样的需求:

1、时间要连续。

2、时间可以设置固定的跨度,比如,2009-02-01,2009-02-04,2009-02-07……

3、由于时间跨度较大,想要做到不同精度的图表,如时间为10天时,以日(yyyy-MM-dd)格式为精度,时间跨度为2个月时,以周(如2009年第3周)为精度,跨度为6个月时,以月(2009年8月)为精度.

下面,针对比较复杂的(2)来讲解:

1、取到业务逻辑需要的数据:(具体过程就不啰嗦了,就是查询数据库,得到想要的字段的值,加载到List里面) 返回List<PressureBean>

PressureBean的包含的属性:

int userId;
	String bpDate;
	String bpTime;
	int syspress;  //收缩压(mmHg)
	int diapress; //舒张压(mmHg)

 

2、加载数据集

public static TimeSeriesCollection createTimeSeries(
			List<PressureBean> list, int dayOrweekOrmonth, Log log, String shou,String shu
			) {

		TimeSeriesCollection timesers = new TimeSeriesCollection();

		int mon = 1;
		int day = 1;
		int ye = 2000;
		int week = 1;

		// 按天显示
		if (dayOrweekOrmonth == 0) {

			TimeSeries timeseries = new TimeSeries(shou,
					org.jfree.data.time.Day.class);
			TimeSeries timeseries1 = new TimeSeries("c1",
					org.jfree.data.time.Day.class);

			TimeSeries timeseriedia = new TimeSeries(shu,
					org.jfree.data.time.Day.class);
			TimeSeries timeseriedia1 = new TimeSeries("d1",
					org.jfree.data.time.Day.class);

			Iterator<PressureBean> it = list.iterator();
			while (it.hasNext()) {
				PressureBean pres = it.next();
				String date = pres.getBpDate();

				ye = Integer.parseInt(date.substring(0, 4));
				mon = Integer.parseInt(date.substring(5, 7));
				day = Integer.parseInt(date.substring(8, date.length()));
				Day days = new Day(day, mon, ye);

				double sys = pres.getSyspress();
				double dia = pres.getDiapress();
				if (sys != -1 && sys > 0) {
					timeseries.add(days, sys);
				} else {
					timeseries1.add(days, null);
				}
				if (sys != -1 && sys > 0) {
					timeseriedia.add(days, dia);
				} else {
					timeseriedia1.add(days, null);
				}

			}

			timesers.addSeries(timeseries);
			timesers.addSeries(timeseriedia);
			timesers.addSeries(timeseries1);
			timesers.addSeries(timeseriedia1);

		} else if (dayOrweekOrmonth == 1) {//按周显示
			TimeSeries timeseries = new TimeSeries(shou,
					org.jfree.data.time.Week.class);
			TimeSeries timeseries1 = new TimeSeries("c1",
					org.jfree.data.time.Week.class);

			TimeSeries timeseriedia = new TimeSeries(shu,
					org.jfree.data.time.Week.class);
			TimeSeries timeseriedia1 = new TimeSeries("d1",
					org.jfree.data.time.Week.class);

			Iterator<PressureBean> it = list.iterator();
			while (it.hasNext()) {
				PressureBean pres = it.next();
				String date = pres.getBpDate();

				String[] spls = date.split("-");
				if (spls.length == 2) {
					ye = Integer.parseInt(spls[0]);
					mon = Integer.parseInt(spls[1]);
				} else {
					log.error("the date of weeks is wrong");
				}

				Week days = new Week(mon, ye);
				double sys = pres.getSyspress();
				double dia = pres.getDiapress();

				if (sys != -1 && sys > 0) {
					timeseries.add(days, sys);
				} else {
					timeseries1.add(days, null);
				}
				if (sys != -1 && sys > 0) {
					timeseriedia.add(days, dia);
				} else {
					timeseriedia1.add(days, null);
				}

			}

			timesers.addSeries(timeseries);
			timesers.addSeries(timeseriedia);
			timesers.addSeries(timeseries1);
			
			timesers.addSeries(timeseriedia1);

		} else {//按月显示
			TimeSeries timeseries = new TimeSeries(shou,
					org.jfree.data.time.Month.class);
			TimeSeries timeseries1 = new TimeSeries("c1",
					org.jfree.data.time.Month.class);

			TimeSeries timeseriedia = new TimeSeries(shu,
					org.jfree.data.time.Month.class);
			TimeSeries timeseriedia1 = new TimeSeries("s",
					org.jfree.data.time.Month.class);

			Iterator<PressureBean> it = list.iterator();
			while (it.hasNext()) {
				PressureBean pres = it.next();
				String date = pres.getBpDate();

				String[] spls = date.split("-");
				if (spls.length == 2) {
					ye = Integer.parseInt(spls[0]);
					mon = Integer.parseInt(spls[1]);
				} else {
					log.error("the date of weeks is wrong");
				}

				Month days = new Month(mon, ye);

				double sys = pres.getSyspress();
				double dia = pres.getDiapress();

				if (sys != -1 && sys > 0) {
					timeseries.add(days, sys);
				} else {
					timeseries1.add(days, null);
				}
				if (sys != -1 && sys > 0) {
					timeseriedia.add(days, dia);
				} else {
					timeseriedia1.add(days, null);
				}

			}
			timesers.addSeries(timeseries);
			timesers.addSeries(timeseriedia);
			timesers.addSeries(timeseries1);
			
			timesers.addSeries(timeseriedia1);

		}

		return timesers;
	}

 

 

3、画折线图,两个数据集,收缩压和舒张压,并且,这两条曲线还各自包含一个区域范围,并不单单是一条基准线,而是一个基准范围

private static JFreeChart createChartPress(XYDataset xydataset,
			int weekOrmonth, String title, String y, String index, String week,
			String year, int searchby, String month, String nodatamess,
			List list, Log log, String bp_shou, String bp_shuzhang) {

		// 有可能用户在后面的版本中故意输入不正常数值,但是为了保证图片画图的完整,这里先计算
		// 用户血压值的最大值。


		double maxpress = 0;
		double addmax = 50;
		double min = 40;

		if (list != null && list.size() > 0) {
			Iterator<PressureBean> it = list.iterator();
			while (it.hasNext()) {
				PressureBean pres = it.next();
				double sys = pres.getSyspress();
				double dia = pres.getDiapress();

				if (maxpress < sys) {
					maxpress = sys;

				}

				if (maxpress < dia)
					maxpress = dia;

				if (min > sys) {
					min = sys;
				}

				if (min > dia)
					min = dia;

			}

			maxpress += addmax;
			min -= 10;


			log.info("high press value is =" + maxpress);

		}
		
		if (xydataset != null) {
			int counts = xydataset.getItemCount(0);
			if (counts == 0) {
				xydataset = null;
			}
		}

		JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(title, "",
				y, xydataset, true, true, false);
		jfreechart.setBackgroundPaint(Color.white);
		

		// 设置标题的颜色
		TextTitle text = new TextTitle(title);
		text.setPaint(new Color(102, 102, 102));
		jfreechart.setTitle(text);
		XYPlot xyplot = jfreechart.getXYPlot();
		xyplot.setBackgroundPaint(new Color(255, 253, 246));
		xyplot.setOutlineStroke(new BasicStroke(1.5f)); // 边框粗细
		ValueAxis vaxis = xyplot.getDomainAxis();
		vaxis.setAxisLineStroke(new BasicStroke(1.5f)); // 坐标轴粗细
		vaxis.setAxisLinePaint(new Color(215, 215, 215)); // 坐标轴颜色
		xyplot.setOutlineStroke(new BasicStroke(1.5f)); // 边框粗细
		vaxis.setLabelPaint(new Color(10, 10, 10)); // 坐标轴标题颜色
		vaxis.setTickLabelPaint(new Color(102, 102, 102)); // 坐标轴标尺值颜色
		vaxis.setLowerMargin(0.06d);// 分类轴下(左)边距
		vaxis.setUpperMargin(0.14d);// 分类轴下(右)边距,防止最后边的一个数据靠近了坐标轴。
		
		//X轴为日期格式,这里是专门的处理日期的类,
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();
		if (weekOrmonth == 0) {//以天为刻度,时间格式为yyyy-MM-dd,如2008-02-06
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 1, format));
		} else if (weekOrmonth == 1) {//以周为刻度,时间显示为 2009年第4周((这里是SimpleDateFormat的用法,
			//这里为了作繁体版,英文版和简体版,用了国际化处理,将这些可变的资源在文字资源里面,注意一下,这里的y,M、w是SimpleDateFormat的关键字,
			//如英文表示09年第3周就是09W3,那么,这里的W需要用‘’引起来)
			format = new SimpleDateFormat("yyyy" + year + index + "w" + week);
			dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY, 7, format));
		} else if (weekOrmonth == 2) {//以月为刻度,时间显示为09-02 (09年2月)
			format = new SimpleDateFormat("yy-MM");
			dateaxis
					.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1, format));

		}
		dateaxis.setVerticalTickLabels(false); // 设为true表示横坐标旋转到垂直。
		if (searchby == 6 || searchby == 3) {
			dateaxis.setAutoTickUnitSelection(true); // 由于横轴标签过多,这里设置为自动格式 。
			dateaxis.setDateFormatOverride(format);
		}
		dateaxis.setTickMarkPosition(DateTickMarkPosition.START);

		ValueAxis valueAxis = xyplot.getRangeAxis();
		valueAxis.setUpperBound(maxpress);
		valueAxis.setAutoRangeMinimumSize(1);
		valueAxis.setLowerBound(min);
		valueAxis.setAutoRange(false);

		valueAxis.setAxisLineStroke(new BasicStroke(1.5f)); // 坐标轴粗细
		valueAxis.setAxisLinePaint(new Color(215, 215, 215)); // 坐标轴颜色
		valueAxis.setLabelPaint(new Color(10, 10, 10)); // 坐标轴标题颜色
		valueAxis.setTickLabelPaint(new Color(102, 102, 102)); // 坐标轴标尺值颜色
		
		xyplot.setRangeGridlinesVisible(true);
		xyplot.setDomainGridlinesVisible(true);
		xyplot.setRangeGridlinePaint(Color.LIGHT_GRAY);
		xyplot.setDomainGridlinePaint(Color.LIGHT_GRAY);
		xyplot.setBackgroundPaint(new Color(255, 253, 246));
		xyplot.setNoDataMessage(nodatamess);//没有数据时显示的文字说明。
		xyplot.setNoDataMessageFont(new Font("", Font.BOLD, 14));//字体的大小,粗体。
		xyplot.setNoDataMessagePaint(new Color(87, 149, 117));//字体颜色
		xyplot.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 5d)); //

		// add range marker(舒张压的区域marker,范围是从62到81)

		double lowpress = 62;
		double uperpress = 81;
		IntervalMarker intermarker = new IntervalMarker(lowpress, uperpress);
		intermarker.setPaint(Color.decode("#66FFCC"));// 域顏色
		
		intermarker.setLabelFont(new Font("SansSerif", 41, 14));
		intermarker.setLabelPaint(Color.RED);
		intermarker.setLabel(bp_shuzhang);

		if (xydataset != null) {
			xyplot.addRangeMarker(intermarker, Layer.BACKGROUND);
		}
    //(收缩压的区域marker,范围是从102到120)
		double lowpress1 = 102;
		double uperpress1 = 120;
		IntervalMarker inter = new IntervalMarker(lowpress1, uperpress1);
		inter.setLabelOffsetType(LengthAdjustmentType.EXPAND);
		inter.setPaint(Color.decode("#66FFCC"));// 域顏色


		inter.setLabelFont(new Font("SansSerif", 41, 14));
		inter.setLabelPaint(Color.RED);
		inter.setLabel(bp_shou);
		
		if (xydataset != null) {
			xyplot.addRangeMarker(inter, Layer.BACKGROUND); // 加上Layer.BACKGROUND,将maker调到折线下面。
		}

		XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot
				.getRenderer();
		//第一条折线的颜色
		xylineandshaperenderer.setBaseItemLabelsVisible(true);
		xylineandshaperenderer.setSeriesFillPaint(0, new Color(127, 128, 0));
		xylineandshaperenderer.setSeriesPaint(0, new Color(127, 128, 0));

		xylineandshaperenderer.setSeriesShapesVisible(0, true);
		xylineandshaperenderer.setSeriesShapesVisible(1, true);

		//第二条折线的颜色
		xylineandshaperenderer.setSeriesFillPaint(1, new Color(254, 103, 0));
		xylineandshaperenderer.setSeriesPaint(1, new Color(254, 103, 0));
		xylineandshaperenderer.setSeriesShapesVisible(1, true);
		xylineandshaperenderer.setSeriesVisible(2, false);//
		xylineandshaperenderer.setSeriesVisible(3, false);//不显示下面标题

		//折线的粗细调
		StandardXYToolTipGenerator xytool = new StandardXYToolTipGenerator();
		xylineandshaperenderer.setToolTipGenerator(xytool);
		xylineandshaperenderer.setStroke(new BasicStroke(1.5f));

		// 显示节点的值
		xylineandshaperenderer.setBaseItemLabelsVisible(true);
		xylineandshaperenderer
				.setBasePositiveItemLabelPosition(new ItemLabelPosition(
						ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
		xylineandshaperenderer
				.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
		xylineandshaperenderer.setBaseItemLabelPaint(new Color(102, 102, 102));// 显示折点数值字体的颜色

		return jfreechart;
	}

 
4、将图片URL返回到页面

public static void drawPressLineChart(IrisIoInterface io, Log log,
			TimeSeriesCollection timesers, int weekormonth, String title,
			String y, String index, String week, String year, int searchby,
			String month, String nodatamess, List list, String bp_shou,
			String bp_shuzhang) {

		JFreeChart chart = createChartPress(timesers, weekormonth, title, y,
				index, week, year, searchby, month, nodatamess, list, log,
				bp_shou, bp_shuzhang);

		HttpServletRequest request = io.getRequest();
		String filename = "";
		String graphURL = "";
		try {
			filename = ServletUtilities.saveChartAsPNG(chart, 650, 280, null,
					io.getSession());
			graphURL = request.getContextPath() + "/displayChart?filename="
					+ filename;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			log.error(e);
		}

		io.setData("filename1", filename, BeanShare.BEAN_SHARE_REQUEST);
		io.setData("presslineurl", graphURL, BeanShare.BEAN_SHARE_REQUEST);

	}

 

效果图如下:

以天为刻度:

以周为刻度:

以月为刻度:

15
1
分享到:
评论
4 楼 blackartanan 2011-01-14  
写的非常非常好 多谢博主
3 楼 yi_17328214 2010-01-11  
  
2 楼 weijavamen 2009-09-22  
注释啊!什么都没!哈哈
1 楼 deathin 2009-08-18  
..

相关推荐

    jfreechart 折线图的一个例子

    **JFreeChart 折线图实例详解** JFreeChart 是一个强大的 Java 图形库,它提供了丰富的图表类型,包括折线图、柱状图、饼图等,适用于各种数据分析和展示场景。在这个例子中,我们将深入探讨如何使用 JFreeChart ...

    jfreechart折线图demo

    在这个“jfreechart折线图demo”中,我们将深入探讨如何使用 JFreeChart 创建和展示折线图。 1. **JFreeChart 概述** JFreeChart 提供了一套完整的 API,使得开发者可以方便地生成高质量的静态图表,并能轻松地将...

    jfreechart 折线图 应用

    该程序为main 函数,定义了三个方法,分别是jfreechart三种实现折线图的类型,返回的是一个chart 本程序是把图片保存到本地,当然实际应用中,只要在程序和页面中做相关配置即可以使用。 因为图片带点透明,所以...

    jfreechart折线图读取数据库数据的显示(mysql)

    在Java编程环境中,JFreeChart库是一个非常强大的工具,用于创建各种类型的图表,包括折线图、柱状图、饼图等。本教程将详细讲解如何利用JFreeChart结合MySQL数据库来生成动态折线图,展示数据库中的数据。 首先,...

    jfreechart折线图.zip

    ValueStack vs=(ValueStack)request.getAttribute("struts.valueStack"); List list=(List)vs.findValue("list"); Iterator itor=list.iterator(); while(itor.hasNext()) { ... &lt;%} %&gt;

    jfreechart 漂亮的折线图

    利用jfreechart绘制的漂亮的折线图,实现双纵坐标,折线点标签还带箭头指示,非常直观,需要提前下载jfreechart.jar文件,否则我的类会报错,也即是要配置运行环境

    JFreeChart 折线、柱状组合图

    public JFreeChart createChart(String Ytitle, String title, CategoryDataset lineData, CategoryDataset barData) { //参考附件 return chart; } //struts 部分 &lt;!--begin 维优特例 --&gt; ...

    JSP利用JFreeChart生成折线图

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术,而JFreeChart则是一个强大的Java图表库,能够帮助开发者生成各种复杂的图表,包括折线图。本教程将详细介绍如何在JSP中利用JFreeChart库来...

    jfreechart 堆栈柱状图跟折线图结合拼接

    jfreechart 堆栈柱状图跟折线图结合拼接 jar包请戳http://download.csdn.net/detail/a156435646/7424707

    JFreeChart折线图的生成方法

    JFreeChart折线图的生成方法 JFreeChart是一款功能强大且广泛使用的图表类库,它可以生成多种类型的图表,如饼图、柱状图、散点图、时序图、甘特图等等。今天,我们将详细介绍JFreeChart折线图的生成方法。 首先,...

    JFreeChart饼图、折线图等资料学习

    JFreeChart是一款强大的Java图形库,它允许开发者创建多种类型的图表,包括饼图、折线图、柱状图、散点图以及更多其他类型的图表。这个资料包包含了JFreeChart的核心库(jfreechart-1.0.16.jar)和其依赖库JCommon...

    JFreeChart双Y轴折线图实例,可以直接运行

    JFreeChart双Y轴折线图实例,可以直接运行,实例类为LineChartDemo1.JAVA,有注释。 若想在web工程使用只需如下。 String filename = ServletUtilities.saveChartAsPNG(jfreechart, 600, 400, null, session); ...

    jfreechart 折线图、饼状图、柱状图

    JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的图表,包括折线图、饼状图和柱状图等,这些图表广泛应用于数据分析、报表展示以及Web应用程序中。本项目提供了一个实例,展示了如何在Web页面上使用...

    jfreechart根据24小时数据画折线图

    ### jfreechart根据24小时数据画折线图 #### 一、jfreechart简介 jfreechart是一款基于Java的开源图表绘制库,它能够帮助开发者轻松地在应用程序中生成各种图表,包括折线图、饼图、柱状图等。它的主要优势在于...

    jfreechart绘制折线图(平面和3D)

    JFreeChart是一款强大的Java图形库,它允许开发者创建多种类型的图表,包括折线图、柱状图、饼图、散点图等。在本主题中,我们将深入探讨如何使用JFreeChart来绘制平面和3D的折线图。 首先,让我们了解折线图的基本...

    jfreechart 生成折线图,饼图,柱状图,堆栈柱状图

    JFreeChart 是一个开源的Java库,用于生成高质量的2D图表,如折线图、饼图、柱状图和堆栈柱状图等。它广泛应用于数据分析、报告和应用程序中,提供丰富的自定义选项来满足各种视觉需求。在本项目中,你将找到能够...

    java JXL导入导出Excel源码及jfreechart 生成折线图,饼图

    java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图 java JXL导出Excel源码及jfreechart 生成折线图,饼图

    JFreeChart 让X轴的标题竖着显示

    在Java编程环境中,JFreeChart库是一个非常强大的工具,用于创建各种类型的图表,如柱状图、饼图、线图等。如果你需要让X轴的标题在图表中竖直显示,而不是默认的水平显示,这通常是为了更好地适应有限的空间或者...

    jfreechart绘制的风速风向玫瑰图

    jfreechart是Java中一个流行的图表库,它提供了许多种类的图表,包括柱状图、折线图、饼图、雷达图等。本文主要介绍如何使用jfreechart绘制风速风向玫瑰图。 首先,了解jfreechart的基本结构。jfreechart的核心是...

Global site tag (gtag.js) - Google Analytics