日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

如何使用JFreeChart实现折线图

發布時間:2023/12/19 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 如何使用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的包含的屬性:

intuserId;StringbpDate;StringbpTime;intsyspress;//收縮壓(mmHg)intdiapress;//舒張壓(mmHg)

2、加載數據集

publicstaticTimeSeriesCollectioncreateTimeSeries(List<PressureBean>list,intdayOrweekOrmonth,Loglog,Stringshou,Stringshu){TimeSeriesCollectiontimesers=newTimeSeriesCollection();intmon=1;intday=1;intye=2000;intweek=1;//按天顯示if(dayOrweekOrmonth==0){TimeSeriestimeseries=newTimeSeries(shou,org.jfree.data.time.Day.class);TimeSeriestimeseries1=newTimeSeries("c1",org.jfree.data.time.Day.class);TimeSeriestimeseriedia=newTimeSeries(shu,org.jfree.data.time.Day.class);TimeSeriestimeseriedia1=newTimeSeries("d1",org.jfree.data.time.Day.class);Iterator<PressureBean>it=list.iterator();while(it.hasNext()){PressureBeanpres=it.next();Stringdate=pres.getBpDate();ye=Integer.parseInt(date.substring(0,4));mon=Integer.parseInt(date.substring(5,7));day=Integer.parseInt(date.substring(8,date.length()));Daydays=newDay(day,mon,ye);doublesys=pres.getSyspress();doubledia=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);}elseif(dayOrweekOrmonth==1){//按周顯示TimeSeriestimeseries=newTimeSeries(shou,org.jfree.data.time.Week.class);TimeSeriestimeseries1=newTimeSeries("c1",org.jfree.data.time.Week.class);TimeSeriestimeseriedia=newTimeSeries(shu,org.jfree.data.time.Week.class);TimeSeriestimeseriedia1=newTimeSeries("d1",org.jfree.data.time.Week.class);Iterator<PressureBean>it=list.iterator();while(it.hasNext()){PressureBeanpres=it.next();Stringdate=pres.getBpDate();String[]spls=date.split("-");if(spls.length==2){ye=Integer.parseInt(spls[0]);mon=Integer.parseInt(spls[1]);}else{log.error("thedateofweeksiswrong");}Weekdays=newWeek(mon,ye);doublesys=pres.getSyspress();doubledia=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{//按月顯示TimeSeriestimeseries=newTimeSeries(shou,org.jfree.data.time.Month.class);TimeSeriestimeseries1=newTimeSeries("c1",org.jfree.data.time.Month.class);TimeSeriestimeseriedia=newTimeSeries(shu,org.jfree.data.time.Month.class);TimeSeriestimeseriedia1=newTimeSeries("s",org.jfree.data.time.Month.class);Iterator<PressureBean>it=list.iterator();while(it.hasNext()){PressureBeanpres=it.next();Stringdate=pres.getBpDate();String[]spls=date.split("-");if(spls.length==2){ye=Integer.parseInt(spls[0]);mon=Integer.parseInt(spls[1]);}else{log.error("thedateofweeksiswrong");}Monthdays=newMonth(mon,ye);doublesys=pres.getSyspress();doubledia=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);}returntimesers;}

3、畫折線圖,兩個數據集,收縮壓和舒張壓,并且,這兩條曲線還各自包含一個區域范圍,并不單單是一條基準線,而是一個基準范圍。

privatestaticJFreeChartcreateChartPress(XYDatasetxydataset,intweekOrmonth,Stringtitle,Stringy,Stringindex,Stringweek,Stringyear,intsearchby,Stringmonth,Stringnodatamess,Listlist,Loglog,Stringbp_shou,Stringbp_shuzhang){//有可能用戶在后面的版本中故意輸入不正常數值,但是為了保證圖片畫圖的完整,這里先計算//用戶血壓值的***值。doublemaxpress=0;doubleaddmax=50;doublemin=40;if(list!=null&&list.size()>0){Iterator<PressureBean>it=list.iterator();while(it.hasNext()){PressureBeanpres=it.next();doublesys=pres.getSyspress();doubledia=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("highpressvalueis="+maxpress);}if(xydataset!=null){intcounts=xydataset.getItemCount(0);if(counts==0){xydataset=null;}}JFreeChartjfreechart=ChartFactory.createTimeSeriesChart(title,"",y,xydataset,true,true,false);jfreechart.setBackgroundPaint(Color.white);//設置標題的顏色TextTitletext=newTextTitle(title);text.setPaint(newColor(102,102,102));jfreechart.setTitle(text);XYPlotxyplot=jfreechart.getXYPlot();xyplot.setBackgroundPaint(newColor(255,253,246));xyplot.setOutlineStroke(newBasicStroke(1.5f));//邊框粗細ValueAxisvaxis=xyplot.getDomainAxis();vaxis.setAxisLineStroke(newBasicStroke(1.5f));//坐標軸粗細vaxis.setAxisLinePaint(newColor(215,215,215));//坐標軸顏色xyplot.setOutlineStroke(newBasicStroke(1.5f));//邊框粗細vaxis.setLabelPaint(newColor(10,10,10));//坐標軸標題顏色vaxis.setTickLabelPaint(newColor(102,102,102));//坐標軸標尺值顏色vaxis.setLowerMargin(0.06d);//分類軸下(左)邊距vaxis.setUpperMargin(0.14d);//分類軸下(右)邊距,防止***邊的一個數據靠近了坐標軸。//X軸為日期格式,這里是專門的處理日期的類,SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd");DateAxisdateaxis=(DateAxis)xyplot.getDomainAxis();if(weekOrmonth==0){//以天為刻度,時間格式為yyyy-MM-dd,如2008-02-06dateaxis.setTickUnit(newDateTickUnit(DateTickUnit.DAY,1,format));}elseif(weekOrmonth==1){//以周為刻度,時間顯示為2009年第4周((這里是SimpleDateFormat的用法,//這里為了作繁體版,英文版和簡體版,用了國際化處理,將這些可變的資源在文字資源里面,注意一下,這里的y,M、w是SimpleDateFormat的關鍵字,//如英文表示09年第3周就是09W3,那么,這里的W需要用&lsquo;&rsquo;引起來)format=newSimpleDateFormat("yyyy"+year+index+"w"+week);dateaxis.setTickUnit(newDateTickUnit(DateTickUnit.DAY,7,format));}elseif(weekOrmonth==2){//以月為刻度,時間顯示為09-02(09年2月)format=newSimpleDateFormat("yy-MM");dateaxis.setTickUnit(newDateTickUnit(DateTickUnit.MONTH,1,format));}dateaxis.setVerticalTickLabels(false);//設為true表示橫坐標旋轉到垂直。if(searchby==6||searchby==3){dateaxis.setAutoTickUnitSelection(true);//由于橫軸標簽過多,這里設置為自動格式。dateaxis.setDateFormatOverride(format);}dateaxis.setTickMarkPosition(DateTickMarkPosition.START);ValueAxisvalueAxis=xyplot.getRangeAxis();valueAxis.setUpperBound(maxpress);valueAxis.setAutoRangeMinimumSize(1);valueAxis.setLowerBound(min);valueAxis.setAutoRange(false);valueAxis.setAxisLineStroke(newBasicStroke(1.5f));//坐標軸粗細valueAxis.setAxisLinePaint(newColor(215,215,215));//坐標軸顏色valueAxis.setLabelPaint(newColor(10,10,10));//坐標軸標題顏色valueAxis.setTickLabelPaint(newColor(102,102,102));//坐標軸標尺值顏色xyplot.setRangeGridlinesVisible(true);xyplot.setDomainGridlinesVisible(true);xyplot.setRangeGridlinePaint(Color.LIGHT_GRAY);xyplot.setDomainGridlinePaint(Color.LIGHT_GRAY);xyplot.setBackgroundPaint(newColor(255,253,246));xyplot.setNoDataMessage(nodatamess);//沒有數據時顯示的文字說明。xyplot.setNoDataMessageFont(newFont("",Font.BOLD,14));//字體的大小,粗體。xyplot.setNoDataMessagePaint(newColor(87,149,117));//字體顏色xyplot.setAxisOffset(newRectangleInsets(0d,0d,0d,5d));////addrangemarker(舒張壓的區域marker,范圍是從62到81)doublelowpress=62;doubleuperpress=81;IntervalMarkerintermarker=newIntervalMarker(lowpress,uperpress);intermarker.setPaint(Color.decode("#66FFCC"));//域顏色intermarker.setLabelFont(newFont("SansSerif",41,14));intermarker.setLabelPaint(Color.RED);intermarker.setLabel(bp_shuzhang);if(xydataset!=null){xyplot.addRangeMarker(intermarker,Layer.BACKGROUND);}//(收縮壓的區域marker,范圍是從102到120)doublelowpress1=102;doubleuperpress1=120;IntervalMarkerinter=newIntervalMarker(lowpress1,uperpress1);inter.setLabelOffsetType(LengthAdjustmentType.EXPAND);inter.setPaint(Color.decode("#66FFCC"));//域顏色inter.setLabelFont(newFont("SansSerif",41,14));inter.setLabelPaint(Color.RED);inter.setLabel(bp_shou);if(xydataset!=null){xyplot.addRangeMarker(inter,Layer.BACKGROUND);//加上Layer.BACKGROUND,將maker調到折線下面。}XYLineAndShapeRendererxylineandshaperenderer=(XYLineAndShapeRenderer)xyplot.getRenderer();//***條折線的顏色xylineandshaperenderer.setBaseItemLabelsVisible(true);xylineandshaperenderer.setSeriesFillPaint(0,newColor(127,128,0));xylineandshaperenderer.setSeriesPaint(0,newColor(127,128,0));xylineandshaperenderer.setSeriesShapesVisible(0,true);xylineandshaperenderer.setSeriesShapesVisible(1,true);//第二條折線的顏色xylineandshaperenderer.setSeriesFillPaint(1,newColor(254,103,0));xylineandshaperenderer.setSeriesPaint(1,newColor(254,103,0));xylineandshaperenderer.setSeriesShapesVisible(1,true);xylineandshaperenderer.setSeriesVisible(2,false);//xylineandshaperenderer.setSeriesVisible(3,false);//不顯示下面標題//折線的粗細調StandardXYToolTipGeneratorxytool=newStandardXYToolTipGenerator();xylineandshaperenderer.setToolTipGenerator(xytool);xylineandshaperenderer.setStroke(newBasicStroke(1.5f));//顯示節點的值xylineandshaperenderer.setBaseItemLabelsVisible(true);xylineandshaperenderer.setBasePositiveItemLabelPosition(newItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_CENTER));xylineandshaperenderer.setBaseItemLabelGenerator(newStandardXYItemLabelGenerator());xylineandshaperenderer.setBaseItemLabelPaint(newColor(102,102,102));//顯示折點數值字體的顏色returnjfreechart;}

4、將圖片URL返回到頁面

publicstaticvoiddrawPressLineChart(IrisIoInterfaceio,Loglog,TimeSeriesCollectiontimesers,intweekormonth,Stringtitle,Stringy,Stringindex,Stringweek,Stringyear,intsearchby,Stringmonth,Stringnodatamess,Listlist,Stringbp_shou,Stringbp_shuzhang){JFreeChartchart=createChartPress(timesers,weekormonth,title,y,index,week,year,searchby,month,nodatamess,list,log,bp_shou,bp_shuzhang);HttpServletRequestrequest=io.getRequest();Stringfilename="";StringgraphURL="";try{filename=ServletUtilities.saveChartAsPNG(chart,650,280,null,io.getSession());graphURL=request.getContextPath()+"/displayChart?filename="+filename;}catch(IOExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();log.error(e);}io.setData("filename1",filename,BeanShare.BEAN_SHARE_REQUEST);io.setData("presslineurl",graphURL,BeanShare.BEAN_SHARE_REQUEST);}

效果圖如下:

以天為刻度:

以周為刻度:

以月為刻度:

總結

以上是生活随笔為你收集整理的如何使用JFreeChart实现折线图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。