Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MPAndroidChart_折线图的那些事

MPAndroidChart_折线图的那些事

作者头像
Petterp
发布于 2022-02-09 03:12:22
发布于 2022-02-09 03:12:22
4K00
代码可运行
举报
文章被收录于专栏:JetPackJetPack
运行总次数:0
代码可运行

MPAndroidChart攻略第一步——LineChart的点点滴滴。 带你入门折线图的基本使用,各种属性的设置,自定义轴上的标签,及去除边框线与轴线,和MarkView提示的使用。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。

目录

1. 从简易折线图开始

2. LineDataSet折线的设置

3. Lengend图例

4. 限制线的用法

5. 网格线的用法

-1. 先来看看x轴网格线

-2. y轴的用法

6. 去掉边框线以及轴线

7. 多条折线的设置

8. 自定义x轴显示的标签

9. MarkView提示

-1. 创建一个类继承自MarkerView

-2. 创建布局

-3. 使用

10. 动画等属性的使用

11. 可以优化改进的地方

从简易折线图开始

话不多说,代码走起,我们先写一个最简易的折线图,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <com.github.mikephil.charting.charts.LineChart
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:id="@+id/chart"/>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {
    private LineChart lineChart;
    private LineDataSet set;
    private ArrayList<Entry> list = new ArrayList<>();  //数据集合

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lineChart = findViewById(R.id.chart);
        for (int i = 0; i < 10; i++) {
            list.add(new Entry(i, (float) (Math.random() * 80)));
        }
        setData(list);
    }
    private void setData(ArrayList<Entry> list) {
            set = new LineDataSet(list, "Label");
            LineData data = new LineData(set);
            //设置数据
            lineChart.setData(data);
    }

看效果还挺不错吧,但是我们实际开发时,往往需求没这么简单,下面,我们来对折线图各种方法进行一个总结。

LineDataSet折线的设置

具体方法注释都在代码里写着。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  private void setLine(LineDataSet set) {
        //设置线条的颜色
        set.setColor(Color.RED);
        //虚线模式下绘制直线
        set.enableDashedLine(20f, 5f, 0f);
        //点击后高亮线的显示颜色
        set.enableDashedHighlightLine(50f, 15f, 0f);

        //设置数据小圆点的颜色
        set.setCircleColor(Color.GREEN);
        //设置圆点是否有空心
        set.setDrawCircles(true);
        //设置线条的宽度,最大10f,最小0.2f
        set.setLineWidth(1f);
        //设置小圆点的半径,最小1f,默认4f
        set.setCircleRadius(5f);
        //设置是否显示小圆点
        set.setDrawCircles(true);
        //设置字体颜色
        set.setValueTextColor(Color.BLUE);
        //设置字体大小
        set.setValueTextSize(20f);
        //设置是否填充
        set.setDrawFilled(true);
    }

效果如下

Lengend图例

下面设置一下Lengend图例,也就是左下角那个小方框

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private void setLenged(){
        Legend legend=lineChart.getLegend();
        legend.setTextColor(Color.RED);
        legend.setTextSize(20f);
        //设置图例垂直对齐
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        //设置图例居中
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        //设置图例方向
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        //设置图例是在图内还是图外绘制
        legend.setDrawInside(false);
        //图例条目之间距离
        legend.setXEntrySpace(4f);
        //设置图例可否换行
        legend.setWordWrapEnabled(true);
        //设置图例现状为线.默认为方形
	    // legend.setForm(Legend.LegendForm.LINE);
        //是否隐藏图例/true_否,false_是
        legend.setEnabled(true);
    }

效果如下

限制线的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private void maxLine(){
        //设置限制线
        LimitLine l1=new LimitLine(60f,"限制线");
        l1.setLineWidth(4f);
        l1.setTextSize(20f);
        l1.setLineColor(Color.RED);
        //允许在虚线模式下绘制(线段长度,分隔长度,偏移量)
        l1.enableDashedLine(10f,10f,0f);
        //设置限制线标签的位置
        l1.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);
        l1.setTextSize(10f);
        //添加限制线
        lineChart.getAxisLeft().addLimitLine(l1);
        //是否隐藏限制线/true_否,false_是
        l1.setEnabled(true);
    }

网格线的用法

