1. 程式人生 > >使用MPAndroidChart繪製多條折線圖和餅狀圖部分問題備錄

使用MPAndroidChart繪製多條折線圖和餅狀圖部分問題備錄

餅狀圖

餅狀圖基本使用

    /**
     * 繪製PieChart(餅圖)
     *
     * @param entries
     */
    private void drawPieChart(ArrayList<PieEntry> entries) {

        mColors.clear();
        mColors.add(Color.parseColor("#67E5E5"));
        mColors.add(Color.parseColor("#8BB6F6"));
        mColors.add(
Color.parseColor("#C29DFC")); mColors.add(Color.parseColor("#E5E570")); mPieChart.setUsePercentValues(true); mPieChart.getDescription().setEnabled(false); mPieChart.setTransparentCircleRadius(0f); mPieChart.setRotationAngle(0); mPieChart.setExtraOffsets(
0f, 20.0f, 0f, 15.0f); /** 觸控旋轉 */ mPieChart.setRotationEnabled(false); PieDataSet dataSet = new PieDataSet(entries, ""); dataSet.setSliceSpace(0f); dataSet.setSelectionShift(5f); dataSet.setColors(mColors); mPieChart.setHoleRadius(60f); /** y值圓圈外顯示 */
dataSet.setValueLinePart1OffsetPercentage(80.f); dataSet.setValueLinePart1Length(0.4f); dataSet.setValueLinePart2Length(0.6f); dataSet.setValueLineColor(Color.parseColor("#287DFD")); dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE); /** 顯示百分比 */ dataSet.setDrawValues(dataSet.isDrawValuesEnabled()); PieData data = new PieData(dataSet); data.setValueFormatter(new PercentFormatter()); data.setValueTextSize(10f); data.setValueTextColor(Color.BLACK); mPieChart.setData(data); mPieChart.highlightValues(null); /** 是否鋪滿 */ mPieChart.setDrawHoleEnabled(true); /** y軸動畫 */ mPieChart.animateY(1400); mPieChart.invalidate(); mPieChart.animateY(1400, Easing.EaseInQuad); /** 圖例下部居中 */ Legend ll = mPieChart.getLegend(); ll.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); ll.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER); ll.setOrientation(Legend.LegendOrientation.HORIZONTAL); ll.setDrawInside(false); ll.setEnabled(false); /** 標籤顏色 */ mPieChart.setEntryLabelColor(Color.BLACK); /** 標籤字型大小 */ mPieChart.setEntryLabelTextSize(10f); }

 

多條折線圖

