餅狀圖(PieChart)與柱形圖(BarChart)的使用
阿新 • • 發佈:2019-01-31
最近在工作中需要用到餅狀圖的功能,網上查了一下MPAndroidChart開源圖表庫是一個很好的東西,並下載了MPAndroidChart專案執行。於是自己寫了一個簡單的例子,使用PieChart(餅圖)的方法如下:
原始碼下載地址:https://github.com/PhilJay/MPAndroidChart
(一)將其匯入到工程中(更多方法在github中有介紹)
這裡我使用的是Android Studio,只需在Module中的build.grade檔案中新增如下程式碼
repositories {
maven { url "https://jitpack.io" }
}
dependencies {
compile 'com.github.PhilJay:MPAndroidChart:v2.2.5'
}
新增後編譯成功即可使用
(二)在要使用的佈局檔案中新增PieChart
<com.github.mikephil.charting.charts.PieChart
android:id="@+id/pieChart"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.github.mikephil.charting.charts.PieChart>
(三)在程式碼中使用PieChart
private void initChart() {
// 設定餅圖是否接收點選事件,預設為true
pieChart.setTouchEnabled(true);
//設定餅圖是否使用百分比
pieChart.setUsePercentValues(true);
//設定餅圖右下角的文字描述
pieChart.setDescription("測試");
//設定餅圖右下角的文字大小
pieChart.setDescriptionTextSize(16 );
//是否顯示圓盤中間文字,預設顯示
pieChart.setDrawCenterText(true);
//設定圓盤中間文字
pieChart.setCenterText("我在中間");
//設定圓盤中間文字的大小
pieChart.setCenterTextSize(20);
//設定圓盤中間文字的顏色
pieChart.setCenterTextColor(Color.WHITE);
//設定圓盤中間文字的字型
pieChart.setCenterTextTypeface(Typeface.DEFAULT);
//設定中間圓盤的顏色
pieChart.setHoleColor(Color.GREEN);
//設定中間圓盤的半徑,值為所佔餅圖的百分比
pieChart.setHoleRadius(20);
//設定中間透明圈的半徑,值為所佔餅圖的百分比
pieChart.setTransparentCircleRadius(40);
//是否顯示餅圖中間空白區域,預設顯示
pieChart.setDrawHoleEnabled(true);
//設定圓盤是否轉動,預設轉動
pieChart.setRotationEnabled(true);
//設定初始旋轉角度
pieChart.setRotationAngle(0);
//設定比例圖
Legend mLegend = pieChart.getLegend();
//設定比例圖顯示在餅圖的哪個位置
mLegend.setPosition(Legend.LegendPosition.RIGHT_OF_CHART);
//設定比例圖的形狀,預設是方形,可為方形、圓形、線性
mLegend.setForm(Legend.LegendForm.CIRCLE);
// mLegend.setXEntrySpace(7f);
// mLegend.setYEntrySpace(5f);
//設定X軸動畫
pieChart.animateX(1800);
// //設定y軸動畫
// pieChart.animateY(1800);
// //設定xy軸一起的動畫
// pieChart.animateXY(1800, 1800);
//繫結資料
bindData(3);
// 設定一個選中區域監聽
pieChart.setOnChartValueSelectedListener(new OnChartValueSelectedListener() {
@Override
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
Toast.makeText(MainActivity.this,dataSetIndex+""+e.toString(),Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected() {
}
});
}
/**
*
* @param count 分成幾部分
*/
private void bindData(int count) {
/**
* nameList用來表示每個餅塊上的文字內容
* 如:部分一,部分二,部分三
*/
ArrayList<String> nameList = new ArrayList<String>();
for (int i = 0; i < count; i++) {
nameList.add("部分" + (i + 1));
}
/**
* valueList將一個餅形圖分成三部分,各個區域的百分比的值
* Entry建構函式中
* 第一個值代表所佔比例,
* 第二個值代表區域位置
* (可以有第三個引數,表示攜帶的資料object)這裡沒用到
*/
ArrayList<Entry> valueList = new ArrayList<Entry>();
valueList.add(new Entry(20, 0));
valueList.add(new Entry(30, 1));
valueList.add(new Entry(50, 2));
//顯示在比例圖上
PieDataSet dataSet = new PieDataSet(valueList, "不同顏色代表的含義");
//設定個餅狀圖之間的距離
dataSet.setSliceSpace(3f);
// 部分割槽域被選中時多出的長度
dataSet.setSelectionShift(5f);
// 設定餅圖各個區域顏色
ArrayList<Integer> colors = new ArrayList<Integer>();
colors.add(Color.RED);
colors.add(Color.GREEN);
colors.add(Color.BLUE);
dataSet.setColors(colors);
PieData data = new PieData(nameList, dataSet);
//設定以百分比顯示
data.setValueFormatter(new PercentFormatter());
//區域文字的大小
data.setValueTextSize(11f);
//設定區域文字的顏色
data.setValueTextColor(Color.WHITE);
//設定區域文字的字型
data.setValueTypeface(Typeface.DEFAULT);
pieChart.setData(data);
//設定是否顯示區域文字內容
pieChart.setDrawSliceText(pieChart.isDrawSliceTextEnabled());
//設定是否顯示區域百分比的值
for (IDataSet<?> set : pieChart.getData().getDataSets()){
set.setDrawValues(!set.isDrawValuesEnabled());
}
// undo all highlights
pieChart.highlightValues(null);
pieChart.invalidate();
}
柱形圖使用:
private void initBarChart() {
//設定矩形陰影是否顯示
barChart.setDrawBarShadow(false);
//設定值是否在矩形的上方顯示
barChart.setDrawValueAboveBar(true);
//設定右下角描述
barChart.setDescription("測試");
//沒用資料時顯示
barChart.setNoDataText("沒有資料");
// if more than 60 entries are displayed in the chart, no values will be
// drawn
barChart.setMaxVisibleValueCount(60);
// 設定是否可以觸控
barChart.setTouchEnabled(true);
// 是否可以拖拽
barChart.setDragEnabled(true);
// 是否可以縮放
barChart.setScaleEnabled(true);
// 集雙指縮放
barChart.setPinchZoom(false);
// 設定是否顯示錶格顏色,矩形之間的空隙
barChart.setDrawGridBackground(false);
// 設定表格的的顏色,矩形之間的空隙顏色
barChart.setGridBackgroundColor(Color.GRAY);
//設定比例顯示
Legend l = barChart.getLegend();
//設定比例顯示在柱形圖哪個位置
l.setPosition(Legend.LegendPosition.BELOW_CHART_LEFT);
//設定比例顯示形狀,方形,圓形,線性
l.setForm(Legend.LegendForm.SQUARE);
//設定比例顯示形狀的大小
l.setFormSize(15f);
//設定比例顯示文字的大小
l.setTextSize(15f);
l.setXEntrySpace(4f);
//設定X軸方向上的屬性
XAxis xAxis = barChart.getXAxis();
//設定標籤顯示在柱形圖的上方還是下方
xAxis.setPosition(XAxis.XAxisPosition.TOP);
xAxis.setTypeface(Typeface.DEFAULT);
//設定是否繪製表格
xAxis.setDrawGridLines(false);
//設定x標籤的間隙
xAxis.setSpaceBetweenLabels(2);
//設定柱形圖左邊y軸方向上的屬性
YAxis leftAxis = barChart.getAxisLeft();
leftAxis.setTypeface(Typeface.DEFAULT);
//設定y軸上的標籤數,boolean值為true代表必須8個
leftAxis.setLabelCount(8, false);
leftAxis.setValueFormatter(new DefaultYAxisValueFormatter(0));
//設定標籤在柱形圖的哪個位置
leftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
//設定y軸標籤之間的間距
leftAxis.setSpaceTop(15f);
leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)
//設定柱形圖右邊y軸方向上的屬性,屬性含義與上面相同
YAxis rightAxis = barChart.getAxisRight();
rightAxis.setDrawGridLines(false);
rightAxis.setTypeface(Typeface.DEFAULT);
rightAxis.setLabelCount(5, true);
rightAxis.setValueFormatter(new DefaultYAxisValueFormatter(0));
rightAxis.setSpaceTop(15f);
rightAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)
// 隱藏右邊的座標軸
// barChart.getAxisRight().setEnabled(false);
// 隱藏左邊的座標軸(同上)
// barChart.getAxisLeft().setEnabled(false);
setData(15);
}
/**
* 繫結資料
* @param count x軸上的標籤數
*/
private void setData(int count) {
//設定x軸方向上的標籤資料
ArrayList<String> xVals = new ArrayList<String>();
for (int i = 0; i < count; i++) {
xVals.add(i+"");
}
//設定每個矩形在y軸上的值
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
for (int i = 0; i < count; i++) {
yVals1.add(new BarEntry(20*i, i));
}
//第一個引數是各個矩形在y軸方向上的值得集合,第二個引數為比例的文字說明
BarDataSet set1 = new BarDataSet(yVals1, "不同顏色代表不同的值");
//設定矩形之間的間距,引數為百分數,可控制矩形的寬度
set1.setBarSpacePercent(10f);
//設定矩形的顏色
int colors[]={0xffff0000,0xff00ff00,0xff0000ff};
set1.setColors(colors);
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
//設定柱形圖的資料
BarData data = new BarData(xVals, dataSets);
data.setValueTextSize(10f);
data.setValueTypeface(Typeface.DEFAULT);
barChart.setData(data);
}