【问题标题】:Android: MPAndroidChart first Bar not showing properlyAndroid:MPAndroidChart first Bar 未正确显示
【发布时间】:2017-09-17 10:15:17
【问题描述】:

我正在使用 MPAndroidChart 绘制散点图。代码如下:

代码:

public void setupScatteredBarChart(ArrayList<String> x, ArrayList<String> y1, ArrayList<String> y2 )
    {
        int maxYvalue = 0;
        final String[] x_name = new String[x.size()];
        for (int j = 0;  j <x.size(); j++)
        {
            String[] temp = x.get(j).split("-");
            x_name[j] = temp[0] + "/" + temp[1];
        }

        ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();

        for (int i = 0; i < x_name.length; i++)
        {
            float val1 = Float.parseFloat(y1.get(i));
            float val2 = Float.parseFloat(y2.get(i));

            yVals1.add(new BarEntry(i, new float[]{val1, val2},getResources().getDrawable(R.drawable.ic_launcher)));

            float val_total = val1 + val2;
            int I = (int) Math.ceil(val_total);
            if (maxYvalue < I)
            {
                maxYvalue = I;
            }
        }

        chart_scattered = (BarChart) findViewById(R.id.chart_scattered);
        chart_scattered.setOnChartValueSelectedListener(Stat.this);
        chart_scattered.getDescription().setEnabled(false);

        chart_scattered.setMaxVisibleValueCount(40); // if more than 40 entries are displayed in the chart, no values will be drawn
        chart_scattered.setPinchZoom(false);      // scaling can now only be done on x- and y-axis separately
        chart_scattered.setDrawGridBackground(false);
        chart_scattered.setDrawBarShadow(false);
        chart_scattered.setDrawValueAboveBar(false);
        chart_scattered.setHighlightFullBarEnabled(false);
        chart_scattered.setDoubleTapToZoomEnabled(false);
        chart_scattered.setTouchEnabled(false);
        chart_scattered.setFitBars(true);
        chart_scattered.animateXY(800, 800);
        chart_scattered.getAxisRight().setEnabled(false);
        chart_scattered.getXAxis().setAxisMinimum(-0.5f); // adjust for showing first bar properly

        // Left Y axis
        YAxis leftAxis = chart_scattered.getAxisLeft();       // change the position of the y-labels
        leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)

        chart_scattered.getAxisLeft().setLabelCount(maxYvalue + 1, true);
        chart_scattered.getAxisLeft().setAxisMinValue(0f);
        chart_scattered.getAxisLeft().setValueFormatter(new MyYAxisValueFormatter());

        // Bottom X axis
        XAxis xLabels = chart_scattered.getXAxis();

        xLabels.setPosition(XAxis.XAxisPosition.BOTTOM);
        xLabels.setAxisMinimum(0f);
        xLabels.setGranularity(1f);
        xLabels.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return x_name[(int) value % x_name.length];
            }
        });

        Legend l = chart_scattered.getLegend();
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);
        l.setFormSize(6f);
        l.setFormToTextSpace(4f);
        l.setXEntrySpace(6f);

        BarDataSet set1;

        if (chart_scattered.getData() != null && chart_scattered.getData().getDataSetCount() > 0)
        {
            set1 = (BarDataSet) chart_scattered.getData().getDataSetByIndex(0);
            set1.setValues(yVals1);
            chart_scattered.getData().notifyDataChanged();
            chart_scattered.notifyDataSetChanged();
        }
        else
        {
            set1 = new BarDataSet(yVals1, "");
            set1.setDrawIcons(false);
            set1.setColors(getColors());
            set1.setStackLabels(new String[]{"A", "B"});

            ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
            dataSets.add(set1);

            BarData data = new BarData(dataSets);
            data.setValueTextColor(Color.WHITE);

            chart_scattered.setData(data);
        }
        chart_scattered.invalidate();
    }

屏幕截图:

问题:

  1. 第一个栏如何正确显示?我进行了很多研究并将以下内容添加到代码中,但仍然没有成功,如上面的屏幕截图所示。

    chart_scattered.getXAxis().setAxisMinimum(-0.5f);

    chart_scattered.setFitBars(true);

  2. 随着日期的不断增加,是否可以设置最多 7 个条形图,超过这个值,它必须水平滚动?

谢谢!

【问题讨论】:

    标签: android scroll mpandroidchart


    【解决方案1】:

    问题 1

    从您的代码中删除这一行

    xLabels.setAxisMinimum(0f);
    

    会解决你的问题。

    问题 2

    要仅显示前 7 条,请使用此..

    chart_scattered.setVisibleXRangeMaximum(7f);
    

    但这将不允许用户水平滚动,如果你想启用滚动,你必须从你的代码中删除这一行

    chart_scattered.setTouchEnabled(false);
    

    我假设您使用了上述行,因此用户无法突出显示条形。要保持这种行为,请使用此功能..

    chart_scattered.setHighlightPerTapEnabled(false); 
    

    【讨论】:

    • 非常感谢,question1 ans 解决了这个问题。在 setTouchEnabled(false) 和 setHighlightPerTapEnabled(false) 之后,条形一旦被触摸就会突出显示条形
    • 如果您不想在点击时突出显示条形,请使用 setHighlightPerTapEnabled(false)。你有什么要求?
    • 滚动通常何时被激活?我已经尝试了多达 14 条,但滚动仍然不可用。是否可以将其设置为仅显示 7 条并从第 8 条开始滚动?
    • 如果您像 setVisibleXRangeMaximum(7f) 一样将最大条数设置为 7...并且如果您的条数超过 7 个,则可以滚动图表。查看答案的第二部分
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多