多條折線圖基本使用(以2條為例)

  /**
     * 繪製折線圖
     */
    private void drawLineChart(ArrayList<Entry> intValues, ArrayList<Entry> outValues) {

        mStatisticsChartEmpty.setVisibility(View.GONE);
        mStatisticsAgeEmptyMsg.setText(getString(R.string.common_data_null));
        mStatisticsLineChart.setVisibility(View.VISIBLE);

        //設定描述文字
        mStatisticsLineChart.getDescription().setEnabled(false);
        //設定支援觸控手勢
        mStatisticsLineChart.setTouchEnabled(true);
        mStatisticsLineChart.setDragDecelerationFrictionCoef(0.9f);
        //設定縮放和拖動
        mStatisticsLineChart.setDragEnabled(true);
        mStatisticsLineChart.setScaleEnabled(true);
        mStatisticsLineChart.setDrawGridBackground(false);
        mStatisticsLineChart.setHighlightPerDragEnabled(true);
        //如果禁用,擴充套件可以在x軸和y軸分別完成
        mStatisticsLineChart.setPinchZoom(true);

        setData(intValues, outValues);
        mStatisticsLineChart.animateX(2000);
        Legend l = mStatisticsLineChart.getLegend();
        l.setForm(Legend.LegendForm.LINE);
        l.setTextSize(11f);
        l.setTextColor(Color.WHITE);
        l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
        l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        l.setDrawInside(false);

        //x軸
        XAxis xAxis = mStatisticsLineChart.getXAxis();
        xAxis.enableGridDashedLine(10f, 10f, 0f);
    
            xAxis.setAxisMaximum(24f);
            xAxis.setLabelCount(12);
            xAxis.setValueFormatter(new IAxisValueFormatter() {
                @Override
                public String getFormattedValue(float value, AxisBase axis) {
                    if (value > 24f) {
                        return "";
                    }
                    return String.valueOf((int) value).concat(":00");
                }
            });
        xAxis.setAxisMinimum(0f);
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

        //避免x軸左右盡頭的標註被遮擋
        xAxis.setAvoidFirstLastClipping(true);

        //y軸
        YAxis leftAxis = mStatisticsLineChart.getAxisLeft();
        leftAxis.setAxisMinimum(0f);
        leftAxis.setLabelCount(6);
        leftAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return String.valueOf((int) value);
            }
        });
        leftAxis.enableGridDashedLine(10f, 10f, 0f);
        leftAxis.setDrawZeroLine(true);
        leftAxis.setDrawLimitLinesBehindData(true);
        mStatisticsLineChart.getAxisRight().setEnabled(false);

        mStatisticsLineChart.notifyDataSetChanged();
        mStatisticsLineChart.getLineData().notifyDataChanged();
    }

    /**
     * 設定折線資料集
     */
    private void setData(ArrayList<Entry> inValues, ArrayList<Entry> outValues) {
        LineDataSet set1, set2;
        if (mStatisticsLineChart.getData() != null &&
                mStatisticsLineChart.getData().getDataSetCount() > 0) {
            set1 = (LineDataSet) mStatisticsLineChart.getData().getDataSetByIndex(0);
            set2 = (LineDataSet) mStatisticsLineChart.getData().getDataSetByIndex(1);
            set1.setValues(inValues);
            set2.setValues(outValues);
            mStatisticsLineChart.getData().notifyDataChanged();
            mStatisticsLineChart.notifyDataSetChanged();
        } else {
            //in-value
            set1 = new LineDataSet(inValues, "");
            set1.enableDashedLine(0f, 0f, 0f);
            set1.enableDashedHighlightLine(10f, 5f, 0f);
            set1.setColor(Color.parseColor("#8BB6F6"));
            set1.setCircleColor(Color.parseColor("#00ffffff"));
            set1.setLineWidth(1f);
            set1.setCircleRadius(3f);
            set1.setDrawCircleHole(false);
            set1.setDrawFilled(false);
            set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            set1.setValueFormatter(new IValueFormatter() {
                @Override
                public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                    return String.valueOf((int) value);
                }
            });
            set1.setFormLineWidth(0f);
            set1.setFormSize(0f);

            //out-value
            set2 = new LineDataSet(outValues, "");
            set2.enableDashedLine(0f, 0f, 0f);
            set2.enableDashedHighlightLine(10f, 5f, 0f);
            set2.setColor(Color.parseColor("#9AE4DD"));
            set2.setCircleColor(Color.parseColor("#00ffffff"));
            set2.setLineWidth(1f);
            set2.setCircleRadius(3f);
            set2.setDrawCircleHole(false);
            set2.setDrawFilled(false);
            set2.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            set2.setValueFormatter(new IValueFormatter() {
                @Override
                public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                    return String.valueOf((int) value);
                }
            });
            set2.setFormLineWidth(0f);
            set2.setFormSize(0f);

            LineData data = new LineData(set1, set2);
            data.setValueTextColor(Color.BLACK);
            data.setValueTextSize(9f);
            mStatisticsLineChart.setData(data);
        }
    }

 

注意事項:

1.餅狀圖如何設定標籤線?

dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);

 
2.折線圖如何避免x軸左右盡頭的座標值被遮擋?

 //避免x軸左右盡頭的標註被遮擋
 xAxis.setAvoidFirstLastClipping(true);

 
3.如何保證y軸的值為int型?

 leftAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return String.valueOf((int) value);
            }
        });

 
4.如何保證折線圖上的座標點的橫縱座標值為int型?

 setxxx.setValueFormatter(new IValueFormatter() {
                @Override
                public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                    return String.valueOf((int) value);
                }
            });