如何正确显示AChartEngine条形图

时间:2013-07-16 15:52:20

标签: android bar-chart achartengine

我正在使用 achartengine 1.0.1 (最新)并希望演示条形图。

这就是我想要的:

我想要的图表

enter image description here

到目前为止我取得的成就

1:1查看: enter image description here

缩小视图:

enter image description here

问题:

  1. 图表的左右部分以1:1的视图丢失。
  2. Bar之间的距离太高了。我需要减少它。
  3. 栏位不在文字标签上方。
  4. 文字标签颜色为白色。我试过setLabelColor()但没有工作。
  5. 上面的文字大小很小。
  6. XAxis文字“AC”,“WA”等与1,2,3重叠。我想删除1,2,3,只显示“AC”,“WA”等。
  7. 你知道如何解决这些问题吗?我需要一个与我的所需图表大致类似的图表。提前谢谢。

    编辑:

    这是我尝试的代码:

        public GraphicalView getView(Context context) 
        {   
            // Bar 1
    
            XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    
            XYSeries ac = new XYSeries("AC");
            XYSeries pe = new XYSeries("PE");
            XYSeries wa = new XYSeries("WA");
            XYSeries tl = new XYSeries("TL");
            XYSeries ml = new XYSeries("ML");
            XYSeries ce = new XYSeries("CE");
            XYSeries re = new XYSeries("RE");
            XYSeries ot = new XYSeries("OT");
            ac.add(1, 291);
            pe.add(2, 11);
            wa.add(3, 204);
            tl.add(4, 28);
            ml.add(5, 0);
            ce.add(6, 21);
            re.add(7, 51);
            ot.add(8, 4);
            dataset.addSeries(ac);
            dataset.addSeries(pe);
            dataset.addSeries(wa);
            dataset.addSeries(tl);
            dataset.addSeries(ml);
            dataset.addSeries(ce);
            dataset.addSeries(re);
            dataset.addSeries(ot);
    
    
            XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
            mRenderer.setChartTitle("Submission Statistics");
            mRenderer.setXTitle("Verdict Code");
            mRenderer.setYTitle("No. of Submissions");
            mRenderer.setAxesColor(Color.BLACK);
            mRenderer.setLabelsColor(Color.BLACK);
            mRenderer.setApplyBackgroundColor(true);
            mRenderer.setBackgroundColor(Color.WHITE);
            mRenderer.setMarginsColor(Color.WHITE);
            mRenderer.setZoomEnabled(true);
            mRenderer.setZoomButtonsVisible(true);
            mRenderer.setBarSpacing(-0.5);
    //      mRenderer.setMargins(new int[] {20, 30, 15, 0});
            mRenderer.setAxisTitleTextSize(16);
            mRenderer.setChartTitleTextSize(20);
            mRenderer.setLabelsTextSize(15);
            mRenderer.setLegendTextSize(15);
            mRenderer.addXTextLabel(1, "AC");
            mRenderer.addXTextLabel(2, "PE");
            mRenderer.addXTextLabel(3, "WA");
            mRenderer.addXTextLabel(4, "TL");
            mRenderer.addXTextLabel(5, "ML");
            mRenderer.addXTextLabel(6, "CE");
            mRenderer.addXTextLabel(7, "RE");
            mRenderer.addXTextLabel(8, "OT");
            mRenderer.setBarWidth(50);
    //      mRenderer.setXAxisMax(9);
            mRenderer.setXAxisMin(0);
            mRenderer.setYAxisMin(0);
    
            XYSeriesRenderer renderer = new XYSeriesRenderer();
            renderer.setColor(Color.parseColor("#00AA00"));
            renderer.setDisplayChartValues(true);
    
    
    
            XYSeriesRenderer renderer2 = new XYSeriesRenderer();
            renderer2.setColor(Color.parseColor("#666600"));
            renderer2.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer3 = new XYSeriesRenderer();
            renderer3.setColor(Color.parseColor("#FF0000"));
            renderer3.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer4 = new XYSeriesRenderer();
            renderer4.setColor(Color.parseColor("#0000FF"));
            renderer4.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer5 = new XYSeriesRenderer();
            renderer5.setColor(Color.parseColor("#6767D0"));
            renderer5.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer6 = new XYSeriesRenderer();
            renderer6.setColor(Color.parseColor("#AAAA00"));
            renderer6.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer7 = new XYSeriesRenderer();
            renderer7.setColor(Color.parseColor("#00AAAA"));
            renderer7.setDisplayChartValues(true);
    
            XYSeriesRenderer renderer8 = new XYSeriesRenderer();
            renderer8.setColor(Color.parseColor("#000000"));
            renderer8.setDisplayChartValues(true);
    
    
            mRenderer.addSeriesRenderer(renderer);
            mRenderer.addSeriesRenderer(renderer2);
            mRenderer.addSeriesRenderer(renderer3);
            mRenderer.addSeriesRenderer(renderer4);
            mRenderer.addSeriesRenderer(renderer5);
            mRenderer.addSeriesRenderer(renderer6);
            mRenderer.addSeriesRenderer(renderer7);
            mRenderer.addSeriesRenderer(renderer8);
    
            return ChartFactory.getBarChartView(context, dataset,mRenderer, Type.DEFAULT);
        }
    

    编辑(应用Dan的建议后)

    enter image description here

    我的新代码:

    .........
    mRenderer.setChartTitle("Submission Statistics");
            mRenderer.setXTitle("Verdict Code");
            mRenderer.setYTitle("No. of Submissions");
            mRenderer.setAxesColor(Color.BLACK);
            mRenderer.setApplyBackgroundColor(true);
            mRenderer.setBackgroundColor(Color.WHITE);
            mRenderer.setMarginsColor(Color.WHITE);
            mRenderer.setZoomEnabled(true);
            mRenderer.setBarSpacing(-0.5);
            mRenderer.setMargins(new int[] {20, 30, 15, 0});
            mRenderer.setShowLegend(false);
            mRenderer.setAxisTitleTextSize(16);
            mRenderer.setChartTitleTextSize(20);
            mRenderer.setLabelsTextSize(15);
            mRenderer.setLegendTextSize(15);
            mRenderer.addXTextLabel(1, "AC");
            mRenderer.addXTextLabel(2, "PE");
            mRenderer.addXTextLabel(3, "WA");
            mRenderer.addXTextLabel(4, "TL");
            mRenderer.addXTextLabel(5, "ML");
            mRenderer.addXTextLabel(6, "CE");
            mRenderer.addXTextLabel(7, "RE");
            mRenderer.addXTextLabel(8, "OT");
            mRenderer.setBarWidth(50);
            mRenderer.setXAxisMin(-2);
            mRenderer.setXAxisMax(11);
            mRenderer.setYAxisMin(0);
            mRenderer.setYLabelsAlign(Align.RIGHT);
            mRenderer.setXLabelsColor(Color.BLACK);
            mRenderer.setYLabelsColor(0, Color.BLACK);
            mRenderer.setXLabels(0);
            mRenderer.setChartValuesTextSize(16);
    .........
    

    现在的问题是:

    1. mRenderer.setChartValuesTextSize(size);无法正常工作 弃用
    2. 直到现在,酒吧文字仍然很小
    3. 最高的酒吧在顶部分开
    4. X轴标签未与条形图正确对齐

