使用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);
                }
            });

猜你喜欢

转载自blog.csdn.net/zhangqunshuai/article/details/85712808