[android] 绘制统计图

有几种可以利用的工具库:

- aChartEngine (http://code.google.com/p/achartengine/)

- Java4Less Charts for Android [ j4lChartAndroid.jar ]

(http://java4less.com/charts/chart.php?info=android)

- Chart4J (http://code.google.com/p/charts4j/)


- BlueChart (http://code.google.com/p/bluechart/)

- aiCharts (http://www.artfulbits.com/Android/aiCharts.aspx)

———————————————— 详细介绍 ——————————————————————————

- AChartEngine (http://code.google.com/p/achartengine/)


【 二维的。 aChartEngine的api 过于简单,支持的东西较少,但是可以进行缩放。】

aChartEngine 简称ACE ,是google为android应用设计的一个开源绘图库,它支持饼图、柱状图、折线图、

散点图、气泡图、短棒图、仪表图等多种图表。

(以下为转别人帖内容)

我想说的是不是如何去使用aChartEngine画图,而是想说说我碰到的问题。

以上是aChartEngine-6.0所有的类

利用 Android achartengine 实现统计图

如果你想X轴显示时间并且要画的长方形图的话,那么麻烦来了。X轴如果想要显示时间的话,要使用TimeChart,而TimeChart继承与 LineChart,也就是说,TimeChart只能显示线性的统计图。my god!这什么东西呀,做的也太不行了吧,我顿时就恼火了。那我X轴既要显示时间,又要显示长方形图怎么办?以下是我的解决方案。

如果想要显示长方形图,我们只能采用BarChart了,所以只能在它上面动手脚。

以下是我做的例子,供碰到同样的问题的鞋子们参考:

期望功能:以长方形图显示31天内的数据信息。

001import java.util.Calendar;
002import java.util.List;
003import java.util.Map;
004import java.util.TreeMap;
005import org.achartengine.ChartFactory;
006import org.achartengine.chart.BarChart.Type;
007import org.achartengine.model.CategorySeries;
008import org.achartengine.model.XYMultipleSeriesDataset;
009import org.achartengine.renderer.XYMultipleSeriesRenderer;
010import org.achartengine.renderer.XYSeriesRenderer;
011
012import android.content.Context;
013import android.content.Intent;
014import android.graphics.Color;
015
016public class Recent31DayActivity {
017
018private static Map
019
020
021
022<STRING, double="">
023
024
025
026map = new TreeMap
027
028
029
030<STRING, double="">
031
032
033
034();
035
036private static XYMultipleSeriesRenderer getBarDemoRenderer() {
037XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
038renderer.setAxisTitleTextSize(12);
039renderer.setChartTitleTextSize(12);
040renderer.setLabelsTextSize(12);
041renderer.setLegendTextSize(12);
042renderer.setMargins(new int[] { 20, 30, 15, 0 });
043XYSeriesRenderer r = new XYSeriesRenderer();
044r.setColor(Color.RED);
045renderer.addSeriesRenderer(r);
046return renderer;
047}
048
049private static void setChartSettings(XYMultipleSeriesRenderer renderer) {
050renderer.setChartTitle("最近31天");
051renderer.setXTitle("时间-天");
052renderer.setYTitle("发电量(Kw/h)");
053renderer.setYAxisMin(0);
054renderer.setXAxisMin(0.5);
055renderer.setXAxisMax(12.5);
056renderer.setShowLegend(false);
057renderer.setShowLabels(true);
058renderer.setShowGrid(true);
059renderer.setXLabels(1);
060renderer.setDisplayChartValues(true);
061renderer.setBarSpacing(0.5);
062renderer.setBackgroundColor(Color.WHITE);
063}
064
065private static XYMultipleSeriesDataset getBarDataset(Context cxt) {
066XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
067CategorySeries series = new CategorySeries("最近31天");
068Calendar c = Calendar.getInstance();
069int month = c.get(Calendar.DAY_OF_MONTH)+1;
070int day =c.get(Calendar.DAY_OF_MONTH);
071map.put((month<10?("0"+month):month) + "-"
072+ (day<10?("0"+day):day), 0.0);
073for (int i = 0; i <= 30; i++) {
074c.add(Calendar.DAY_OF_YEAR, -1);
075day=c.get(Calendar.DAY_OF_MONTH);
076month=c.get(Calendar.MONTH) + 1;
077map.put((month<10?("0"+month):month) + "-"
078+ (day<10?("0"+day):day), 0.0);
079}
080
081//这里的list是我取出一个对象列表,自己可以找别的数据代替
082if (list != null && list.size() > 0) {
083for (int i = 0; i < list.size(); i++) {
084if (map.containsKey(key)) {
085map.put(key, min.getElectricalEnergy());
086}
087}
088}
089for (String key : map.keySet()) {
090series.add(key, Utils.getDoublePointTwo(map.get(key)));
091}
092dataset.addSeries(series.toXYSeries());
093return dataset;
094}
095
096public Intent Recent31DayActivity(Context context) {
097XYMultipleSeriesRenderer renderer = getBarDemoRenderer();
098setChartSettings(renderer);
099Intent intent = ChartFactory.getBarChartIntent(context,
100getBarDataset(context), renderer, Type.DEFAULT);
101int count = 1;
102//这里比较重要,这里手动给X轴填刻度。有多少条内容,你就要天多少个刻度,这样X轴就显示的是时间,也能显示出长方形图
103for (String key : map.keySet()) {
104renderer.addTextLabel(count, key);
105count++;
106}
107return intent;
108}
109}
110
111
112
113</STRING,>
114
115
116
117</STRING,>


利用 Android achartengine 实现统计图

- Java4Less Charts for Android [ j4lChartAndroid.jar ]

(http://java4less.com/charts/chart.php?info=android)

【 二维 & 三维,比较好看,但是如果屏幕分辨率很小的时候,不能进行缩放。】

J4LChart 提供了完整的Chart图表,从饼、线、柱等都一网打尽,使用也比较简单,

  Chart的式样可以从TXT文本中读取,当然,也可以在代码里修改,不过,用TXT文件读取,可以做成

  模板那样,想换就换.

示例1:

  1. package com.sun.lwuit.uidemo;
  2. import com.sun.lwuit.Command;
  3. import com.sun.lwuit.Form;
  4. import com.sun.lwuit.events.ActionEvent;
  5. import com.sun.lwuit.events.ActionListener;
  6. import com.java4less.rchart.Chart;
  7. import com.java4less.rchart.ChartLoader;
  8. import com.java4less.rchart.gc.GraphicsProvider;
  9. import com.java4less.rchart.lwuit.ChartViewer;
  10. import com.java4less.rchart.util.Formats;
  11. import com.sun.lwuit.Display;
  12. import com.sun.lwuit.animations.Transition3D;
  13. import com.sun.lwuit.geom.Dimension;
  14. import com.sun.lwuit.layouts.BorderLayout;
  15. import java.util.Date;


  16. public class ChartDemo implements ActionListener {
  17. public Form form = new Form("J4LChart");
  18. Display display;
  19. Command nextExample= new Command("Next");
  20. Command previousExample= new Command("Previous");
  21. ChartViewer chartCanvas;
  22. ChartLoader loader;

  23. String[] examples={"areaChart.txt","areaCurves.txt","axisOnTop.txt","barChart3D.txt","barChart3D.txt","barChart.txt",
  24. "barImages.txt","bubbleChart.txt","candleStick.txt","combined2Positions.txt","combinedChart.txt","event.txt","linechart3D.txt",
  25. "linechart.txt","linechartClipping.txt","linechartNULLS.txt","MultiAxis.txt","MultiCharts.txt","patternFilling.txt",
  26. "piechart3D.txt","PieDrillDown.txt","radarChart.txt","realtime.txt","scatterChart.txt","stackedBar.txt","StackedMultiAxis.txt",
  27. "subpie1.txt","subpie2.txt","subpie3.txt","targetZones.txt"};

  28. int currentExample=0;

  29. ChartDemo()
  30. {
  31. GraphicsProvider.setMode(GraphicsProvider.MODE_LWUIT);

  32. form.addCommand(previousExample);//上一个
  33. form.addCommand(nextExample);//下一个

  34. form.setCommandListener(this);
  35. chartCanvas=new ChartViewer();//chart视图
  36. chartCanvas.setPreferredSize(new Dimension(200,200));//设置大小
  37. loadChartFromFile("/txt/"+examples[currentExample]);//读取文本,设置chart
  38. form.setLayout(new BorderLayout());
  39. form.addComponent(BorderLayout.CENTER,chartCanvas);
  40. form.refreshTheme();
  41. }

  42. private void createRealtimedata(ChartLoader loader) {

  43. java.util.Date now=java.util.Calendar.getInstance().getTime();
  44. loader.setParameter("XAXIS_INITIAL_DATE",Formats.formatDate(now,"dd/MM/yyyy hh:mm:ss"));
  45. // create random data based on the time
  46. java.util.Calendar cal=java.util.Calendar.getInstance();
  47. String data1="";
  48. String data2="";
  49. for (int i=0;i<9;i++) {
  50. cal.setTime(new Date(cal.getTime().getTime()-2000));
  51. if (data1.length()>0) data1="|" + data1;
  52. data1=""+cal.get(java.util.Calendar.SECOND)+ data1;
  53. if (data2.length()>0) data2="|" + data2;
  54. data2=""+(cal.get(java.util.Calendar.SECOND)/6)+ data2;
  55. }

  56. loader.setParameter("SERIE_DATA_1",data1);
  57. loader.setParameter("SERIE_DATA_2",data2);

  58. }
  59. public void loadChartFromFile(String filename) {
  60. ChartLoader cha=new ChartLoader();
  61. cha.loadFromFile(this.getClass().getResourceAsStream(filename),true);//读取文本
  62. //this.loader=cha;
  63. //********设置Chart数值
  64. //createRealtimedata(cha);
  65. //********设置Chart数值
  66. Chart c=cha.build(false,false);//建立chart
  67. chartCanvas.setChart(c);
  68. chartCanvas.getChart().setSize(chartCanvas.getWidth(),chartCanvas.getHeight());
  69. chartCanvas.repaintChart();
  70. form.setTitle(filename);
  71. }

  72. public void actionPerformed(ActionEvent arg0) {
  73. if(arg0.getCommand()==nextExample)//读取上一个chart(TXT文本)
  74. {
  75. chartCanvas.getChart().stopUpdater();
  76. currentExample++;
  77. if(currentExample>=examples.length-1)
  78. currentExample=0;
  79. form.replace(chartCanvas, chartCanvas,Transition3D.createRotation(500, true));
  80. loadChartFromFile("/txt/"+examples[currentExample]);
  81. }
  82. else if(arg0.getCommand()==previousExample)//读取下一个chart(TXT文本)
  83. {
  84. chartCanvas.getChart().stopUpdater();
  85. currentExample--;
  86. if(currentExample<=0)
  87. currentExample=examples.length-1;
  88. form.replace(chartCanvas, chartCanvas,Transition3D.createRotation(500, false));
  89. loadChartFromFile("/txt/"+examples[currentExample]);

  90. }
  91. }
  92. }

示例2:用j4lChartAndroid实现3D图饼

 

 这几天在网上找了一些关于3D图饼的文章,做了一个小例子,废话不多说,开始讲解代码

  1. 先生成一个图饼对象
复制代码
     //new出来一个图饼的对象, 参数简介1.所占的比例 2.颜色 3.是否分组(是否种其他的块是分开的) 4.文字介绍
PieDataSerie pds = new PieDataSerie(chart_scale, chart_color, chart_group, chart_lable);
 //设置label的样式
pds.valueFont = GraphicsProvider.getFont("Arial", ChartFont.PLAIN, 14);
 //设置label到中心的距离
pds.textDistanceToCenter = 1.6;
复制代码

  2.生成一个标题对象

 //设置图饼的标题
Title title = new Title("理财账户");

  3.开始绘图

复制代码
 //开始绘图
PiePlotter pp = new PiePlotter();
 //设置3D效果为true
pp.effect3D = true;
 //设置边框
pp.border = new LineStyle(1,GraphicsProvider.getColor(ChartColor.BLACK),LineStyle.LINE_NORMAL);
 //设置label的格式(#PERCENTAGE#,#VALUE#,#LABEL#)什么也不想显示的话直接“ ”里面有一个空格就可以了
pp.labelFormat = "#PERCENTAGE#";
 //设置半径
pp.radiusModifier = 3.2;
 //设置块与块之间的间隔
pp.space = 10;
 //设置label到块之间的线的样式
pp.labelLine = new LineStyle(1,GraphicsProvider.getColor(ChartColor.BLACK),LineStyle.LINE_NORMAL);
复制代码

    4.设置图饼旁边的文字解说的样式

 //生成一个对象
Legend legend = new Legend();
 //因为我这里不需要解说,所以设置它为" ",中间有空格,没有空格的话,会出现多余的文字
legend.legendLabel=" ";

    5.

复制代码
 //new一个图表对象,用来存放生成的图饼
com.java4less.rchart.Chart chart = new com.java4less.rchart.Chart(title, pp, null, null);
chart.layout = com.java4less.rchart.Chart.LAYOUT_LEGEND_TOP;
chart.back = new FillStyle(GraphicsProvider.getColor(ChartColor.WHITE));
chart.topMargin = 0.1;
chart.bottomMargin = 0.4; 
chart.leftMargin =0.1;
chart.legend = legend;
chart.setHeight(200);
chart.setWidth(width);
chart.addSerie(pds);
复制代码

  6.

 LinearLayout l = (LinearLayout) this.findViewById(R.id.chart);
ChartPanel chart = new ChartPanel(this);
chart.setChart(getChart());
l.addView(chart);

  好了,就这样的成了。最后再来张图


原创作品,转载请注明出处转载自道痕

- aiCharts (http://www.artfulbits.com/Android/aiCharts.aspx)

aiCharts 做的比较好,基本达到了.net中Chart控件的水平,可是要收费。用试用版的话,要带个试用的标记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值