【问题标题】:How to Display AChartEngine bar chart properly如何正确显示 AChartEngine 条形图
【发布时间】:2013-07-14 21:56:12
【问题描述】:

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

这就是我想要的:

我想要的图表

我目前取得的成就

1:1 视图:

缩小视图:

问题:

  1. 图表的左右部分在 1:1 视图中丢失。
  2. 酒吧之间的距离是如此之高。我需要减少它。
  3. 栏不在文本标签上方。
  4. 文本标签颜色为白色。我尝试了setLabelColor(),但没有成功。
  5. 栏上方的文本大小很小。
  6. XAxis 文本“AC”、“WA”等与 1、2、3 重叠。我想删除 1、2、3,只显示“AC”、“WA”等。

您知道如何解决这些问题吗?我需要一个类似于我的所需图表的图表。提前致谢。

编辑:

这是我尝试的代码:

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

编辑(应用丹的建议后)

我的新代码:

.........
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 轴标签未与条正确对齐

【问题讨论】:

  • 显示一些代码。您是如何构建图表的。
  • 哎呀!忘记添加代码了。现在我补充了。看看:)
  • 您是否尝试过积极的条形间距,例如 setBarSpacing(0.1) ?
  • 是的,按照你说的我试过了。但没有什么变化太大:(
  • @typedef 嗨,你能把完成这个代码的代码发给我吗。我需要它,我想和你做的一样。

标签: android bar-chart achartengine


【解决方案1】:

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

如果你愿意:

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

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:
         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);
      
          }
      

      【讨论】:

        【解决方案4】:

        按照您的编号方案:

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

        编辑:

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

        【讨论】:

        • 感谢您的回答! renderermRenderer ?
        • 我的图表非常接近我想要的图表 - 需要一些修改,我已经编辑了我的问题。请看一下:)
        • 先生,mRenderer.setYAxisMax(300); 没问题,但我不知道最大柱值是多少。那么我应该计算它们的最大值并相应地 setYAxisMax() 吗?
        • 最后一个问题,先生?我可以使用 AchartEngine 构建具有 3D 外观的条形图吗?
        • 不,尚不支持 3D。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 2013-02-19
        相关资源
        最近更新 更多