【问题标题】:How to make a CombinedChart have two different scales on MPAndroidChart?如何使组合图表在 MPAndroidChart 上有两种不同的比例?
【发布时间】:2017-06-09 18:39:09
【问题描述】:

我有一个CombinedChart,我希望LineChart 将左轴作为参考,BarChart 将右轴作为参考,但我无法将其取出。

我正在尝试以下代码:

barDataSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

但现在两个图表(LineChartBarChart)都在左侧(混合它们和右轴已消失)。

左右轴的粒度不同。

我怎样才能正确地使每个图表都以一个不同的 Y 轴(分别为左或右)作为参考?

提前致谢!

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    这在MPAndroidChart version 3.0.2 中当然是可能的。

    您可以从下面的屏幕截图中观察到,LineDataSet 具有 AxisDependency.LEFT(从 0 到 21 缩放),而 BarDataSet 具有 AxisDependency.RIGHT(从 0 到 50 缩放),并且根据需要,它们具有不同的粒度:

    这是生成上述图表的概念证明,它是对example project on GitHub 的简单改编:

    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.view.WindowManager;
    
    import com.github.mikephil.charting.charts.CombinedChart;
    import com.github.mikephil.charting.charts.CombinedChart.DrawOrder;
    import com.github.mikephil.charting.components.AxisBase;
    import com.github.mikephil.charting.components.Legend;
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.components.XAxis.XAxisPosition;
    import com.github.mikephil.charting.components.YAxis;
    import com.github.mikephil.charting.data.BarData;
    import com.github.mikephil.charting.data.BarDataSet;
    import com.github.mikephil.charting.data.BarEntry;
    import com.github.mikephil.charting.data.CombinedData;
    import com.github.mikephil.charting.data.Entry;
    import com.github.mikephil.charting.data.LineData;
    import com.github.mikephil.charting.data.LineDataSet;
    import com.github.mikephil.charting.formatter.IAxisValueFormatter;
    
    import java.util.ArrayList;
    
    public class CombinedChartActivity extends FragmentActivity {
    
        private String[] mMonths = new String[] {
                "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"
        };
    
        private CombinedChart mChart;
        private final int itemcount = 12;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_combined);
    
            mChart = (CombinedChart) findViewById(R.id.chart1);
            mChart.getDescription().setEnabled(false);
            mChart.setBackgroundColor(Color.WHITE);
            mChart.setDrawGridBackground(false);
            mChart.setDrawBarShadow(false);
            mChart.setHighlightFullBarEnabled(false);
    
            mChart.setDrawOrder(new DrawOrder[]{
                    DrawOrder.BAR, DrawOrder.BUBBLE, DrawOrder.CANDLE, DrawOrder.LINE, DrawOrder.SCATTER
            });
    
            Legend l = mChart.getLegend();
            l.setWordWrapEnabled(true);
            l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
            l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
            l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            l.setDrawInside(false);
    
            YAxis rightAxis = mChart.getAxisRight();
            rightAxis.setDrawGridLines(false);
            rightAxis.setGranularity(10f);
            rightAxis.setAxisMinimum(0f);
    
            YAxis leftAxis = mChart.getAxisLeft();
            leftAxis.setDrawGridLines(false);
            rightAxis.setGranularity(1f);
            leftAxis.setAxisMinimum(0f);
    
            XAxis xAxis = mChart.getXAxis();
            xAxis.setPosition(XAxisPosition.BOTH_SIDED);
            xAxis.setAxisMinimum(0f);
            xAxis.setGranularity(1f);
            xAxis.setValueFormatter(new IAxisValueFormatter() {
                @Override
                public String getFormattedValue(float value, AxisBase axis) {
                    return mMonths[(int) value % mMonths.length];
                }
            });
    
            CombinedData data = new CombinedData();
    
            data.setData(generateLineData());
            data.setData(generateBarData());
    
            xAxis.setAxisMaximum(data.getXMax() + 0.25f);
    
            mChart.setData(data);
            mChart.invalidate();
        }
    
        private LineData generateLineData() {
    
            LineData d = new LineData();
    
            ArrayList<Entry> entries = new ArrayList<Entry>();
    
            for (int index = 0; index < itemcount; index++)
                entries.add(new Entry(index + 0.5f, getRandom(15, 5)));
    
            LineDataSet set = new LineDataSet(entries, "Line DataSet");
            set.setColor(Color.rgb(0,100,0));
            set.setLineWidth(2.5f);
            set.setCircleColor(Color.rgb(0,100,0));
            set.setCircleRadius(5f);
            set.setFillColor(Color.rgb(0,100,0));
            set.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            set.setDrawValues(true);
            set.setValueTextSize(10f);
            set.setValueTextColor(Color.rgb(0,100,0));
    
            set.setAxisDependency(YAxis.AxisDependency.LEFT);
            d.addDataSet(set);
    
            return d;
        }
    
        private BarData generateBarData() {
            ArrayList<BarEntry> entries = new ArrayList<BarEntry>();
    
            for (int index = 0; index < itemcount; index++) {
                entries.add(new BarEntry(index, getRandom(25, 25)));
            }
    
            BarDataSet set = new BarDataSet(entries, "Bar DataSet");
            set.setColor(Color.rgb(60, 220, 78));
            set.setValueTextColor(Color.rgb(60, 220, 78));
            set.setValueTextSize(10f);
            set.setAxisDependency(YAxis.AxisDependency.RIGHT);
    
            return new BarData(set);
        }
    
        private float getRandom(float range, float startsfrom) {
            return (float) (Math.random() * range) + startsfrom;
        }
    }
    

    【讨论】:

    • 我图表的右轴和左轴使用相同的比例。我有 'setAxisDependency' 'setGranularity' 'setDrawOrder' 等等。我不明白说这些轴将具有不同比例的那条线或命令是什么。并且它们的值在范围上也不同。
    • 谢谢,我一直在努力对齐轴,代码中的 setAxisDependency 帮助了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多