2011年3月27日日曜日

Android AChartEngineで円グラフを描く

AFreeChartで円グラフを描いたが、ラベルを消せなさそうとか気になる部分はあった。他のライブラリだとどうなのかと思ったので、achartengineを使ってみる。achartengineはライセンスはApache License 2.0。

また、日本語のドキュメントは見つけられないのでとりあえずサンプルを読む。まず読むのはChartDemo.javaBudgetPieChart.javaあたりかな。BudegetPieChartのexecuteで(ChartFactory.getPieChartIntentで)返すintentをChartDemoではstartActivityしている。

IntentじゃなくてViewを返して欲しいなぁと思って見てると、ChartFactory.getPieChartViewってのがあった。GraphicalViewを返してくれるようだ。

サンプルはこんな感じかな。データセットは前回と同じ。
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LinearLayout chart_area = (LinearLayout) findViewById(R.id.chart_area);

        CategorySeries series = new CategorySeries(null);
        DefaultRenderer renderer = new DefaultRenderer();
        int[] colors = new int[] { Color.BLUE, Color.GREEN, Color.MAGENTA,
                                   Color.YELLOW, Color.CYAN, Color.RED };

        series.add("Cupcake", new Integer(40));
        series.add("Donut", new Integer(5));
        series.add("Eclair", new Integer(10));
        series.add("Froyo", new Integer(25));
        series.add("Gingerbread", new Integer(20));
        series.add("Honeycomb", new Integer(50));

        renderer.setLabelsTextSize(15); //ラベルの文字サイズ
//      renderer.setShowLabels(false); //ラベルを表示するか
        renderer.setLegendTextSize(24); //凡例の文字サイズ
//      renderer.setShowLegend(false);  //凡例を表示するか
        for (int color : colors) {
            SimpleSeriesRenderer r = new SimpleSeriesRenderer();
            r.setColor(color);
            renderer.addSeriesRenderer(r);
        }

        GraphicalView pie_chart = ChartFactory.getPieChartView(this, series, renderer);
        chart_area.addView(pie_chart);
    }
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView android:text="PieChart"
              android:layout_margin="10dip"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
    <LinearLayout
              android:id="@+id/chart_area"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
</LinearLayout>
実行結果
ラベル(円グラフの周りのやつ)も凡例(円グラフの下のやつ)も消すことはできた。が、achartengineではサイズの調整ができるのかがわからなかった。

あと、colorの設定の数が足りないと、下記エラーが出るので項目の数が可変の場合にはちょっと使いにくそう。
ERROR/AndroidRuntime(404): Caused by: java.lang.IllegalArgumentException: Dataset and renderer should be not null and the dataset number of items should be equal to the number of series renderers

他にもグラフを描画するライブラリはあるので、時間のあるときに見てみよう。