- 340.00 KB
- 2023-01-18 11:31:09 发布
- 1、本文档共5页,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
- 文档侵权举报电话:19940600175。
各类统计程序实现 杨方531115121 矢量图的生成矢量统计图,即是以矢量图形格式生成、存在和输出的统计图。这种统计图图形要素丰富、交互编辑简单、存储格式多样,打印输出方便,是GIS应用系统最优先选择的统计图.最常用的三类矢量统计图是直方图、曲线图、饼图。矢量统计图的生成,首先要将数据组织为一定的格式,然后进行图形参数的计算和设置,再生成图形,最后进行浏览显示或者保存输出。当然,如果对生成的图形不满意,可以进行参数修改,然后重新生成,最后再显示或保存。1。1 数据组织原始数据可以整理为二维表格的形式,通过文件(*.txt,*.xls,*.doc)导入,也可以将数据整理为二维数组的形式输入。统计图只支持为数值型的数据,包括整型、长整型、浮点型和双精度型等4种数据类型.1。2设置参数图形参数可以由用户外部输入,也可以根据数据生成默认参数,分为基本参数、坐标参数、图例参数和数据参数等。(1)基本参数包括图形类型,图形名称,图形范围,点、线、区参数等.(2)坐标轴参数包括是否绘制轴线、刻度线、标注、网格线的标志,刻度数,颜色,名称,比例尺,以及是否绘制包围盒或箭头的标志。(3)图例参数包括是否绘制图例的标志和图例显示位置标志。(4)数据参数包括数据类型,是否绘制数据表的标志,图形单元的宽度或间隔、图形单元的颜色,系列和类别显示标志等。
1.3图形生成生成图形的基本步骤如下:(1)确认存在点、线、面工作区。生成的图形要暂时存入工作区中,然后才能进行显示或保存。点线面工作区可以由外部输入,也可以在软件中生成。(2)确认各项图形参数有效。必须保证每项图形参数都有效,否则软件将出错。对于没有设置有效值的参数,要重新设置默认参数.(3)依次生成图形的各个要素:生成坐标轴、生成图形主体、生成数据表、生成图例和生成图形。在生成统计图的过程中,要随时计算图形的当前范围,以控制后续元素的位置。1.4 图形显示统计图生成后,保存在MAPGIS的点线面工作区中,可以调用MAPGIS的图形显示视图进行显示。先将生成的MAPGIS点线面工作区临时保存为MAPGIS工程,然后在MAPGIS的图形显示视图进行显示。1.5图形输出统计图生成后,也可以直接进行输出:(1)保存为MAPGIS工程文件,直接将MAPGIS点线面工作区保存为MAPGIS工程文件。该文件可以调用MAPGIS图形编辑系统进行编辑。(2)保存为图片格式,如JPEG、GIF、TIF等。保存之前必须先设置好图形的页面范围,以免图形保存不够完整或错位。2实现应用2.1软件包实现2。1。1类与结构主要的类和对象有:(1)统计图基类,初始化图形参数,生成坐标轴、图例、图形名称、数据表等要素。(2)直方图类,生成直方图,继承统计图基类.(3)曲线图类,生成曲线图,继承统计图基类.(4),饼图类,生成饼图,继承统计图基类。(5)图形参数结构,包括坐标轴参数、图例参数、图形名称等参数。(6)坐标轴参数结构。
(7)图例参数结构。(8)圆弧参数结构,在饼图中使用。实现流程图统计图 ﻩ曲线图直方图饼形图柱形图设置参数数据参数图例参数坐标参数基本参数
java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)二, 实现柱形图的java代码:import java。awt。Font;importorg.jfree。chart。ChartFactory;importorg.jfree。chart。ChartPanel;importorg。jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;importorg.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;importorg.jfree.chart。plot。PlotOrientation;importorg。jfree.data。category.CategoryDataset;importorg.jfree.data.category.DefaultCategoryDataset;publicclassBarChart{ChartPanelframe1;ﻩpublicBarChart(){ﻩCategoryDataset dataset=getDataSet(); JFreeChartchart =ChartFactory。createBarChart3D( ﻩ "水果",// 图表标题 "水果种类", //目录轴的显示标签 ”数量”,//数值轴的显示标签 dataset,//数据集 PlotOrientation。VERTICAL,//图表方向:水平、垂直 true, //是否显示图例(对于简单的柱状图必须是false) false, //是否生成工具 false //是否生成URL链接 ); //从这里开始 CategoryPlotplot=chart.getCategoryPlot();//获取图表区域对象
CategoryAxisdomainAxis=plot。getDomainAxis(); //水平底部列表 domainAxis.setLabelFont(newFont("黑体",Font.BOLD,14)); //水平底部标题 domainAxis。setTickLabelFont(newFont("宋体",Font。BOLD,12));//垂直标题 ValueAxisrangeAxis=plot。getRangeAxis();//获取柱状 rangeAxis.setLabelFont(newFont("黑体",Font.BOLD,15)); chart。getLegend()。setItemFont(new Font("黑体", Font。BOLD,15)); chart。getTitle().setFont(newFont(”宋体",Font。BOLD,20));//设置标题字体 //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题 frame1=newChartPanel(chart,true); //这里也可以用chartFrame,可以直接生成一个独立的Frame }private static CategoryDatasetgetDataSet(){DefaultCategoryDatasetdataset=newDefaultCategoryDataset(); dataset.addValue(100,"北京”, "苹果");dataset.addValue(100,”上海”,"苹果”);dataset.addValue(100,"广州", ”苹果”); dataset.addValue(200,"北京","梨子"); dataset.addValue(200,"上海",”梨子”); dataset。addValue(200, ”广州","梨子”); dataset.addValue(300,"北京”,”葡萄"); dataset。addValue(300,"上海","葡萄"); dataset.addValue(300,"广州",”葡萄"); dataset.addValue(400,"北京”,"香蕉”); dataset.addValue(400,"上海","香蕉"); dataset.addValue(400,”广州",”香蕉"); dataset.addValue(500,”北京","荔枝"); dataset。addValue(500,"上海”, "荔枝"); dataset.addValue(500, "广州","荔枝”);
returndataset;}publicChartPanelgetChartPanel(){ﻩreturnframe1;ﻩ}} 效果图如下:
但我们把private static CategoryDatasetgetDataSet(){}方法中的数据变化一下后,又会形成另一种效果,比如说我们改成:privatestaticCategoryDatasetgetDataSet(){ DefaultCategoryDatasetdataset = newDefaultCategoryDataset(); dataset.addValue(100,”苹果”,”苹果”); dataset.addValue(200,"梨子","梨子"); dataset。addValue(300,”葡萄”,”葡萄”); dataset.addValue(400,"香蕉","香蕉”); dataset。addValue(500,”荔枝","荔枝");returndataset;}ﻫ 效果图如下:
三, 实现饼状图的java代码: packagecom.njue.testJFreeChart;importjava。awt.Font;importjava.text。DecimalFormat;import java。text.NumberFormat;importjavax.swing。JPanel;import org.jfree.chart.ChartFactory;importorg.jfree.chart.ChartPanel;
importorg.jfree.chart.JFreeChart;importorg.jfree.chart。labels。StandardPieSectionLabelGenerator;importorg.jfree.chart.plot.PiePlot;importorg.jfree.data.general.DefaultPieDataset;publicclass PieChart{ﻩChartPanelframe1;ﻩpublic PieChart(){ﻩ DefaultPieDatasetdata= getDataSet();ﻩ JFreeChartchart=ChartFactory。createPieChart3D(”水果产量",data,true,false,false); //设置百分比 PiePlotpieplot=(PiePlot)chart。getPlot();ﻩDecimalFormatdf=newDecimalFormat("0。00%”);//获得一个DecimalFormat对象,主要是设置小数问题 NumberFormatnf=NumberFormat.getNumberInstance();//获得一个NumberFormat对象ﻩ StandardPieSectionLabelGeneratorsp1=new StandardPieSectionLabelGenerator("{0}{2}”,nf,df);//获得StandardPieSectionLabelGenerator对象ﻩ pieplot.setLabelGenerator(sp1);//设置饼图显示百分比 //没有数据的时候显示的内容ﻩ pieplot。setNoDataMessage(”无数据显示”); pieplot.setCircular(false);pieplot。setLabelGap(0。02D); pieplot。setIgnoreNullValues(true);//设置不显示空值 pieplot。setIgnoreZeroValues(true);//设置不显示负值ﻩ frame1=newChartPanel(chart,true); chart.getTitle().setFont(newFont("宋体",Font。BOLD,20));//设置标题字体ﻩ PiePlotpiePlot=(PiePlot) chart。getPlot();//获取图表区域对象 piePlot.setLabelFont(newFont("宋体”,Font.BOLD,10));//解决乱码ﻩchart。getLegend()。setItemFont(newFont("黑体",Font。BOLD,10));
}privatestatic DefaultPieDatasetgetDataSet() { DefaultPieDatasetdataset=newDefaultPieDataset(); dataset.setValue("苹果”,100); dataset.setValue(”梨子”,200);dataset.setValue(”葡萄",300); dataset。setValue(”香蕉”,400); dataset.setValue("荔枝”,500); returndataset;}publicChartPanelgetChartPanel(){ returnframe1; }} 效果图如下: 四, 实现折线图的java代码: package com。njue.testJFreeChart;importjava.awt.Font;importjava.text.SimpleDateFormat;import org.jfree.chart。ChartFactory;importorg。jfree.chart.ChartPanel;import org.jfree。chart.JFreeChart;importorg.jfree。chart.axis。DateAxis;importorg.jfree.chart。axis.ValueAxis;importorg.jfree。chart。plot.XYPlot;importorg.jfree.data。time.Month;
importorg.jfree.data.time.TimeSeries;importorg.jfree.data.time。TimeSeriesCollection;importorg.jfree。data.xy.XYDataset;publicclassTimeSeriesChart {ﻩChartPanel frame1;ﻩpublicTimeSeriesChart(){ﻩXYDataset xydataset=createDataset();ﻩﻩJFreeChartjfreechart=ChartFactory.createTimeSeriesChart("Legal&General单位信托基金价格", "日期”, ”价格”,xydataset,true, true,true);XYPlot xyplot=(XYPlot) jfreechart.getPlot();ﻩDateAxisdateaxis = (DateAxis)xyplot.getDomainAxis(); dateaxis.setDateFormatOverride(newSimpleDateFormat("MMM—yyyy")); frame1=new ChartPanel(jfreechart,true); dateaxis。setLabelFont(newFont("黑体",Font。BOLD,14)); //水平底部标题 dateaxis。setTickLabelFont(newFont(”宋体”,Font.BOLD,12));//垂直标题 ValueAxisrangeAxis=xyplot。getRangeAxis();//获取柱状 rangeAxis。setLabelFont(newFont("黑体",Font.BOLD,15));jfreechart。getLegend().setItemFont(new Font(”黑体",Font.BOLD,15)); jfreechart.getTitle().setFont(newFont("宋体",Font.BOLD,20));//设置标题字体ﻩ} privatestaticXYDataset createDataset(){ //这个数据集有点多,但都不难理解ﻩ TimeSeriestimeseries =new TimeSeries(”legal&general欧洲指数信任”, org.jfree.data.time.Month.class);ﻩtimeseries.add(newMonth(2, 2001), 181。80000000000001D); timeseries。add(new Month(3,2001),167.30000000000001D);
ﻩ timeseries.add(newMonth(4, 2001), 153.80000000000001D); timeseries。add(new Month(5,2001), 167.59999999999999D);ﻩ timeseries.add(newMonth(6,2001), 158.80000000000001D); timeseries。add(newMonth(7,2001), 148。30000000000001D);ﻩ timeseries.add(new Month(8,2001),153.90000000000001D);ﻩ timeseries.add(newMonth(9,2001), 142.69999999999999D); timeseries。add(newMonth(10,2001),123.2D);ﻩ timeseries.add(newMonth(11, 2001), 131。80000000000001D);ﻩ timeseries.add(newMonth(12, 2001),139.59999999999999D);ﻩtimeseries.add(new Month(1, 2002), 142.90000000000001D);ﻩ timeseries。add(newMonth(2,2002),138。69999999999999D);ﻩ timeseries.add(newMonth(3,2002),137.30000000000001D);timeseries。add(new Month(4,2002),143.90000000000001D); timeseries.add(new Month(5, 2002), 139。80000000000001D);ﻩ timeseries.add(newMonth(6,2002), 137D);ﻩtimeseries.add(newMonth(7,2002),132.80000000000001D); TimeSeriestimeseries1 =newTimeSeries(”legal&general英国指数信任”, org.jfree。data.time.Month.class); timeseries1.add(newMonth(2,2001),129.59999999999999D); timeseries1。add(newMonth(3, 2001),123.2D);ﻩ timeseries1.add(newMonth(4,2001), 117.2D); timeseries1。add(newMonth(5,2001),124。09999999999999D);
ﻩ timeseries1。add(newMonth(6, 2001),122.59999999999999D); timeseries1。add(new Month(7, 2001), 119.2D);ﻩtimeseries1.add(newMonth(8,2001), 116.5D);ﻩ timeseries1.add(newMonth(9,2001),112.7D); timeseries1。add(newMonth(10, 2001), 101.5D); timeseries1.add(newMonth(11,2001),106.09999999999999D); timeseries1.add(newMonth(12,2001),110.3D); timeseries1。add(newMonth(1,2002),111.7D);ﻩ timeseries1。add(new Month(2,2002), 111D);ﻩtimeseries1.add(new Month(3,2002),109.59999999999999D); timeseries1.add(new Month(4,2002),113。2D);ﻩ timeseries1.add(newMonth(5,2002),111.59999999999999D); timeseries1.add(newMonth(6, 2002),108.8D); timeseries1.add(newMonth(7,2002),101。59999999999999D); TimeSeriesCollectiontimeseriescollection =new TimeSeriesCollection(); timeseriescollection.addSeries(timeseries); timeseriescollection.addSeries(timeseries1); returntimeseriescollection; } public ChartPanel getChartPanel(){ returnframe1;ﻩ }}ﻫ 效果图如下:
再来看一下主方法:import java.awt.GridLayout;importjavax。swing。JFrame;publicclass mainClass{publicstaticvoidmain(Stringargs[]){JFrame frame=new JFrame("Java数据统计图");frame。setLayout(newGridLayout(2,2,10,10));frame.add(newBarChart()。getChartPanel()); //添加柱形图
ﻩframe.add(newBarChart1().getChartPanel()); //添加柱形图的另一种效果ﻩframe。add(newPieChart().getChartPanel()); //添加饼状图frame.add(new TimeSeriesChart().getChartPanel());//添加折线图ﻩframe.setBounds(50, 50, 800,600);ﻩframe。setVisible(true);}}ﻫ