先来看看x轴网格线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 private void XwangGe(){
        //设置x轴网格线
        XAxis xAxis=lineChart.getXAxis();
        //以虚线模式画网格线
        xAxis.enableGridDashedLine(10f,10f,0f);
        //设置x轴最大值
        xAxis.setAxisMaximum(200f);
        //设置x轴最小值
        xAxis.setAxisMinimum(0f);

        //撤销设置的最大值,让轴自动计算
        xAxis.resetAxisMaximum();
        //撤销设置的最小值,让轴自动计算
        xAxis.resetAxisMinimum();
//        //设置x轴标签数,默认为6个
        xAxis.setLabelCount(10);
//        //设置x轴标签数,若强制启用true,可能导致轴上的数字不均匀
//        xAxis.setLabelCount(10,true);
        
        //设置x轴之间的最小间隔。用于在图表放大后标签不至于重合
        xAxis.setGranularity(1f);
      //设置x轴轴线的宽度
        xAxis.setAxisLineWidth(1f);
       //设置轴线的颜色
        xAxis.setAxisLineColor(Color.BLUE);
      //设置x轴显示位置在底部
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
    }

y轴的用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//绘制Y轴网格线,有些方法上面也有,这里就不多加了
     private void YwangGe(){
        //y轴默认显示两个轴线,左右
        
        //获取图表左边y轴
        YAxis left=lineChart.getAxisLeft();
        //是否绘制0所在的网格线/默认false绘制
        left.setDrawZeroLine(true);
        //将网格线设置为虚线模式
        left.enableGridDashedLine(10f,10f,0f);
        //获取图表右边y轴
        YAxis right=lineChart.getAxisRight();
        //禁用图表右边y轴
        right.setEnabled(false);
    }

去掉边框线以及轴线

有些时候我们的需求需要去掉边框线,这时候可以用以下办法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void yingcang() {
        //关闭边框矩形
        lineChart.setDrawBorders(false);
        //不绘制y轴左边的线
        lineChart.getAxisLeft().setDrawAxisLine(false);
       //不绘制y轴右边的线
//        lineChart.getAxisRight().setDrawAxisLine(false);
        //禁用图表右边y轴
        lineChart.getAxisRight().setEnabled(false);
        //禁用x轴
        lineChart.getXAxis().setEnabled(false);
        //隐藏图表左边y轴标签
        lineChart.getAxisLeft().setDrawLabels(false);
        //关闭x轴网格线./即竖线
//        lineChart.getXAxis().setDrawGridLines(false);

        //隐藏图表右下角显示内容
        Description description = new Description();
        description.setEnabled(false);
        lineChart.setDescription(description);
    }

多条折线的设置

方法也很简单,就是两个LineDataSet而已,我们修改上面的setData方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void setData(String name1,String name2) {
        //这里随机数了两个集合
        ArrayList <Entry> list=new ArrayList<>();
        ArrayList <Entry> list2=new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            list.add(new Entry(i, (float) (Math.random() * 80)));
        }
        for (int i = 0; i < 10; i++) {
            list2.add(new Entry(i, (float) (Math.random() * 80)));
        }
        //这里两条线
        LineDataSet set1 = new LineDataSet(list, name1);
        LineDataSet set2 = new LineDataSet(list2, name2);
        setLine(set1);
        setLine(set2);
        //避免看不清,将折线2的颜色更改
        set2.setColor(Color.BLACK);
        //创建一个数据集
        ArrayList<ILineDataSet> dataSets=new ArrayList<>();
        dataSets.add(set1);
        dataSets.add(set2);
        LineData data = new LineData(dataSets);
        //设置数据
        lineChart.setData(data);
    }

自定义x轴显示的标签

现在我们自定义一下x轴上显示的文字,y轴同理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void Dif(){
        //为了演示更清楚,我们将x轴标签位于底部
        final String[] data={"周一","周二","周三","周四","周五","周六","周日"};
        XAxis xAxis=lineChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        //格式化标签
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                return data[(int) value];
            }
        });
    }

现在看起来好像没什么问题,我们运行一下,结果提示数组越界。

为什么会这样呢?

原因是我们当初在随机数的时候,里面是10个数,而这里的自定义标签数组却只有7个,所以才产生数组越界。 也就是说,我们在自定义标签的时候,数组的下标一定要与你set数据的下标对应。我们现在修改一下setData()方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   for (int i = 0; i < 7; i++) {
            list.add(new Entry(i, (float) (Math.random() * 80)));
        }
        for (int i = 0; i < 7; i++) {
            list2.add(new Entry(i, (float) (Math.random() * 80)));
        }

运行一下,好了,所以细节问题要注意,还有一个问题就是,有时候如果产生下标个数不正确的情况,用下面这个方法 //也就是强制平分x轴,但可能会造成数据位置偏差 xAxis.setLabelCount(7,true);

MarkView提示

