使用achartengine绘制问题的水平条形图

时间:2013-04-06 22:35:12

标签: android bar-chart achartengine

我想要制作一个水平条形图。我在左轴上总共有24个标签。我在绘制条形图时遇到的问题很少:

1)条形图开始时,我显示的条目数量有限。用户可以滚动查看其他条目。正如您在图像1中看到的那样,条形图出现在Y轴的“下方”。我无法弄清楚如何将所有栏保持在Axis之上。

2)第二个问题是值(或条形)向下移动一个。 “00 AM”标签前面没有栏,但在上午11点的最后一个条目下面有一个额外的栏,如第二张图片所示。如何改变酒吧?

3)不是每个标签都有焦油,而是我可以在这些标签之间展示条形码吗?

以下是我得到的图表:

Image 1

Image 2

以下是代码片段的代码:

public class TimeCravingBarChart extends Activity {    

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        //requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.timecraving_graph);
        final GraphicalView gv =createIntent();
        RelativeLayout rl=(RelativeLayout)findViewById(R.id.timegraph);

        LayoutParams l1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
        rl.addView(gv,l1);
    }


    public GraphicalView createIntent() {
        String[] titles = new String[] { "Urge Level"};
        List<double[]> values = new ArrayList<double[]>();

        values.add(new double[] { 6, 5, 3, 2, 6, 1, 6, 5, 3, 2, 6, 1, 6, 5, 3, 2, 6, 1, 6, 5, 3, 2, 6, 1});

        int[] colors = new int[] { Color.parseColor("#77c4d3")};
        XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
        renderer.setOrientation(Orientation.VERTICAL);
        setChartSettings(renderer, "Urge vs TimeOfTheDay Pattern", "Time of the day", "Urge", 1,
            12, 0, 7, Color.WHITE, Color.WHITE);
        renderer.setXLabels(0);
        renderer.setYLabels(10);
        renderer.setXRoundedLabels(false);
        //renderer.setYRoundedLabels(false);
        renderer.addXTextLabel(0, "00 AM  ");
        renderer.addXTextLabel(1, "01 AM  ");
        renderer.addXTextLabel(2, "02 AM  ");
        renderer.addXTextLabel(3, "03 AM  ");
        renderer.addXTextLabel(4, "04 AM  ");
        renderer.addXTextLabel(5, "05 AM  ");
        renderer.addXTextLabel(6, "06 AM  ");
        renderer.addXTextLabel(7, "07 AM  ");
        renderer.addXTextLabel(8, "08 AM  ");
        renderer.addXTextLabel(9, "09 AM  ");
        renderer.addXTextLabel(10, "10 AM  ");
        renderer.addXTextLabel(11, "11 AM  ");
        renderer.addXTextLabel(12, "12 Noon  ");
        renderer.addXTextLabel(13, "1 PM  ");
        renderer.addXTextLabel(14, "2 PM  ");
        renderer.addXTextLabel(15, "3 PM  ");
        renderer.addXTextLabel(16, "4 PM  ");
        renderer.addXTextLabel(17, "5 PM  ");
        renderer.addXTextLabel(18, "6 PM  ");
        renderer.addXTextLabel(19, "7 PM  ");
        renderer.addXTextLabel(20, "8 PM  ");
        renderer.addXTextLabel(21, "9 PM  ");
        renderer.addXTextLabel(22, "10 PM  ");
        renderer.addXTextLabel(23, "11 PM  ");

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

        final GraphicalView grfv = ChartFactory.getBarChartView(TimeCravingBarChart.this, buildBarDataset(titles, values), renderer,Type.DEFAULT);   
        return grfv;
      }
      protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
            XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
            renderer.setAxisTitleTextSize(20);
            renderer.setLabelsTextSize(20);
            renderer.setLegendTextSize(20);
            renderer.setPanEnabled(true, false);
            renderer.setBarSpacing(0);
            renderer.setOrientation(Orientation.VERTICAL); 
            renderer.setZoomEnabled(false, false);
            renderer.setMarginsColor(Color.parseColor("#EEEDED"));
            renderer.setXLabelsColor(Color.WHITE);
            renderer.setYLabelsColor(0,Color.WHITE);

            renderer.setApplyBackgroundColor(false);
            int length = colors.length;
            for (int i = 0; i < length; i++) {
              SimpleSeriesRenderer r = new SimpleSeriesRenderer();
              r.setColor(colors[i]);
              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]);
              double[] v = values.get(i);
              int seriesLength = v.length;
              for (int k = 0; k < seriesLength; k++) {
                series.add(v[k]);
              }
              dataset.addSeries(series.toXYSeries());
            }
            return dataset;
          }
      protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, String xTitle,
              String yTitle, double xMin, double xMax, double yMin, double yMax, int axesColor,
              int labelsColor) {
            renderer.setYLabelsAlign(Align.RIGHT);
            renderer.setYTitle(yTitle);
            renderer.setXAxisMin(xMin);
            renderer.setXAxisMax(xMax);
            renderer.setYAxisMin(yMin);
            renderer.setYAxisMax(yMax);
            renderer.setMargins(new int[] { 0, 60, 50, 0 }); // top, left, bottom or right 
            renderer.setAxesColor(axesColor);
            renderer.setLabelsColor(labelsColor);
          }
}

2 个答案:

答案 0 :(得分:1)

水平条形图的开发更像是一个实验。这就是here所述的一些问题。

您似乎正在针对1.0.0版进行开发。我建议您升级到最新的1.1.0版here

答案 1 :(得分:0)

你可以试试像

这样的东西
renderer.setBarSpacing(1);