Android统计图表绘制:基于新版MPAndroidChart绘制数理统计柱状图

github上的开源项目MPAndroidChart在最新的3.0.3中,绘制图表的机制有所改变,从数据到图形,需要以新的方式绘制。现在以3.0.3为例,绘制一个简单的柱状图。

使用之前要添加引用:

implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'

写一个布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
 
    <com.github.mikephil.charting.charts.BarChart 
        android:id="@+id/bar_chart" 
        android:layout_width="match_parent" 
        android:layout_height="300dp" 
        android:layout_centerInParent="true" /> 
 
</RelativeLayout>

然后在上层Java代码处理:

package zhangphil.demo; 
 
import android.graphics.Color; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
 
import com.github.mikephil.charting.animation.Easing; 
import com.github.mikephil.charting.charts.BarChart; 
import com.github.mikephil.charting.components.AxisBase; 
import com.github.mikephil.charting.components.Legend; 
import com.github.mikephil.charting.components.XAxis; 
import com.github.mikephil.charting.components.YAxis; 
import com.github.mikephil.charting.data.BarData; 
import com.github.mikephil.charting.data.BarDataSet; 
import com.github.mikephil.charting.data.BarEntry; 
import com.github.mikephil.charting.data.Entry; 
import com.github.mikephil.charting.formatter.IAxisValueFormatter; 
import com.github.mikephil.charting.formatter.IValueFormatter; 
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; 
import com.github.mikephil.charting.utils.ViewPortHandler; 
 
import java.util.ArrayList; 
 
public class MainActivity extends AppCompatActivity { 
    private String[] types = {"银行", "非银金融", "建筑材料", "化工", "医药生物", "电子"}; 
    private float[] changes = {27.91f, 5.9f, -0.4f, -17.79f, -21.85f, -39.58f}; 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
 
        BarChart mChart = findViewById(R.id.bar_chart); 
        initBarChart(mChart); 
        setBarChartData(types.length, mChart); 
    } 
 
    private void initBarChart(BarChart mBarChart) { 
        mBarChart.setBackgroundColor(Color.WHITE); 
        mBarChart.setDrawGridBackground(false); //网格 
        mBarChart.getDescription().setEnabled(false);//描述 
        //背景阴影 
        mBarChart.setDrawBarShadow(false); 
 
        //显示边界 
        mBarChart.setDrawBorders(false); 
 
        //设置动画效果 
        mBarChart.animateY(1000, Easing.EasingOption.Linear); 
        mBarChart.animateX(1000, Easing.EasingOption.Linear); 
 
        //折线图例 标签 设置 
        Legend l = mBarChart.getLegend(); 
        l.setEnabled(false); 
 
        YAxis leftAxis = mBarChart.getAxisLeft(); 
        YAxis rightAxis = mBarChart.getAxisRight(); 
        leftAxis.setAxisMinimum(0f); 
        rightAxis.setAxisMinimum(0f); 
        leftAxis.setEnabled(false); 
        rightAxis.setEnabled(false); 
 
        XAxis xAxis = mBarChart.getXAxis(); 
 
        //XY轴的设置 
        //X轴设置显示位置在底部 
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 
        //xAxis.setGranularity(1f); 
 
        //xAxis.setDrawAxisLine(true); 
        xAxis.setDrawGridLines(false); 
 
        xAxis.setTextColor(0xff74828F); 
        xAxis.setTextSize(10f); 
        xAxis.setAxisLineColor(0xffe0e0e0); 
 
        xAxis.setValueFormatter(new IAxisValueFormatter() { 
            @Override 
            public String getFormattedValue(float value, AxisBase axis) { 
                int idx = (int) value; 
                return types[idx]; 
            } 
        }); 
    } 
 
    private void setBarChartData(int count, BarChart mChart) { 
        ArrayList<BarEntry> yVals = new ArrayList<>(); 
 
        int[] colors = new int[count]; 
 
        for (int i = 0; i < count; i++) { 
            float val = changes[i]; 
 
            if (val > 0) { 
                colors[i] = 0xffF04933; 
            } 
 
            if (val < 0) { 
                colors[i] = 0xff2BBE53; 
            } 
 
            yVals.add(new BarEntry(i, Math.abs(val))); 
        } 
 
        BarDataSet mBarDataSet = new BarDataSet(yVals, "股票数据"); 
        mBarDataSet.setDrawIcons(false); 
        mBarDataSet.setColors(colors); 
        mBarDataSet.setValueTextSize(12f); 
        mBarDataSet.setValueTextColor(0xff74828F); 
 
        ArrayList<IBarDataSet> dataSets = new ArrayList<>(); 
        dataSets.add(mBarDataSet); 
 
        BarData mBarData = new BarData(dataSets); 
        mBarData.setBarWidth(0.6f); 
 
        mBarData.setValueFormatter(new IValueFormatter() { 
            @Override 
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { 
                int idx = (int) entry.getX(); 
                return String.valueOf(changes[idx]); 
            } 
        }); 
 
        mChart.setData(mBarData); 
    } 
}

代码运行后的结果如图所示:


发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Android编程开发基本规范和原则详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。