在BarChart平移上改变条形宽度 - Achartengine

时间:2013-06-17 14:27:26

标签: android achartengine

我正在尝试使用achartengine制作一个BarChart,但到目前为止,我还是无法摆脱以下效果:只有当值位于屏幕边缘时才会正确显示条形宽度,但是创业,酒吧更大,有时甚至隐藏酒吧的价值。这可能与我的数据集不是x值的持续系列有关吗?我有一个点在x = 17然后下一个值是在x = 24,似乎更改的条宽度发生在这两个值之间。有人可以协助使这个图表看起来很好吗?

提前感谢您的帮助!

[图片显示在片段的开头] The graph being shown on fragment's start

[滚动到左侧时显示的图表] The graph being shown when scrolling to the left

制作图表的代码:

    XYSeries xySerie = new XYSeries("Climb Level Statistics");
    XYSeriesRenderer serieRenderer;
    XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
    XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();

    //Adding data to XYSerie and adding XYSerie to mDataset
    //stats is an int[] containing level id, value for the level, level id, ...
    //example of dataset used for image shown above: {17, 4, 24, 3, 25, 7, 26, 10, 27, 4}
    int statsSize = stats.size();
    double routeLevel;
    double climbsQuantity;
    for (int counter = 0; counter<statsSize; counter++){
        routeLevel = stats.get(counter);
        counter++;
        climbsQuantity = stats.get(counter);
        xySerie.add(routeLevel, climbsQuantity);
    }
    mDataset.addSeries(xySerie);

    //Setting series renderer properties and adding it to the mRenderer
    serieRenderer = new XYSeriesRenderer();
    serieRenderer.setChartValuesTextSize(28);
    serieRenderer.setDisplayChartValues(true);
    mRenderer.addSeriesRenderer(serieRenderer);

    //Setting main renderer properties
    mRenderer.setApplyBackgroundColor(true);
    mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
    mRenderer.setBackgroundColor(Color.TRANSPARENT);
    mRenderer.setLabelsTextSize(15);
    mRenderer.setMargins(new int[] { 30, 30, 30, 30 });
    mRenderer.setZoomButtonsVisible(false);
    mRenderer.setPanLimits(new double[]{0,48, 0, 5000});
    mRenderer.setBarSpacing(1.5);
    mRenderer.setLabelsTextSize(28);
    mRenderer.setLabelsColor(Color.BLACK);
    mRenderer.setXLabels(0);
    mRenderer.setXLabelsColor(Color.BLACK);
    String[] routeLevels = context.getResources().getStringArray(R.array.route_levels);
    int routeLevelsSize = routeLevels.length;
    for (int x=1;x<routeLevelsSize+1;x++){
        mRenderer.addXTextLabel(x, routeLevels[x-1]);
    }
    mRenderer.setYLabels(0);
    mRenderer.setYAxisMin(0);
    mRenderer.setShowLegend(false);
    mRenderer.setZoomEnabled(false);
    mRenderer.setZoomEnabled(false, false);
    mRenderer.setPanEnabled(true, false);


    GraphicalView graphView = ChartFactory.getBarChartView(context, mDataset, mRenderer, BarChart.Type.STACKED);
    graphView.setBackgroundColor(Color.argb(255, 247, 247, 247));

2 个答案:

答案 0 :(得分:3)

我能够通过确保系列是x值的“完美”套件来解决更改条宽问题,从而改变

这:{17,1,4,2,3,25,7,26,10,27,4}

到此:{17,1,4,1,0,19,0,20,0,21,2,22,0,23,0,24,3,25,7,26,10,27,4 }

为了实现这一点,我修改了我的第一个for循环以检查缺少的x值:

for (int x = 0; x<statsSize; x++){
        routeLevel = currentLevel;
        x++;
        currentLevel++;
        climbsQuantity = stats.get(x);
        xySerie.add(routeLevel, climbsQuantity);

        //if not at the last x/y couple of the array, fill the blanks in the serie
        if (x<statsSize-1){ 
            while (stats.get(x+1)>currentLevel){
                routeLevel = currentLevel;
                climbsQuantity = 0;
                xySerie.add(routeLevel, climbsQuantity);
                currentLevel++;
            }
        }
}

现在滚动时条形宽度根本不会改变。不过,这更像是一种解决方法,因为现在我添加的“填充”对都显示0作为值,我觉得有点奇怪。如果我找到隐藏这些0值的方法,我会编辑我的答案......

图的当前外观 enter image description here

答案 1 :(得分:1)

首先,您可以通过更改X轴min和max:

来设置可见区域
renderer.setXAxisMin(min);
renderer.setXAxisMax(max);

要更改条宽,您可以选择几个选项。

如果您的数据集每个系列包含多个元素,那么我建议您使用renderer.setBarSpacing()

如果系列中只有一个元素,那么您可以使用renderer.setBarWidth()