首页 文章

如何正确显示AChartEngine条形图

提问于
浏览
8

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

这就是我要的:

My Desired Graph

enter image description here

What I achieved so far

1:1查看:
enter image description here

缩小视图:

enter image description here

Problems:

  • 图表的左右部分在1:1视图中丢失 .

  • Bar之间的距离太高了 . 我需要减少它 .

  • 条形图不在文本标签上方 .

  • 文本标签颜色为白色 . 我试过 setLabelColor() 但没有工作 .

  • 上面的文字大小很小 .

  • XAxis文本"AC","WA"等与1,2,3重叠 . 我想删除1,2,3,仅显示"AC","WA"等 .

你知道如何解决这些问题吗?我需要一个与我想要的图形大致相似的图形 . 提前致谢 .

Edit:

这是我尝试的代码:

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);
    }

Edit (After applying Dan's suggestion)

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);
.........

现在的问题是:

  • mRenderer.setChartValuesTextSize(size); 无法使用,因为已弃用

  • Bar文本至今仍然很小

  • 最高的酒吧在顶部分开

  • X轴标签未与条形图正确对齐

4 回答

  • 2

    遵循您的编号方案:

    • 您可以通过设置可见区域的X轴最小值和最大值来解决此问题: mRenderer.setXAxisMin(min);mRenderer.setXAxisMax(max);

    • 您可以通过增加宽度或使用上述方法来减少它,例如左右两侧有更多空间 .

    • 这是一个未解决的问题 .

    • 试试 mRenderer.setXLabelsColor(color);

    • renderer.setChartValuesTextSize(size);

    • mRenderer.setXLabels(0);

    编辑:

  • 0

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

    如果你想:

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

    你需要设置:

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

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

    更改

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

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

    希望这可以帮助!

  • 1
    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);
    
        }
    

相关问题