【问题标题】:MPAndroidChart: Creating a closed chart (circular line chart)MPAndroidChart:创建闭合图表(圆形折线图)
【发布时间】:2016-11-10 16:30:51
【问题描述】:

我需要在我的 Android 应用中绘制一个“封闭图表”,如下所示:

数据的xIndex先增加后减少。就像在这个例子中一样:

[3,3],[4,4],[5,5],[6,4],[7,3],[6,2],[5,1],[4,2],[3,3]

当我尝试在 MPAndroidChart 中使用此数据绘制 LineСhart 时,它只呈现数据的前半部分(在 xIndex 下降之前)。其他数据未显示。

如何使用 MPAndroidChart 正确绘制这些数据?

【问题讨论】:

    标签: android mpandroidchart


    【解决方案1】:

    sample app on the Google Play Store 提供了库中各种可用图表的示例。同样,source code 可供您检查,看看它是否具有您想要的功能。

    另外,the wiki 明确表示不支持无序折线图条目。

    请注意,此库不正式支持从条目列表中绘制 LineChart 数据,该条目列表未按条目的 x 位置以升序方式排序。

    话虽如此,如果您愿意预处理您的数据,您应该能够实现您想要的。您必须获取数据并提取两个不同的 DataSet,您将对其应用相同的样式。我能够使用这种技术实现您想要的效果:

    代码如下:

    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.view.Menu;
    import android.view.WindowManager;
    import android.widget.SeekBar;
    import android.widget.TextView;
    
    import com.github.mikephil.charting.charts.LineChart;
    import com.github.mikephil.charting.components.Legend;
    import com.github.mikephil.charting.components.Legend.LegendForm;
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.components.YAxis;
    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.interfaces.datasets.ILineDataSet;
    import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase;
    
    import java.util.ArrayList;
    import java.util.Random;
    
    public class LineChartActivity4 extends DemoBase {
    
        private LineChart mChart;
        private Random rand;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            rand = new Random();
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.activity_linechart);
    
            mChart = (LineChart) findViewById(R.id.chart1);
            mChart.setDrawGridBackground(false);
            mChart.getDescription().setEnabled(false);
            mChart.setTouchEnabled(true);
            mChart.setScaleXEnabled(true);
            mChart.setScaleYEnabled(true);
            mChart.setPinchZoom(true);
            mChart.getLegend().setEnabled(false);
            YAxis leftAxis = mChart.getAxisLeft();
            leftAxis.removeAllLimitLines(); // reset all limit lines to avoid overlapping lines
            leftAxis.enableGridDashedLine(10f, 10f, 0f);
            leftAxis.setDrawZeroLine(false);
            leftAxis.setDrawLimitLinesBehindData(true);
            mChart.getAxisRight().setEnabled(true);
            mChart.setDragOffsetX(20);
            mChart.setData(generateClosedData(90, 180, 15));
            mChart.animateX(2500);
        }
    
        private LineData generateClosedData(float offset, float range, float delta) {
            ArrayList<Entry> topEntries = new ArrayList<>();
            ArrayList<Entry> bottomEntries = new ArrayList<>();
    
            for (int x = 0; x <= 180; x++) {
                float val1 = offset + generateValue(x, range, delta);
                float val2 = offset - generateValue(x, range, delta);
                topEntries.add(new Entry(x, val1));
                bottomEntries.add(new Entry(x, val2));
            }
    
            LineDataSet set1 = generateLineDataSet(topEntries);
            LineDataSet set2 = generateLineDataSet(bottomEntries);
    
            ArrayList<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1);
            dataSets.add(set2);
            LineData data = new LineData(dataSets);
            return data;
        }
    
        private float generateValue(int x, float range, float delta) {
            float sine = (float) Math.sin(Math.toRadians(x));
            float scaledSine = sine * range;
            if (x == 0 || x == 180) {
                return scaledSine;
            }
            else {
                return scaledSine + rand.nextFloat() * delta;
            }
        }
    
        @NonNull
        private LineDataSet generateLineDataSet(ArrayList<Entry> topEntries) {
            LineDataSet set;
            set = new LineDataSet(topEntries, "");
            set.setColor(Color.BLUE);
            set.setDrawCircles(false);
            set.setLineWidth(4f);
            set.setValueTextSize(9f);
            set.setFormSize(15.f);
            return set;
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.line, menu);
            return true;
        }
    }
    

    【讨论】:

    • 我也是这样决定的,但我认为有一个正确的解决方案。感谢您的回答
    • @gearquicker 别担心 - 你的解决方案是正确的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多