Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android——MPAndroidChart折线图/柱状图/饼形图的使用

Android——MPAndroidChart折线图/柱状图/饼形图的使用

作者头像
Winter_world
发布于 2020-09-25 02:10:35
发布于 2020-09-25 02:10:35
3.6K01
代码可运行
举报
运行总次数:1
代码可运行

【背景】:项目中需要使用到图表,于是找了目前非常热门的开源图表,折线图/柱状图/饼图等应有尽有,各种效果实现都很给力,附上github链接,有原DEMO,github是最好的老师,看DEMO例程源码,相比在网上泛泛的查资料要高效的多。https://github.com/PhilJay/MPAndroidChart

【使用方法】

这里会介绍如何初始化、如何自定义XY坐标轴、如何点击折线图中的数据显示数据标签、如何设置数据。这里仅给出折线图的使用方法,柱状图和饼形图的使用基本类似,在官方GEMO中即可找到,不再赘述了,文末会给出柱状图和饼形图的使用效果展示。

一、折现图的初始化

      入参为折线图的对象和自定义的XY坐标轴数据,初始化的相关属性注释中都已给出,这里主要单独说明下如何自定义XY坐标轴、如何点击折线图中的数据显示数据标签。

【定义X坐标轴】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ValueFormatter xAxisFormatter = new LineBarXAxisFormatter(myAxis); //自定义X坐标轴
xAxis.setValueFormatter(xAxisFormatter);

【定义Y坐标轴】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ValueFormatter yAxisFormatter = new LineBarYAxisFormatter("Min"); //自定义Y坐标轴
yAxis.setValueFormatter(yAxisFormatter);

其中LineBarYAxisFormatter 是单独定义的XY坐标轴格式,我们需要单独封装一个类,继承自ValueFormatter,对于X轴,该类的构造函数,创建对象时即输入坐标轴的数据,通过重写方法getFormattedValue方法获取X轴自定义的数据,LineBarXAxisFormatter类定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 自定义折线点上的X坐标轴
 */
public class LineBarXAxisFormatter extends ValueFormatter {

    private final List<AxisBean> mLabels;

    /**
     * 构造方法,把数据源传进来
     * @param labels
     */
    public LineBarXAxisFormatter(List<AxisBean> labels) {
        mLabels = labels;
    }

    @Override
    public String getFormattedValue(float value) {
    
        int v = (int) value;
        if(mLabels.size()==1){
            return mLabels.get(0).getTime(); //避免当只有一个点时,入参value会出现 -1 0 1 BUG,异常;
        }else if (v < mLabels.size() && v >= 0) {
            return mLabels.get(v).getTime();
        }else{
            return null;
        }

    }
}

对于Y轴,该类的构造函数,创建对象时即输入坐标轴的单位,通过重写方法getFormattedValue方法获取Y轴自定义的数据+单位,如原始数据是10,返回的是10Min,即Y坐标轴显示的是10Min。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//自定义折线点上的Y坐标轴
public class LineBarYAxisFormatter extends ValueFormatter {
    private final DecimalFormat mFormat;
    private String suffix;
    public LineBarYAxisFormatter(String suffix) {
        mFormat = new DecimalFormat("0");
        this.suffix = suffix;
    }
    @Override
    public String getFormattedValue(float value) { 

        return mFormat.format(value) + suffix;
    }
}

【点击折线图中的数据显示数据标签】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
LineBarMarkerView mv = new LineBarMarkerView(this, xAxisFormatter);
mv.setChartView(chart); // For bounds control
chart.setMarker(mv);        //设置 marker ,点击后显示的功能 ,布局可以自定义

