当前位置:   article > 正文

MPAndroidChart实现-----折线图+柱状图 CombinedChart的使用_mpandroidchart柱状图和折线图共存

mpandroidchart柱状图和折线图共存

首先来看效果图:效果图如下。是折线图和柱状图 组合展示图表

下面上代码。

(1)首先布局文件里面引入CombinedChart

  1. <com.github.mikephil.charting.charts.CombinedChart
  2. android:id="@+id/combined_chart"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_marginLeft="5dp"
  6. android:layout_below="@+id/rl_title"
  7. android:layout_marginRight="5dp"
  8. android:layout_marginBottom="5dp"
  9. />

下面在activity里面写初始化chart和设置数据的一系列代码

(2)在activity的onCreate方法中。调用initChart。初始化图表。

  1. /**
  2. * 初始化Chart
  3. */
  4. private void initChart() {
  5. //不显示描述内容
  6. combinedChart.getDescription().setEnabled(false);
  7. // combinedChart.setDrawOrder(new CombinedChart.DrawOrder[]{
  8. // CombinedChart.DrawOrder.BAR,
  9. // CombinedChart.DrawOrder.LINE
  10. // });
  11. combinedChart.setBackgroundColor(Color.WHITE);
  12. combinedChart.setDrawGridBackground(false);
  13. combinedChart.setDrawBarShadow(false);
  14. combinedChart.setHighlightFullBarEnabled(false);
  15. //显示边界,就是最上面的一条线加粗的
  16. combinedChart.setDrawBorders(false);
  17. combinedChart.setPinchZoom(false);//设置true支持两个指头向X、Y轴的缩放,如果为false,只能支持X或者Y轴的当方向缩放
  18. //设置是否可以拖拽,true可以左右滑动
  19. combinedChart.setDragEnabled(true);
  20. //设置是否可以缩放,false不可以放大缩小
  21. combinedChart.setScaleEnabled(false);
  22. //图例说明
  23. Legend legend = combinedChart.getLegend();
  24. legend.setEnabled(false); //不显示图例 底部的什么颜色代表什么的说明
  25. //Y轴设置
  26. combinedChart.getAxisRight().setDrawGridLines(false);
  27. combinedChart.getAxisRight().setAxisMinimum(0f);
  28. combinedChart.getAxisRight().setLabelCount(8, true);
  29. combinedChart.getAxisLeft().setLabelCount(8, true);
  30. // combinedChart.getAxisLeft().setDrawGridLines(false);
  31. combinedChart.getAxisLeft().setAxisMinimum(0f);
  32. // 去掉左右边线:
  33. // combinedChart.getAxisLeft().setDrawAxisLine(false);
  34. // combinedChart.getAxisRight().setDrawAxisLine(false);
  35. XAxis bottomAxis = combinedChart.getXAxis();
  36. bottomAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
  37. bottomAxis.setGranularity(1f);
  38. bottomAxis.setLabelRotationAngle(-60);//设置x坐标的文字倾斜。为倾斜60°
  39. bottomAxis.setDrawGridLines(false);//去掉x轴的网格竖线
  40. // mCombinedChart.animateX(2000); // 立即执行的动画,x轴
  41. }

(3)设置chart数据。根据自己的需求。我这里是网络访问接口拿到数据之后。调用showDataOnChart