4 个答案:

答案 0 :(得分:2)

遵循编号方案:

  1. 您可以通过设置可见区域的X轴最小值和最大值来解决此问题:mRenderer.setXAxisMin(min);mRenderer.setXAxisMax(max);
  2. 您可以通过增加宽度或使用上述方法来减少它,例如左右两侧有更多空间。
  3. 这是一个未解决的问题。
  4. 尝试mRenderer.setXLabelsColor(color);
  5. renderer.setChartValuesTextSize(size);
  6. mRenderer.setXLabels(0);
  7. 编辑:

    1. 使用renderer.setChartValuesTextSize(size);
    2. 与#1相同。
    3. mRenderer.setYAxisMax(300);
    4. 已知问题:http://code.google.com/p/achartengine/issues/detail?id=312

答案 1 :(得分:2)

我发现尺寸密度计算不正确。

如果你想:

mRenderer.setLabelsTextSize(15); 
mRenderer.setLegendTextSize(15); 

您需要设置:

mRenderer.setLabelsTextSize(15* getResources().getDisplayMetrics().density); 
mRenderer.setLegendTextSize(15* getResources().getDisplayMetrics().density); 

答案 2 :(得分:1)

我遇到同样的问题。这是因为AChartegine正在尝试为每个渲染器分配足够的空间,以便进行转换。这应该通过Type.STACKED