有些时候,我们可能需要点一下数据圆点,让放大显示,这个应该怎样做呢? 设置MarkView提示,如下操作

创建一个类继承自MarkerView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyMarkerView extends MarkerView {
    /**
     * Constructor. Sets up the MarkerView with a custom layout resource.
     *
     * @param context
     * @param layoutResource the layout resource to use for the MarkerView
     */
    private TextView textView;
    private IAxisValueFormatter IAxisValueFormatter;
    private DecimalFormat format;
    public MyMarkerView(Context context) {
        super(context, R.layout.xk);	//第二个参数为布局
        textView=findViewById(R.id.textview);
        format=new DecimalFormat("##0");
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        textView.setText(format.format(e.getY()));
        super.refreshContent(e, highlight);
    }
    public MPPointF getOffset(){
        return  new MPPointF(-(getWidth()/2),-getHeight());
    }
}

创建布局

布局里面也很简单,就一个textview

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="40dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textColor="#000"
        android:layout_centerHorizontal="true"
        android:textSize="24sp"
        android:layout_marginTop="7dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:id="@+id/textview"/>
</RelativeLayout>

使用

然后在onCreate方法里使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 MyMarkerView myMarkerView = new MyMarkerView(this);
 myMarkerView.setChartView(lineChart);
 lineChart.setMarker(myMarkerView);

动画等属性的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //设置绘制折线的动画时间
        lineChart.animateX(2500);
        lineChart.animateY(2500);
//设置折线为圆滑折线(加在上面的setLine方法里)
set.setMode(LineDataSet.Mode.CUBIC_BEZIER);
 		//设置数值选择监听
        lineChart.setOnChartValueSelectedListener(this);
        //后台绘制
        lineChart.setDrawGridBackground(false);
        //设置支持触控手势
        lineChart.setTouchEnabled(false);
        //设置缩放
        lineChart.setDragEnabled(false);
        //设置推动
        lineChart.setScaleEnabled(false);
        //如果禁用,扩展可以在x轴和y轴分别完成
        lineChart.setPinchZoom(true)

可以优化改进的地方

在setData方法里面增加判断,避免多次重新加载 给setData方法中添加如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 		//判断表中原来是否有数据
if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
 			//获取数据
            set = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
            set.setValues(list);
             //刷新数据
            lineChart.getData().notifyDataChanged();
            lineChart.notifyDataSetChanged();
        }else{
            ....
       }

