1. 程式人生 > >餅狀圖(PieChart)與柱形圖(BarChart)的使用

餅狀圖(PieChart)與柱形圖(BarChart)的使用

最近在工作中需要用到餅狀圖的功能,網上查了一下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);
    }