简单解决

更改

ChartFactory.getBarChartView(context, dataset,mRenderer, Type.DEFAULT);

ChartFactory.getBarChartView(context, dataset,mRenderer, Type.STACKED);

希望这有帮助!

答案 3 :(得分:0)

   GraphicalView mChart = createIntent();
   layout_graph.addView(mChart);



public GraphicalView createIntent() {

        String[] titles = new String[] { " " };

        List<Double> values = new ArrayList<Double>();




        for (int i = 0; i < yaxes_value.size(); i++) {
//          values.add(Double.parseDouble(yaxes_value.get(i)));


        }


        int[] colors = new int[] { Color.parseColor("#4DBA7A") };
        XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
        setChartSettings(renderer, "Simple Bar Chart", X_title, Y_title+type,
                Color.BLACK, Color.BLACK,values);

        for (int i = 0; i < Xaxes_value.size(); i++) {
            renderer.addXTextLabel(i + 1, Xaxes_value.get(i));
        }

        int length = renderer.getSeriesRendererCount();
        for (int i = 0; i < length; i++) {
            SimpleSeriesRenderer seriesRenderer = renderer
                    .getSeriesRendererAt(i);
            // seriesRenderer.setDisplayChartValues(true);
        }

        final GraphicalView grfv = ChartFactory.getBarChartView(
                GraphActivity.this, buildBarDataset(titles, values), renderer,
                Type.DEFAULT);


        return grfv;
    }

    protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
        XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
        renderer.setAxisTitleTextSize(25);
        renderer.setChartTitleTextSize(20);
        renderer.setLabelsTextSize(20);
        renderer.setLegendTextSize(20);
        renderer.setPanEnabled(false, false);
        renderer.setPanEnabled(false);
        renderer.setZoomEnabled(false);
        renderer.setZoomEnabled(false, false);
        renderer.setBarSpacing(1f);
        renderer.setBarWidth(50f);
        renderer.setMarginsColor(Color.WHITE);
        renderer.setXLabelsColor(Color.BLACK);
        renderer.setYLabelsColor(0, Color.BLACK);
        renderer.setApplyBackgroundColor(true);
        renderer.setXLabelsAngle(335);

        int length = colors.length;
        for (int i = 0; i < length; i++) {
            SimpleSeriesRenderer r = new SimpleSeriesRenderer();
            r.setColor(colors[i]);
            r.setChartValuesSpacing(10);
            renderer.addSeriesRenderer(r);
        }
        return renderer;
    }

    protected XYMultipleSeriesDataset buildBarDataset(String[] titles,
            List<Double> values) {
        XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
        int length = titles.length;
        for (int i = 0; i < length; i++) {
            CategorySeries series = new CategorySeries(titles[i]);
            for (int j = 0; j < values.size(); j++) {
                series.add(values.get(j));
            }
            dataset.addSeries(series.toXYSeries());
        }
        return dataset;
    }

    protected void setChartSettings(XYMultipleSeriesRenderer renderer,
            String title, String xTitle, String yTitle, int axesColor,
            int labelsColor,List<Double> values) {

        renderer.setChartTitle(title);
        renderer.setYLabelsAlign(Align.RIGHT);
        renderer.setXTitle(xTitle);
        renderer.setYTitle(yTitle);
        renderer.setXAxisMin(0);
        renderer.setXLabels(0);
        renderer.setXLabelsPadding(10);
        renderer.setYLabelsPadding(2);
        renderer.setYAxisMin(0);
        renderer.setMargins(new int[] { 40, 100, 40, 20 });
//      renderer.setYAxisMin((Collections.min(values)) / 2);
//      renderer.setYAxisMax((Collections.max(values))
//              + (Collections.min(values)));
        renderer.setXAxisMax(layout_addrow.getChildCount() + 1);
        renderer.setAxesColor(axesColor);
        renderer.setLabelsColor(labelsColor);

    }