关于折线图的画法及常用的方法以上差不多了,下一次,我会将柱状图的画法及需要注意的地方进行一个总结,当然,柱状图与折线图使用差距并不是很大,如果有帮到你的地方,不胜荣幸。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android——MPAndroidChart折线图/柱状图/饼形图的使用
【背景】:项目中需要使用到图表,于是找了目前非常热门的开源图表,折线图/柱状图/饼图等应有尽有,各种效果实现都很给力,附上github链接,有原DEMO,github是最好的老师,看DEMO例程源码,相比在网上泛泛的查资料要高效的多。https://github.com/PhilJay/MPAndroidChart
Winter_world
2020/09/25
3.6K0
Android——MPAndroidChart折线图/柱状图/饼形图的使用
MPAndroidChart 之实现底部显示的自定义MarkerView
接到一个需求需要折线图显示数据,权衡利弊后没有自己手绘哦,毕竟怕耽搁时间(或许也是怕写一半写不出来 哈哈哈),所以首选当然是之前接触过的MPAndroidChart,毕竟它很强很强很强。。。
木溪bo
2020/06/22
3.9K0
MPAndroidChart总结
第一天 LineChart的常用属性 lineChart.setDrawBorders(false);//设置绘制边界 lineChart.setDescription("最大值是: "+ max+",最小值是:"+min);// 数据描述 lineChart.setDescriptionTextSize(16f);//数据描述字体大小, 最小值6f, 最大值16f. lineChart.setDescriptionPosition(2500f,50f);//数据描述字体的位置 lineCha
对话、
2022/02/22
1.1K0
android详解_MPAndroidChart
首先依赖 1. implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.3’
全栈程序员站长
2022/09/20
1.3K0
android详解_MPAndroidChart
MPAndroidChart_水平条形图的那些事
水平条形图?也就是倒起来的柱状图,简单理解可以为,将正常的图表顺时针旋转90度,其x轴,y轴对应关系如下。
Petterp
2022/02/09
1.9K0
MPAndroidChart_水平条形图的那些事
MPAndroidChart_RadarChart雷达图的那些事
重写这两个类 RadarChart和 XAxisRendererRadarChart。其实也就是更改一个方法,别觉得有什么太困难。
Petterp
2022/02/09
2K0
MPAndroidChart_RadarChart雷达图的那些事
MPAndroidChart_动态柱状图
MPAndroidChart攻略——BarChart的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事 需求:显示最近20条的数据,而且500毫秒秒刷新一次,每次都要求数据最新。 解决办法: 使用List储存,每次存储
Petterp
2022/02/09
1.5K0
MPAndroidChart_动态柱状图
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
MPAndroidChart攻略——BarChart并列柱状图的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色 昨天在比赛中遇到了MP的并列柱状图,看网上对这方面记录并不是很多,所以今天就做一个教程吧。 先看简
Petterp
2022/02/09
1.6K0
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
Android 图表开发开源库MPAndroidChart
图1的效果不是用这个实现的,如果感兴趣可以参考我这篇文章  Android渐变圆环
再见孙悟空_
2023/02/10
2.1K0
Android 图表开发开源库MPAndroidChart
安卓MPAndroidChart绘制柱状图
首先是添加Jar包 进入Gradle Scripts的目录,添加Jar包都在这里 首先是Project这个的allprojects里面加上一行 allprojects { repositories { google() jcenter() maven { url "https://jitpack.io" } } } 在app这个里面denpendencies中弄成这样子的 dependencies { implementat
SingYi
2022/07/14
9790
安卓MPAndroidChart绘制柱状图
MPAndroidChart_饼图的那些事
MPAndroidChart攻略——PieChartt的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色 目录 从简易Demo开始 1. 百分比的设置 2. 标签的设置(标签就是扇形图里的文字) 3. 饼心的设
Petterp
2022/02/09
2.4K0
MPAndroidChart_饼图的那些事
MPchart使用详解及详细属性(一)
项目源代码:https://github.com/libin7278/MpChart
先知先觉
2019/01/21
7.1K0
安卓MPAndroidChart绘制多层级的堆叠条形图
这次是在上一篇的基础上增加的,所以导包这些啥的就跳过了研究了一下代码,发现主要的区别就在于增加data的时候,第二个参数传递的是一个数组,然后就变成了堆叠条形图。
SingYi
2022/07/14
1.3K0
安卓MPAndroidChart绘制多层级的堆叠条形图
【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学
一款基于UGUI的功能强大、简单易用的数据可视化图表插件。支持折线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等十多种内置图表,以及3D饼图、3D柱图、3D金字塔、漏斗图、仪表盘、水位图、象形柱图、甘特图、矩形树图等扩展图表。
呆呆敲代码的小Y
2023/07/28
16.8K1
【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学
安卓MPAndroidChart绘制水平柱状图
这个和垂直柱状图一模一样,只不过把控件名换了一下从barchart换成了HorizontalBarChart
SingYi
2022/07/14
7410
安卓MPAndroidChart绘制水平柱状图
Python数据分析--折线图
最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
MiaoGIS
2022/04/21
1.4K0
Python数据分析--折线图
achartengine之折线图
问题在文章的最后,大致说来就是折线图,如果点的个数大于3个的时候,不是所有的点都显示对应的值的,这是为什么呢,本来以为是小问题,但两天了还没找到原因) 将前两天的折线图代码做了小量修改,形成一个类似于这样的功能(类似web页面的含有查询条件以及数据列表的功能): 页面布局: 页面A,页面B:页面A中只有一个按钮,B中有输入框和提交按钮,输入框用来输入数据。 业务流程: 1.点击A中的按钮,进入B中,此时B中没有输入数据,所以B中默认显示设置好的一个折线图, 2.在B的输入框中输入一系列以“逗号
xiangzhihong
2018/01/30
1.4K0
achartengine之折线图
什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了
导读:数据分析时经常用到的折线图,你真的懂了吗?可以用来呈现哪些数据关系?在数据分析过程中可以解决哪些问题?怎样用Python绘制折线图?本文逐一为你解答。
IT阅读排行榜
2020/01/17
2.3K0
什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了
纯血鸿蒙APP第三方库——MpChart运动健康场景实践案例
MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI,MpChart主要包括线形图、柱状图、饼状图、蜡烛图、气泡图、雷达图、瀑布图等自定义图表库。
小帅聊鸿蒙
2025/01/20
1300
Python matplotlib绘制折线图
matplotlib是Python中的一个第三方库。主要用于开发2D图表,以渐进式、交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力。
Python碎片公众号
2021/02/26
5.8K0
Python matplotlib绘制折线图
相关推荐
Android——MPAndroidChart折线图/柱状图/饼形图的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验