应用achartengine包画数据统计图之一————基础介绍及画TimeChart
本文将关注用achartengine包画出数据统计图(折线图+饼图)。
上图是使用achartengine画图的思路,从我的理解来说共需要两部分东西:
1.第一部分是数据相关(即图中XYSeries和XYMutipleSeriesDataset部分)。
XYseries是为XYchart封装内部数据,可以看成一系列坐标点(TimeChart中是Timeseries) 。要把你所要用来画图的数据存入这些结构中,并且要根据你所画的图的类型不同,将数据整理成特定的格式,例如若要画TimeChart,它的横轴所需的时间数据:年,月,日,时 都是有规定的。
2.第二部分是画图设置(即图中XYMutilpleSeriesRenderer和XYSeriesRenderer部分)。主要是设置所画统计图的线的颜色、点的形状、是否显示数据等等。
ChartFactory官方解释是“Utility methods for creating chart views or intents”,我的理解就是“画图的工厂”,你只需把以上两部分输入完成,ChartFactory就会完成剩下的画图工作。
因此,我们的主要任务就是琢磨怎么放数据+怎么进行图形设置。
一 画TimeChart(横坐标是日期时间的折线图)
下面是生成数据集(Dataset)的函数。titles中的每个元素是一条线的名字(titles中有几个元素就要画几条线);xValues是Date类型的链表,其元素作为横坐标——日期时间;yValues是double类型的链表,其元素作为纵坐标——对应日期的数据。
1 protected XYMultipleSeriesDataset buildDateDataset(String[] titles, List<Date[]> xValues, 2 List<double[]> yValues) { 3 XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset(); 4 int length = titles.length; 5 for (int i = 0; i < length; i++) { 6 TimeSeries series = new TimeSeries(titles[i]); 7 Date[] xV = xValues.get(i); //画TimeChart横坐标需要为Date数据类型 8 double[] yV = yValues.get(i); 9 int seriesLength = xV.length; 10 for (int k = 0; k < seriesLength; k++) { 11 series.add(xV[k], yV[k]); 12 } 13 dataset.addSeries(series); 14 } 15 return dataset; 16 }
之后是生成XYMutilpleSeriesRenderer,即进行图形设置的函数。colors[]是线相应的颜色,PointStyle[]是点的风格,如Circle,Square等。
1 protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles) { 2 XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer(); 3 renderer.setAxisTitleTextSize(16); //各种设置。。。。 4 renderer.setChartTitleTextSize(15); 5 renderer.setLabelsTextSize(15); 6 renderer.setLegendTextSize(15); 7 renderer.setPointSize(7f); 8 renderer.setMargins(new int[] { 40, 30, 15, 0 }); //设置图形四周的留白 9 int length = colors.length; 10 for (int i = 0; i < length; i++) { 11 XYSeriesRenderer r = new XYSeriesRenderer(); 12 r.setColor(colors[i]); 13 r.setPointStyle(styles[i]); 14 renderer.addSeriesRenderer(r); 15 } 16 return renderer; 17 }
把数据都收集好之后,就可以画图了,下面是画图的代码。GraphicalView是一个View对象,getTimeChartView()函数得到一个这样的对象。
1 private GraphicalView mChartView; 2 mChartView = ChartFactory.getTimeChartView(this,buildDateDataset(titles, dateList, values), 3 renderer, "M/d HH:mm"); 4 layout.removeAllViews(); //先remove再add可以实现统计图更新 5 6 layout.addView(mChartView, new LayoutParams(LayoutParams.FILL_PARENT, 7 LayoutParams.FILL_PARENT));
以上,就画出了TimeChart,截图如下: