Android图表控件MPAndroidChart——柱状图BarChart的使用(多条柱状图)
来源:互联网 发布:旅游网站数据库设计 编辑:程序博客网 时间:2024/06/06 02:55
发现最新的MPAndroidChart和以前版本的使用有一些差距,就写下了现在新版的使用方法
相关文章:
Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0)
Android图表控件MPAndroidChart——曲线图LineChart的使用(多条曲线)
Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态添加数据
Android图表控件MPAndroidChart——柱状图BarChart的使用(多条柱状图)
Android图表控件MPAndroidChart——曲线图+柱状图 CombinedChart的使用
Android图表控件MPAndroidChart——源码修改实现曲线图X轴直尺刻度样式
本文相关代码
MPAndroidChart在github上地址:https://github.com/PhilJay/MPAndroidChart
一.效果图
1.一条柱状图
2.多条柱状图
二.具体使用
柱状图的使用和线性图的使用差不多
1.得到BarChart对象 并初始化
2.得到BarEntry对象,此处添加(X,Y)值
3.得到BarDataSet对象,添加BarEntry对象
4.得到BarData对象,添加BarDaraSet对象
5.显示柱状图 BarChart.setData(BarData)
java代码 一个BarChart管理类
public class BarChartManager { private BarChart mBarChart; private YAxis leftAxis; private YAxis rightAxis; private XAxis xAxis; public BarChartManager(BarChart barChart) { this.mBarChart = barChart; leftAxis = mBarChart.getAxisLeft(); rightAxis = mBarChart.getAxisRight(); xAxis = mBarChart.getXAxis(); } /** * 初始化LineChart */ private void initLineChart() { //背景颜色 mBarChart.setBackgroundColor(Color.WHITE); //网格 mBarChart.setDrawGridBackground(false); //背景阴影 mBarChart.setDrawBarShadow(false); mBarChart.setHighlightFullBarEnabled(false); //显示边界 mBarChart.setDrawBorders(true); //设置动画效果 mBarChart.animateY(1000, Easing.EasingOption.Linear); mBarChart.animateX(1000, Easing.EasingOption.Linear); //折线图例 标签 设置 Legend legend = mBarChart.getLegend(); legend.setForm(Legend.LegendForm.LINE); legend.setTextSize(11f); //显示位置 legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT); legend.setOrientation(Legend.LegendOrientation.HORIZONTAL); legend.setDrawInside(false); //XY轴的设置 //X轴设置显示位置在底部 xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setGranularity(1f); //保证Y轴从0开始,不然会上移一点 leftAxis.setAxisMinimum(0f); rightAxis.setAxisMinimum(0f); } /** * 展示柱状图(一条) * * @param xAxisValues * @param yAxisValues * @param label * @param color */ public void showBarChart(List<Float> xAxisValues, List<Float> yAxisValues, String label, int color) { initLineChart(); ArrayList<BarEntry> entries = new ArrayList<>(); for (int i = 0; i < xAxisValues.size(); i++) { entries.add(new BarEntry(xAxisValues.get(i), yAxisValues.get(i))); } // 每一个BarDataSet代表一类柱状图 BarDataSet barDataSet = new BarDataSet(entries, label); barDataSet.setColor(color); barDataSet.setValueTextSize(9f); barDataSet.setFormLineWidth(1f); barDataSet.setFormSize(15.f); ArrayList<IBarDataSet> dataSets = new ArrayList<>(); dataSets.add(barDataSet); BarData data = new BarData(dataSets); //设置X轴的刻度数 xAxis.setLabelCount(xAxisValues.size() - 1, false); mBarChart.setData(data); } /** * 展示柱状图(多条) * * @param xAxisValues * @param yAxisValues * @param labels * @param colours */ public void showBarChart(List<Float> xAxisValues, List<List<Float>> yAxisValues, List<String> labels, List<Integer> colours) { initLineChart(); BarData data = new BarData(); for (int i = 0; i < yAxisValues.size(); i++) { ArrayList<BarEntry> entries = new ArrayList<>(); for (int j = 0; j < yAxisValues.get(i).size(); j++) { entries.add(new BarEntry(xAxisValues.get(j), yAxisValues.get(i).get(j))); } BarDataSet barDataSet = new BarDataSet(entries, labels.get(i)); barDataSet.setColor(colours.get(i)); barDataSet.setValueTextColor(colours.get(i)); barDataSet.setValueTextSize(10f); barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT); data.addDataSet(barDataSet); } int amount = yAxisValues.size(); float groupSpace = 0.12f; //柱状图组之间的间距 float barSpace = (float) ((1 - 0.12) / amount / 10); // x4 DataSet float barWidth = (float) ((1 - 0.12) / amount / 10 * 9); // x4 DataSet // (0.2 + 0.02) * 4 + 0.08 = 1.00 -> interval per "group" xAxis.setLabelCount(xAxisValues.size() - 1, false); data.setBarWidth(barWidth); data.groupBars(0, groupSpace, barSpace); mBarChart.setData(data); } /** * 设置Y轴值 * * @param max * @param min * @param labelCount */ public void setYAxis(float max, float min, int labelCount) { if (max < min) { return; } leftAxis.setAxisMaximum(max); leftAxis.setAxisMinimum(min); leftAxis.setLabelCount(labelCount, false); rightAxis.setAxisMaximum(max); rightAxis.setAxisMinimum(min); rightAxis.setLabelCount(labelCount, false); mBarChart.invalidate(); } /** * 设置X轴的值 * * @param max * @param min * @param labelCount */ public void setXAxis(float max, float min, int labelCount) { xAxis.setAxisMaximum(max); xAxis.setAxisMinimum(min); xAxis.setLabelCount(labelCount, false); mBarChart.invalidate(); } /** * 设置高限制线 * * @param high * @param name */ public void setHightLimitLine(float high, String name, int color) { if (name == null) { name = "高限制线"; } LimitLine hightLimit = new LimitLine(high, name); hightLimit.setLineWidth(4f); hightLimit.setTextSize(10f); hightLimit.setLineColor(color); hightLimit.setTextColor(color); leftAxis.addLimitLine(hightLimit); mBarChart.invalidate(); } /** * 设置低限制线 * * @param low * @param name */ public void setLowLimitLine(int low, String name) { if (name == null) { name = "低限制线"; } LimitLine hightLimit = new LimitLine(low, name); hightLimit.setLineWidth(4f); hightLimit.setTextSize(10f); leftAxis.addLimitLine(hightLimit); mBarChart.invalidate(); } /** * 设置描述信息 * * @param str */ public void setDescription(String str) { Description description = new Description(); description.setText(str); mBarChart.setDescription(description); mBarChart.invalidate(); }}
使用
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.github.mikephil.charting.charts.BarChart android:id="@+id/bar_chart1" android:layout_width="match_parent" android:layout_height="380dp"/> <com.github.mikephil.charting.charts.BarChart android:id="@+id/bar_chart2" android:layout_width="match_parent" android:layout_height="380dp"/> </LinearLayout></ScrollView>
Activity中
public class BarChartActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bar_chart); BarChart barChart1 = (BarChart) findViewById(R.id.bar_chart1); BarChart barChart2 = (BarChart) findViewById(R.id.bar_chart2); BarChartManager barChartManager1 = new BarChartManager(barChart1); BarChartManager barChartManager2 = new BarChartManager(barChart2); //设置x轴的数据 ArrayList<Float> xValues = new ArrayList<>(); for (int i = 0; i <= 10; i++) { xValues.add((float) i); } //设置y轴的数据() List<List<Float>> yValues = new ArrayList<>(); for (int i = 0; i < 4; i++) { List<Float> yValue = new ArrayList<>(); for (int j = 0; j <= 10; j++) { yValue.add((float) (Math.random() * 80)); } yValues.add(yValue); } //颜色集合 List<Integer> colours = new ArrayList<>(); colours.add(Color.GREEN); colours.add(Color.BLUE); colours.add(Color.RED); colours.add(Color.CYAN); //线的名字集合 List<String> names = new ArrayList<>(); names.add("折线一"); names.add("折线二"); names.add("折线三"); names.add("折线四"); //创建多条折线的图表 barChartManager1.showBarChart(xValues, yValues.get(0), names.get(1), colours.get(3)); barChartManager2.showBarChart(xValues, yValues, names, colours); barChartManager2.setXAxis(11f, 0f, 11); }}
三.使用中遇见的一些问题
1.多条柱状图无法显示并排显示,如下所示
猜测显示多条柱状图默认模式是上述的效果,想要显示多条柱状图并排显示需要进行相应的设置
//柱状图宽度data.setBarWidth(barWidth);//(起始点、柱状图组间距、柱状图之间间距)data.groupBars(0, groupSpace, barSpace);
例:如图标题一中图2,显示了4条不同类别的柱状图
其中:
float groupSpace = 0.12f; //柱状图组之间的间距float barSpace = 0.02f; // x4 DataSetfloat barWidth = 0.2f; // x4 DataSet// (0.2 + 0.02) * 4 + 0.12 = 1.00 即100% 按照百分百布局
值是按照 一个组(即X轴一个刻度范围类) 需要显示的柱状图数量以及间距之和为 1
在上述管理类中计算的方式中使用以下方法 (可自由适配柱状图类别数量)
int amount = yAxisValues.size(); //需要显示柱状图的类别 数量float groupSpace = 0.12f; //柱状图组之间的间距float barSpace = (float) ((1 - 0.12) / amount / 10); // x4 DataSetfloat barWidth = (float) ((1 - 0.12) / amount / 10 * 9); // x4 DataSet
2.显示的柱状图左边或者右边只显示了一半,具体效果如下
解决办法
再次设置X轴的最小值和最大值即可
即最后一个方法
public void setXAxis(float max, float min, int labelCount) { xAxis.setAxisMaximum(max); xAxis.setAxisMinimum(min); xAxis.setLabelCount(labelCount, false); mBarChart.invalidate();}
barChartManager2.setXAxis(11f, 0f, 11);
- Android图表控件MPAndroidChart——柱状图BarChart的使用(多条柱状图)
- Android图表控件MPAndroidChart——曲线图+柱状图 CombinedChart的使用
- Android图表控件MPAndroidChart——曲线图LineChart的使用(多条曲线)
- Android'图表MPAndroidchart 的BarChart
- MPAndroidChart开源图表框架—-柱状图(二)
- Android图表库MPAndroidChart(十三)——简约的底部柱状图
- Android图表库MPAndroidChart(十三)——简约的底部柱状图
- Android图表库MPAndroidChart(十三)——简约的底部柱状图
- android柱状图和饼状图的简单使用(MPAndroidChart)
- Android图表控件MPAndroidChart——曲线图LineChart(多条曲线)动态添加数据
- android中MpandroidChart柱状图
- Android MpAndroidchart使用流程和坑--柱状图
- android图表库MPAndroidChart之分组柱状图的里面的坑
- MPAndroidChart开源图表库的使用介绍之饼状图、折线图和柱状图
- Android图表超简单实现柱状图、折线图、饼状图(基于MpAndroidChart)
- Android图表超简单实现柱状图、折线图、饼状图(基于MpAndroidChart)
- MPAndroidChart项目实战(七)——自定义横向柱状图
- MPAndroidChart柱状图
- 理解ES6: Promises
- 关系型数据库的ACID
- Jquery的append()和appendTo()区别
- mongodb
- 初步了解PE文件格式(上)
- Android图表控件MPAndroidChart——柱状图BarChart的使用(多条柱状图)
- 局域网DNS服务器搭建
- 11.11-全栈Java笔记:线程状态转换和任务定时调度
- 安卓逆向学习笔记(0)- HelloWorld.apk的文件结构
- 你真的了解一段Java程序的生命史吗
- 安全检测之Directory traversal in Spring framework
- java正则表达式
- xshell 的快捷命令
- window下boost库编译