这里需要自定义LineBarMarkerView类,继承自MarkerView,内部重写refreshContent方法,当点击折线图的值时,就会出现标签,显示想要的数值,具体形式可以自定义,标签显示框布局也可以自定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//自定义折现点的 值 被点击时,出现的显示框
public class LineBarMarkerView extends MarkerView {
    private final TextView tvContent;
    private final ValueFormatter xAxisValueFormatter;
    private final DecimalFormat format;
    public LineBarMarkerView(Context context, ValueFormatter xAxisValueFormatter) {
        super(context, R.layout.custom_marker_view);
        this.xAxisValueFormatter = xAxisValueFormatter;
        tvContent = findViewById(R.id.tvContent);  //自定义标签框
        format = new DecimalFormat("0");
    }
    // runs every time the MarkerView is redrawn, can be used to update the
    // content (user-interface)
    @Override
    public void refreshContent(Entry e, Highlight highlight) {
        //根据坐标轴数据内容,刷新marker标签显示内容
        String x = xAxisValueFormatter.getFormattedValue(e.getX());
        String y = Float.toString(e.getY());
        tvContent.setText(String.format("x= %s, y= %s", x, y));
        super.refreshContent(e, highlight);
    }
    @Override
    public MPPointF getOffset() {
        return new MPPointF(-(getWidth() / 2), -getHeight());
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
【折线图初始化】
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**初始化折线图
     *
     * @param chart 图表对象
     * @param myAxis XY轴数据
     */
    private void InitLineChart(LineChart chart,ArrayList<AxisBean> myAxis) {

        //设置图表属性
        chart.setLogEnabled(false);//打印日志
        chart.getDescription().setEnabled(false);//取消描述文字
        chart.setNoDataText("没有数据");//没有数据时显示的文字
        chart.setNoDataTextColor(Color.WHITE);//没有数据时显示文字的颜色
        chart.setDrawGridBackground(false);//chart 绘图区后面的背景矩形将绘制
        chart.setDrawBorders(false);//是否禁止绘制图表边框的线
//        chart.setBorderColor(Color.WHITE); //设置 chart 边框线的颜色。
//        chart.setBorderWidth(3f); //设置 chart 边界线的宽度,单位 dp。
        chart.setTouchEnabled(true);     //能否点击
        chart.setDragEnabled(true);   //能否拖拽
        chart.setScaleEnabled(true);  //能否缩放
        chart.setPinchZoom(true);  force pinch zoom along both axis
        chart.animateX(100);//绘制动画 从左到右
        chart.setDoubleTapToZoomEnabled(true);//设置是否可以通过双击屏幕放大图表。默认是true
        chart.setHighlightPerDragEnabled(true);//能否拖拽高亮线(数据点与坐标的提示线),默认是true
        chart.setDragDecelerationEnabled(true);//拖拽滚动时,手放开是否会持续滚动,默认是true(false是拖到哪是哪,true拖拽之后还会有缓冲)

        //设置X坐标轴属性
        XAxis xAxis = chart.getXAxis();       //获取x轴线
        xAxis.enableGridDashedLine(10f, 10f, 0f);
        xAxis.setDrawAxisLine(true);//是否绘制轴线
        xAxis.setDrawGridLines(false);//设置x轴上每个点对应的线
        xAxis.setDrawLabels(true);//绘制标签  指x轴上的对应数值
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//设置x轴的显示位置
        xAxis.setGranularity(1); // 让x轴上自定义的值和折线上相对应

//        xAxis.setTextSize(12f);//设置文字大小
//        xAxis.setTextColor(Color.WHITE);
        //设置0-24h时间点
//        xAxis.setAxisMinimum(0);//设置x轴的最小值
//        xAxis.setAxisMaximum(24);//设置最大值
//        xAxis.setLabelCount(12);  //设置X轴的显示个数
        xAxis.setAvoidFirstLastClipping(true);//图表将避免第一个和最后一个标签条目被减掉在图表或屏幕的边缘
//        xAxis.setAxisLineColor(Color.WHITE);//设置x轴线颜色
//        xAxis.setAxisLineWidth(0.5f);//设置x轴线宽度
        ValueFormatter xAxisFormatter = new LineBarXAxisFormatter(myAxis); //自定义X坐标轴
        xAxis.setValueFormatter(xAxisFormatter);

        //设置Y坐标轴属性
        YAxis yAxis = chart.getAxisLeft();
        YAxis axisRight = chart.getAxisRight();
        yAxis.enableGridDashedLine(10f, 10f, 0f);  //设置Y轴网格线条的虚线,参1 实线长度,参2 虚线长度 ,参3 周期
//        yAxis.setGranularity(1); // 网格线条间距
        axisRight.setEnabled(false);   //设置是否使用 Y轴右边的
        yAxis.setEnabled(true);     //设置是否使用 Y轴左边的
//        yAxis.setGridColor(Color.parseColor("#7189a9"));  //网格线条的颜色
        yAxis.setDrawLabels(true);        //是否显示Y轴刻度
        yAxis.setAxisMinimum(0f); //设置Y轴数值 从零开始
//        yAxis.setStartAtZero(true);        //设置Y轴数值 从零开始
//        yAxis.setDrawGridLines(true);      //是否使用 Y轴网格线条
//        yAxis.setTextSize(12f);            //设置Y轴刻度字体
//        yAxis.setTextColor(Color.WHITE);   //设置字体颜色
//        yAxis.setAxisLineColor(Color.WHITE); //设置Y轴颜色
//        yAxis.setAxisLineWidth(0.5f);
//        yAxis.setDrawAxisLine(true);//是否绘制轴线
//        yAxis.setMinWidth(0f);
//        yAxis.setMaxWidth(200f);
//        yAxis.setDrawGridLines(false);//设置x轴上每个点对应的线
        ValueFormatter yAxisFormatter = new LineBarYAxisFormatter("Min"); //自定义Y坐标轴
        yAxis.setValueFormatter(yAxisFormatter);

        //设置点击折现上的value时出现标签
        LineBarMarkerView mv = new LineBarMarkerView(this, xAxisFormatter);
        mv.setChartView(chart); // For bounds control
        chart.setMarker(mv);        //设置 marker ,点击后显示的功能 ,布局可以自定义

//        Legend l = chart.getLegend();//图例
//        l.setEnabled(true);   //是否使用 图例
    }

二、折现图设置数据

输入参数为折线图对象和自定义的XY坐标轴,因折线图设置数据需要有固定的格式,MyAndroidChart使用的Entry键值对,xy值都为浮点型数据,所以需要将我们的自定义XY坐标轴数据转化为对应的键值对形式,Entry的x key按序号从0开始递增,y value值即是我们要显示的y轴自定义的数值,实际上在我们上一节定义的X轴类中,可以看到获取X轴数据就是通过0开始的序号对应获取我们自定义的值的。代码如下,其中有一个设置X轴数据显示方向的比较有用,可以避免数据多时重叠不美观,单独提一下:

//设置X轴坐标斜着显示,避免X轴点较多时重合             chart.getXAxis().setLabelRotationAngle(-45);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**设置折线图数据
     *
     * @param chart 图表对象
     * @param myAxis XY坐标轴数据
     */
    private void setLineChartData(LineChart chart,ArrayList<AxisBean> myAxis) {

        if (myAxis.size() == 0) return;
        //填充LineDataSet 所需要的键值对格式
        ArrayList<Entry> mValues =new ArrayList<>();
        for (int i = 0; i < myAxis.size(); i++) {
            float val = myAxis.get(i).getValue();
            mValues.add(new Entry(i,val));
        }

        LineDataSet set1;
        //判断图表中原来是否有数据
        if (chart.getData() != null &&  chart.getData().getDataSetCount() > 0) {
            //获取数据1
            set1 = (LineDataSet) chart.getData().getDataSetByIndex(0);
            set1.setValues(mValues);
            //刷新数据
            chart.getData().notifyDataChanged();
            chart.notifyDataSetChanged();
        } else {
            //设置数据1  参数1:数据源 参数2:图例名称
            set1 = new LineDataSet(mValues, "Time-test");
            set1.setMode(LineDataSet.Mode.CUBIC_BEZIER);
            set1.setColor(Color.WHITE);
            set1.setCircleColor(Color.parseColor("#AAFFFFFF"));

            set1.setHighLightColor(Color.WHITE);//设置点击交点后显示交高亮线的颜色
            set1.setHighlightEnabled(true);//是否使用点击高亮线
            set1.setDrawCircles(true);
            set1.setValueTextColor(Color.WHITE);
            set1.setLineWidth(1f);//设置线宽
            set1.setCircleRadius(2f);//设置焦点圆心的大小
            set1.setHighlightLineWidth(0.5f);//设置点击交点后显示高亮线宽
            set1.enableDashedHighlightLine(10f, 5f, 0f);//点击后的高亮线的显示样式
            set1.setValueTextSize(12f);//设置显示值的文字大小
            set1.setDrawFilled(true);//设置使用 范围背景填充
            set1.setDrawValues(false);
            set1.setFillColor(Color.GREEN);

            ArrayList<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(set1); // add the datasets
            //创建LineData对象 属于LineChart折线图的数据集合
            LineData data = new LineData(dataSets);
            // 添加到图表中
            chart.setData(data);
            //绘制图表
            chart.invalidate();
            //设置X轴坐标斜着显示,避免X轴点较多时重合
            chart.getXAxis().setLabelRotationAngle(-45);

        }
    }

三、效果展示

若文章对您有些许帮助,还请您点赞鼓励:),欢迎留言讨论,多谢! 

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
android详解_MPAndroidChart
首先依赖 1. implementation ‘com.github.PhilJay:MPAndroidChart:v3.0.3’
全栈程序员站长
2022/09/20
1.3K0
android详解_MPAndroidChart
MPAndroidChart 之实现底部显示的自定义MarkerView
接到一个需求需要折线图显示数据,权衡利弊后没有自己手绘哦,毕竟怕耽搁时间(或许也是怕写一半写不出来 哈哈哈),所以首选当然是之前接触过的MPAndroidChart,毕竟它很强很强很强。。。
木溪bo
2020/06/22
3.9K0
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
MPAndroidChart攻略——BarChart并列柱状图的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色 昨天在比赛中遇到了MP的并列柱状图,看网上对这方面记录并不是很多,所以今天就做一个教程吧。 先看简
Petterp
2022/02/09
1.6K0
MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。
MPAndroidChart总结
第一天 LineChart的常用属性 lineChart.setDrawBorders(false);//设置绘制边界 lineChart.setDescription("最大值是: "+ max+",最小值是:"+min);// 数据描述 lineChart.setDescriptionTextSize(16f);//数据描述字体大小, 最小值6f, 最大值16f. lineChart.setDescriptionPosition(2500f,50f);//数据描述字体的位置 lineCha
对话、
2022/02/22
1.1K0
MPAndroidChart_折线图的那些事
看效果还挺不错吧,但是我们实际开发时,往往需求没这么简单,下面,我们来对折线图各种方法进行一个总结。
Petterp
2022/02/09
4K0
MPAndroidChart_折线图的那些事
MPAndroidChart_水平条形图的那些事
水平条形图?也就是倒起来的柱状图,简单理解可以为,将正常的图表顺时针旋转90度,其x轴,y轴对应关系如下。
Petterp
2022/02/09
1.9K0
MPAndroidChart_水平条形图的那些事
Android 图表开发开源库MPAndroidChart
图1的效果不是用这个实现的,如果感兴趣可以参考我这篇文章  Android渐变圆环
再见孙悟空_
2023/02/10
2.1K0
Android 图表开发开源库MPAndroidChart
MPAndroidChart_RadarChart雷达图的那些事
重写这两个类 RadarChart和 XAxisRendererRadarChart。其实也就是更改一个方法,别觉得有什么太困难。
Petterp
2022/02/09
2K0
MPAndroidChart_RadarChart雷达图的那些事
【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学
一款基于UGUI的功能强大、简单易用的数据可视化图表插件。支持折线图、柱状图、饼图、雷达图、散点图、热力图、环形图、K线图、极坐标、平行坐标等十多种内置图表,以及3D饼图、3D柱图、3D金字塔、漏斗图、仪表盘、水位图、象形柱图、甘特图、矩形树图等扩展图表。
呆呆敲代码的小Y
2023/07/28
16.7K1
【Unity 实用插件篇】| 可视化图表插件XCharts (折线图、柱状图、饼图等)详细教学
MPAndroidChart_饼图的那些事
MPAndroidChart攻略——PieChartt的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事及自定义标签颜色 目录 从简易Demo开始 1. 百分比的设置 2. 标签的设置(标签就是扇形图里的文字) 3. 饼心的设
Petterp
2022/02/09
2.4K0
MPAndroidChart_饼图的那些事
Echarts折线图案例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
9140
Echarts折线图案例
趋势(一)利用python绘制折线图
折线图用于在连续间隔或时间跨度上显示定量数值,最常用来显示趋势和关系(与其他折线组合起来)。折线图既能直观地显示数量随时间的变化趋势,也能展示两个变量的关系。
HsuHeinrich
2024/11/23
2220
趋势(一)利用python绘制折线图
vue+echarts实现疫情折线图
效果: 代码: <<template> <div> <div id="left1" style = "height:800px;width:100%"></div> </div> </template> <script> //疫情数据 // export default { data() { return { data:{ //疫情数据太多 放不下 要的滴滴我
陶然同学
2023/02/24
5610
vue+echarts实现疫情折线图
vue h5 highcharts可滑动折线面积图
使用示例 代码github地址:https://github.com/Miofly/mio <template> <view class="bg-black" style="width: 100%"> <scroll-view scroll-x> <chart :xData="xDataOne" :yData="yDataOne" backgroundColor="red"></chart> </scroll-view> <scroll-view scroll-x>
用户10106350
2022/10/28
2.8K0
MPAndroidChart_动态柱状图
MPAndroidChart攻略——BarChart的点点滴滴。 MPAndroidChart_折线图的那些事 MPAndroidChart_饼图的那些事 MPAndroidChart_动态柱状图 MPAndroidChart_水平条形图的那些事 MPAndroidChart_并列柱状图,及如何实现点击隐藏掉不需要的条目。 MPAndroidChart_雷达图的那些事 需求:显示最近20条的数据,而且500毫秒秒刷新一次,每次都要求数据最新。 解决办法: 使用List储存,每次存储
Petterp
2022/02/09
1.5K0
MPAndroidChart_动态柱状图
echarts设置折线图点的样式(echarts折线图拐点样式)
用在有类目轴的折线图表中:鼠标放哪个拐点上,就只显示当前拐点的信息,设置symbol: ‘none’,的没有拐点,不显示提示框
全栈程序员站长
2022/08/02
7.2K0
echarts设置折线图点的样式(echarts折线图拐点样式)
Qt | QChart+QChartView+QLineSeries(折线图)+QBarSeries(柱状图)实战
QLineSeries 是 Qt 中的一个类,用于在图表中表示一系列的数据点。它继承自 QAbstractSeries 类,提供了绘制折线图所需的基本功能。
Qt历险记
2024/07/30
1.6K0
Qt | QChart+QChartView+QLineSeries(折线图)+QBarSeries(柱状图)实战
Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程
Echarts 折线图是图表中最常用的显示形式之一。使用 Echarts 做出基本的折线图很简单,但要是想把多组数据放在一张图表中,展示的漂亮又直观就不容易了。本文将带领大家从最基本的折线图,一步步完善,最终做出可读性很高的可视化图表。
蒋川
2022/03/29
13.5K0
Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程
G2 基本使用 折线图 柱状图 饼图 基本配置
  1.浏览器引入 <!-- 引入在线资源 --> <script src="https://gw.alipayobjects.com/os/lib/antv/g2/3.4.10/dist/g2.min.js"></script>
用户1197315
2019/05/25
4.9K0
【Python】pyecharts 模块 ③ ( 使用 pyecharts 模块绘制折线图 )
首先 , 导入 折线图 Line 对象 , 该类定义在 pyecharts.charts 中 ;
韩曙亮
2023/10/11
7770
【Python】pyecharts 模块 ③ ( 使用 pyecharts 模块绘制折线图 )
相关推荐
android详解_MPAndroidChart
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验