使用MPAndroidChart繪製多條折線圖和餅狀圖部分問題備錄
阿新 • • 發佈:2019-01-04
餅狀圖
餅狀圖基本使用
/**
* 繪製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);
}
});