MPAndroidChart BarChart使用

4,352 阅读5分钟
原文链接: mp.weixin.qq.com

继上次的LineChart,本篇文章记录柱状图BarChart的使用,原理与LineChart没什么区别,都是定义左右YAxis和上下的XAxis,然后设置Labels,最后填充数据就ok。先看看效果图

使用

  • XML布局

  1. <com.github.mikephil.charting.charts.BarChart

  2.        android:id="@+id/chart1"

  3.        android:layout_width="match_parent"

  4.        android:layout_height="match_parent"

  5.       />

  • 定义BarChart管理器

  1. /**

  2. * @author Administrator

  3. * @version 1.0

  4. * @description class description

  5. * @date 2018/1/2

  6. */

  7. public class BarChartManager {

  8.  private BarChart mBarChart;

  9.  private YAxis leftAxis;

  10.  private YAxis rightAxis;

  11.  private XAxis xAxis;

  12.  public BarChartManager(BarChart barChart) {

  13.    this.mBarChart = barChart;

  14.    leftAxis = mBarChart.getAxisLeft();

  15.    rightAxis = mBarChart.getAxisRight();

  16.    xAxis = mBarChart.getXAxis();

  17.  }

  18.  /**/

  19.  private void initLineChart() {

  20.    mBarChart.setDrawValueAboveBar(false);

  21.    mBarChart.getDescription().setEnabled(false);

  22.    //背景颜色

  23.    //mBarChart.setBackground(SupportApp.drawable(R.drawable.shape_out_in));

  24.    //网格

  25.    mBarChart.setDrawGridBackground(false);

  26.    //背景阴影

  27.    mBarChart.setDrawBarShadow(false);

  28.    mBarChart.setHighlightFullBarEnabled(false);

  29.    //显示边界

  30.    mBarChart.setDrawBorders(false);

  31.    mBarChart.setPadding(1, 1, 1, 1);

  32.    //设置动画效果

  33.    mBarChart.animateY(1000, Easing.EasingOption.Linear);

  34.    mBarChart.animateX(1000, Easing.EasingOption.Linear);

  35.    mBarChart.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);

  36.    mBarChart.setOnTouchListener(null);

  37.    //折线图例 标签 设置

  38.    Legend legend = mBarChart.getLegend();

  39.    legend.setForm(Legend.LegendForm.CIRCLE);

  40.    legend.setTextSize(11f);

  41.    legend.setTextColor(Color.WHITE);

  42.    //显示位置

  43.    legend.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);

  44.    legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);

  45.    legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);

  46.    legend.setDrawInside(false);

  47.    legend.setXEntrySpace(32);

  48.    legend.setTextSize(12);

  49.    //XY轴的设置

  50.    //X轴设置显示位置在底部

  51.    rightAxis.setEnabled(false);

  52.    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

  53.    xAxis.setTextSize(10);

  54.    xAxis.setTextColor(Color.WHITE);

  55.    xAxis.setAxisMinimum(0f);

  56.    leftAxis.setAxisMinimum(0f);

  57.    leftAxis.setTextSize(12);

  58.    leftAxis.setTextColor(Color.WHITE);

  59.    xAxis.setGranularityEnabled(true);

  60.    xAxis.setGranularity(0.9f);

  61.    xAxis.setCenterAxisLabels(true);

  62.    mBarChart.notifyDataSetChanged();

  63.  }

  64.  /**

  65.   * 展示柱状图(一条)

  66.   */

  67.  public void showBarChart(List<Float> xAxisValues, List<Float> yAxisValues, String label,

  68.      int color) {

  69.    initLineChart();

  70.    ArrayList<BarEntry> entries = new ArrayList<>();

  71.    for (int i = 0; i < yAxisValues.size(); i++) {

  72.      entries.add(new BarEntry(xAxisValues.get(i), yAxisValues.get(i)));

  73.    }

  74.    // 每一个BarDataSet代表一类柱状图

  75.    BarDataSet barDataSet = new BarDataSet(entries, label);

  76.    barDataSet.setColor(color);

  77.    barDataSet.setValueTextSize(9f);

  78.    barDataSet.setFormLineWidth(1f);

  79.    barDataSet.setFormSize(15.f);

  80.    barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

  81.    BarData data = new BarData(barDataSet);

  82.    data.setDrawValues(false);

  83.    data.setBarWidth(0.5f);

  84.    data.setValueTextColor(SupportApp.color(R.color.white));

  85.    //设置X轴的刻度数

  86.    xAxis.setLabelCount(xAxisValues.size() - 1, false);

  87.    mBarChart.setData(data);

  88.    mBarChart.invalidate();

  89.  }

  90.  /**

  91.   * 展示柱状图(多条)

  92.   */

  93.  public void showBarChart(List<Float> xAxisValues, List<List<Float>> yAxisValues,

  94.      List<String> labels, List<Integer> colours) {

  95.    initLineChart();

  96.    BarData data = new BarData();

  97.    for (int i = 0; i < yAxisValues.size(); i++) {

  98.      ArrayList<BarEntry> entries = new ArrayList<>();

  99.      for (int j = 0; j < yAxisValues.get(i).size(); j++) {

  100.        entries.add(new BarEntry(xAxisValues.get(j), yAxisValues.get(i).get(j)));

  101.      }

  102.      BarDataSet barDataSet = new BarDataSet(entries, labels.get(i));

  103.      barDataSet.setColor(colours.get(i));

  104.      barDataSet.setValueTextColor(colours.get(i));

  105.      barDataSet.setValueTextSize(10f);

  106.      barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

  107.      barDataSet.setDrawValues(false);

  108.      data.addDataSet(barDataSet);

  109.    }

  110.    int amount = yAxisValues.size();

  111.    float groupSpace = 0.5f; //柱状图组之间的间距

  112.    float barSpace = (float) ((1 - 0.12) / amount / 20); // x4 DataSet

  113.    float barWidth = (float) ((1 - 0.12) / amount / 10 * 4); // x4 DataSet

  114.    // (0.2 + 0.02) * 4 + 0.08 = 1.00 -> interval per "group"

  115.    xAxis.setLabelCount(xAxisValues.size() - 1, false);

  116.    List<String> values = Lists.newArrayList();

  117.    values.add("11-01");

  118.    values.add("11-02");

  119.    values.add("11-03");

  120.    values.add("11-04");

  121.    values.add("11-05");

  122.    values.add("11-06");

  123.    values.add("11-07");

  124.    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

  125.    xAxis.setValueFormatter(new YAxisValueFormatter(values));

  126.    data.setBarWidth(barWidth);

  127.    data.groupBars(0, groupSpace, barSpace);

  128.    mBarChart.notifyDataSetChanged();

  129.    mBarChart.setData(data);

  130.    mBarChart.invalidate();

  131.  }

  132.  /**

  133.   * 展示柱状图(多条)

  134.   */

  135.  public void showBarChart(List<Float> xAxisValues, List<List<Float>> yAxisValues,

  136.      List<String> labels, List<Integer> colours, List<String> values) {

  137.    initLineChart();

  138.    BarData data = new BarData();

  139.    for (int i = 0; i < yAxisValues.size(); i++) {

  140.      ArrayList<BarEntry> entries = new ArrayList<>();

  141.      for (int j = 0; j < yAxisValues.get(i).size(); j++) {

  142.        entries.add(new BarEntry(xAxisValues.get(j), yAxisValues.get(i).get(j)));

  143.      }

  144.      BarDataSet barDataSet = new BarDataSet(entries, labels.get(i));

  145.      barDataSet.setColor(colours.get(i));

  146.      barDataSet.setValueTextColor(colours.get(i));

  147.      barDataSet.setValueTextSize(10f);

  148.      barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

  149.      barDataSet.setDrawValues(false);

  150.      data.addDataSet(barDataSet);

  151.    }

  152.    int amount = yAxisValues.size();

  153.    float groupSpace = 0.5f; //柱状图组之间的间距

  154.    float barSpace = (float) ((1 - 0.12) / amount / 20); // x4 DataSet

  155.    float barWidth = (float) ((1 - 0.12) / amount / 10 * 4); // x4 DataSet

  156.    xAxis.setLabelCount(xAxisValues.size() - 1, false);

  157.    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

  158.    xAxis.setValueFormatter(new YAxisValueFormatter(values));

  159.    data.setBarWidth(barWidth);

  160.    data.groupBars(0, groupSpace, barSpace);

  161.    mBarChart.notifyDataSetChanged();

  162.    mBarChart.setData(data);

  163.  }

  164.  /**

  165.   * 设置Y轴值

  166.   */

  167.  public void setYAxis(float max, float min, int labelCount) {

  168.    if (max < min) {

  169.      return;

  170.    }

  171.    leftAxis.setAxisMaximum(max);

  172.    leftAxis.setAxisMinimum(min);

  173.    leftAxis.setLabelCount(labelCount, false);

  174.    rightAxis.setAxisMaximum(max);

  175.    rightAxis.setAxisMinimum(min);

  176.    rightAxis.setLabelCount(labelCount, false);

  177.    mBarChart.invalidate();

  178.  }

  179.  /**

  180.   * 设置X轴的值

  181.   */

  182.  public void setXAxis(float max, float min, int labelCount) {

  183.    xAxis.setAxisMaximum(max);

  184.    xAxis.setAxisMinimum(min);

  185.    xAxis.setLabelCount(labelCount, false);

  186.    mBarChart.invalidate();

  187.  }

  188.  /**

  189.   * 设置高限制线

  190.   */

  191.  public void setHightLimitLine(float high, String name, int color) {

  192.    if (name == null) {

  193.      name = "高限制线";

  194.    }

  195.    LimitLine hightLimit = new LimitLine(high, name);

  196.    hightLimit.setLineWidth(4f);

  197.    hightLimit.setTextSize(10f);

  198.    hightLimit.setLineColor(color);

  199.    hightLimit.setTextColor(color);

  200.    leftAxis.addLimitLine(hightLimit);

  201.    mBarChart.invalidate();

  202.  }

  203.  /**

  204.   * 设置低限制线

  205.   */

  206.  public void setLowLimitLine(int low, String name) {

  207.    if (name == null) {

  208.      name = "低限制线";

  209.    }

  210.    LimitLine hightLimit = new LimitLine(low, name);

  211.    hightLimit.setLineWidth(4f);

  212.    hightLimit.setTextSize(10f);

  213.    leftAxis.addLimitLine(hightLimit);

  214.    mBarChart.invalidate();

  215.  }

  216.  /**

  217.   * 设置描述信息

  218.   */

  219.  public void setDescription(String str) {

  220.    Description description = new Description();

  221.    description.setText(str);

  222.    mBarChart.setDescription(description);

  223.    mBarChart.invalidate();

  224.  }

  225.  /**

  226.   * 展示柱状图(多条)

  227.   */

  228.  public void showBarChartPlan(List<Float> xAxisValues, List<List<Float>> yAxisValues,

  229.      List<String> labels, List<Integer> colours, List<String> values) {

  230.    initLineChart();

  231.    BarData data = new BarData();

  232.    for (int i = 0; i < yAxisValues.size(); i++) {

  233.      ArrayList<BarEntry> entries = new ArrayList<>();

  234.      for (int j = 0; j < yAxisValues.get(i).size(); j++) {

  235.        entries.add(new BarEntry(xAxisValues.get(j), yAxisValues.get(i).get(j)));

  236.      }

  237.      BarDataSet barDataSet = new BarDataSet(entries, labels.get(i));

  238.      barDataSet.setColor(colours.get(i));

  239.      barDataSet.setValueTextColor(colours.get(i));

  240.      barDataSet.setValueTextSize(10f);

  241.      barDataSet.setAxisDependency(YAxis.AxisDependency.LEFT);

  242.      barDataSet.setDrawValues(false);

  243.      data.addDataSet(barDataSet);

  244.    }

  245.    int amount = yAxisValues.size();

  246.    float groupSpace = 0.5f; //柱状图组之间的间距

  247.    float barSpace = (float) ((1 - 0.12) / amount / 20); // x4 DataSet

  248.    float barWidth = (float) ((1 - 0.12) / amount / 10 * 4); // x4 DataSet

  249.    xAxis.setLabelCount(xAxisValues.size() - 1, false);

  250.    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

  251.    xAxis.setValueFormatter(new YAxisValueFormatter(values));

  252.    xAxis.setXOffset(barSpace);

  253.    data.setBarWidth(barWidth);

  254.    data.groupBars(0, groupSpace, barSpace);

  255.    mBarChart.setDrawValueAboveBar(true);

  256.    mBarChart.notifyDataSetChanged();

  257.    mBarChart.setData(data);

  258.  }

  259. }

  • 填充数据

  1. public void init(BarChart chart) {

  2.    mManager = new BarChartManager(chart);

  3.    for (int i = 0; i < 7; i++) {

  4.      xValues.add((float) i);

  5.    }

  6.    //设置y轴的数据()

  7.    List<List<Float>> yValues = new ArrayList<>();

  8.    for (int i = 0; i < 4; i++) {

  9.      List<Float> yValue = new ArrayList<>();

  10.      for (int j = 0; j < 7; j++) {

  11.        yValue.add((float) (Math.random() * 8000));

  12.      }

  13.      yValues.add(yValue);

  14.    }

  15.    //颜色集合

  16.    colours.add(SupportApp.color(R.color.color_bar_one));

  17.    colours.add(SupportApp.color(R.color.color_bar_three));

  18.    colours.add(SupportApp.color(R.color.color_bar_four));

  19.    colours.add(SupportApp.color(R.color.color_bar_two));

  20.    //线的名字集合

  21.    List<String> names = new ArrayList<>();

  22.    names.add("米");

  23.    names.add("面");

  24.    names.add("粮");

  25.    names.add("油");

  26.    //创建多条折线的图表

  27.    mManager.showBarChart(xValues, yValues, names, colours);

  28.  }

今天的文章基本都是源码,有使用的MPAndroidChart BarChart的可以参考。