此方法里面设置x轴的数据。 定义混合图表的data。然后data里面放折线图的数据和柱状图的数据。再把data数据设置给combineChart。 调用combinedChart.invalidate()更新数据。

  1. /**
  2. * 展示数据
  3. */
  4. private void showDataOnChart() {
  5. setAxisXBottom();//设置x轴的数据,并是点击的marketview
  6. //绘制图表数据
  7. data = new CombinedData();
  8. //设置折线图数据
  9. data.setData(getLineData());
  10. //设置柱状图数据
  11. data.setData(getBarData());
  12. combinedChart.setData(data);//把数据设置给混合图表
  13. combinedChart.invalidate();//更新数据
  14. combinedChart.setVisibleXRangeMaximum(11);//设置图表最大可见和最小可见个数。既可以固定可见个数。这样少了也是固定宽度。不会变大。如果大于可见宽度则可以滑动查看
  15. combinedChart.setVisibleXRangeMinimum(11);
  16. // combinedChart.animateX(2000);
  17. }
 下面看具体的getAxisXBottom()和getLineDate()和getBarDate()的具体方法。这里的图例暂时没用。效果图的图例是写的view。放在图表上面的布局。遇到的技术问题。都在下面代码中注释说明了。
  1. /**
  2. * 设置横坐标数据
  3. */
  4. private void setAxisXBottom() {
  5. XAxis bottomAxis = combinedChart.getXAxis();
  6. bottomAxis.setValueFormatter(new ValueFormatter() {
  7. @Override
  8. public String getFormattedValue(float value) {
  9. try {
  10. String cityName = (valueList.get((int) value)).getSsdsmc();
  11. if (cityName.length() > 4) {
  12. String bb = cityName.substring(0, 3);
  13. cityName = bb + "...";
  14. }
  15. return cityName;
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. return "";
  19. }
  20. }
  21. });
  22. CloudTicketMarkerView barMv = new CloudTicketMarkerView(this, valueList);
  23. combinedChart.setMarker(barMv); // 柱状图设置market
  24. if (valueList.size() == 3) {
  25. bottomAxis.setLabelCount(valueList.size(), true);//TODO 解决当只有3条数据的时候。第二条x轴不显示横坐标
  26. } else {
  27. bottomAxis.setLabelCount(valueList.size() - 1, false); //TODO ---这里的问题解决,x轴一直错位,或者x轴显示内容比较乱情况
  28. }
  29. }
  30. /**
  31. * 设置折线图绘制数据
  32. *
  33. * @return
  34. */
  35. public LineData getLineData() {
  36. int jineColor = ContextCompat.getColor(this, R.color.hushu_color);
  37. LineData lineData = new LineData();
  38. List<Entry> customCounts = new ArrayList<>();
  39. //人数
  40. for (int i = 0; i < valueList.size(); i++) {
  41. customCounts.add(new Entry(i, valueList.get(i).getHjhs()));
  42. }
  43. LineDataSet lineDataSet = new LineDataSet(customCounts, "平均温度");
  44. lineDataSet.setAxisDependency(YAxis.AxisDependency.RIGHT);
  45. lineDataSet.setColor(jineColor);
  46. lineDataSet.setCircleColor(jineColor);
  47. lineDataSet.setCircleRadius(3);
  48. lineDataSet.setLineWidth(2);
  49. lineDataSet.setValueTextSize(12);
  50. lineDataSet.setValueTextColor(jineColor);
  51. lineData.addDataSet(lineDataSet);
  52. lineData.setDrawValues(false);//设置是否显示数据点的数值
  53. return lineData;
  54. }
  55. /**
  56. * 设置柱状图绘制数据
  57. *
  58. * @return
  59. */
  60. public BarData getBarData() {
  61. int hushuColor = ContextCompat.getColor(this, R.color.jine_color);
  62. BarData barData = new BarData();
  63. //总量金额
  64. List<BarEntry> amounts = new ArrayList<>();
  65. //添加数据
  66. for (int i = 0; i < valueList.size(); i++) {
  67. amounts.add(new BarEntry(i, valueList.get(i).getHjje()));
  68. // averages.add(new BarEntry(i,j[i]));
  69. }
  70. //设置总数的柱状图
  71. BarDataSet amountBar = new BarDataSet(amounts, "蒸发量");
  72. amountBar.setAxisDependency(YAxis.AxisDependency.LEFT);
  73. amountBar.setColor(hushuColor);
  74. amountBar.setValueTextSize(10);
  75. barData.addDataSet(amountBar);
  76. //设置柱状图显示的大小
  77. float barWidth = 0.4f;
  78. barData.setBarWidth(barWidth);
  79. barData.setDrawValues(false);//设置是否显示数据点的数值
  80. //以下是为了解决 柱x状图 左右两边只显示了一半的问题 根据实际情况 而定
  81. combinedChart.getXAxis().setAxisMinimum(-0.5f);
  82. combinedChart.getXAxis().setAxisMaximum((float) (amounts.size() - 0.5));
  83. return barData;
  84. }

 

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号