android 字符串折线图,Android + MPAndroidChart 实现折线、柱形和饼状图-程序员宅基地

技术标签: android 字符串折线图  

本文讲讲怎么用 MPAndroidChart 框架实现折线图、柱形图、饼图,并且进行样式设置,达到和宣传图差不多的效果。

一开始看到 MPAndroidChart 的各种图表介绍图感觉很好看,但是直接New一个相应图表,仅仅填充数据的话,样式稍微有些丑。经过一番阅览文档才把样式调整得好看些。

所以就写了这篇文章作下记录。

APP 里实现的最终效果:

c0c567b63d3d

最终效果

引入框架

首先是引入框架:

Gradle配置一下依赖:

repositories {

maven { url 'https://jitpack.io' }

}

dependencies {

implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha'

}

LineChart折线图

显示数据

首先,先让我们的图标正确显示数据吧~

XML 布局文件内加入:

android:id="@+id/line_chart"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

Entry,Entry 可以理解为一个点,赋值 x 和 y 数值。

val lineEntries = ArrayList()

for ((i, e) in countList.withIndex()) {

val entry = Entry(i.toFloat(), e.toFloat())

lineEntries.add(entry)

}

LineDataSet,可以理解为一条线。

val lineDataSet = LineDataSet(lineEntries, "")

LineData,可以理解为多条线的集合。

val lineData = LineData(lineDataSet)

view.line_chart.data = lineData

// 填充数据后要重绘图表

view.line_chart.invalidate()

然后你会得到:

c0c567b63d3d

折线图

嗯,默认样式有点丑。接下来就是修改样式了。

设置样式

设置LineDataSet的样式。

lineDataSet.apply{

// 不在坐标点上显示 y 数值

setDrawValues(false)

/* 改为曲线显示模式,一共有四种显示模式:

LINEAR,STEPPED,CUBIC_BEZIER,HORIZONTAL_BEZIER

*/

mode = LineDataSet.Mode.HORIZONTAL_BEZIER

// 改变线条颜色

color = resources.getColor(R.color.blue)

// 不显示相应坐标点的小圆圈

setDrawCircles(false)

setDrawCircleHole(false)

// 设置线的宽度

lineWidth = 1.5f

}

设置 X 轴的样式。

val xAxis = view.chart.xAxis

// 这里的listStringDatePastDays方法的功能是获取近7天的日期字符串数组

val stringDateList = DateUtil.listStringDatePastDays(7)

xAxis.apply{

// 取消网格线显示

setDrawGridLines(false)

// 位置改到图表下方

position = XAxis.XAxisPosition.BOTTOM

// x轴起始改为0

axisMinimum = 0f

// x轴的最小单位设置为1f

granularity = 1f

// 改变x轴的显示内容,

// 然后设置valueFormatter将x轴的数值对应上日期,然后实际上就会显示日期了。

valueFormatter = IAxisValueFormatter { value, axis ->

stringDateList[value.toInt()]

}

}

设置左侧 Y 轴的样式。(同理 x 轴)

val yAxis = view.line_chart_exp.axisLeft

yAxis.granularity = 1f

// 如果你的y轴数值是正数的话,建议最小值为0,因为默认的话会略小于0。

yAxis.axisMinimum = 0f

图表的样式设置。

view.chart.apply{

// 禁用图例

legend.isEnabled = false

// 禁用触摸响应

setTouchEnabled(false)

// 禁用右侧的y轴

axisRight.isEnabled = false

// 取消右下角的Description Label

description.isEnabled = false

// 取消背景的网格绘制

setDrawGridBackground(false)

// 没有数据的时候显示的文本内容

setNoDataText("暂时没有相应数据")

// 设置动画效果

animateY(1000, Easing.Linear)

animateX(1000, Easing.Linear)

}

然后就能得到这样的效果:

c0c567b63d3d

设置样式后的折线图

BarChart 柱形图

柱形图与折线图类似,只是:

Entry 变成了 BarEntry

LineDataSet 变成了 BarDataSet

LineData 变成了 BarData

LineChart 变成了 BarChart

样式设置也差不多,就直接贴代码了:

private fun initStepBarChart(view: View) {

val barEntries = ArrayList()

val stepList = stepService.listFinishTaskCountPastDays(7)

for ((i, e) in stepList.withIndex()) {

val entry = BarEntry(i.toFloat(), e.toFloat())

barEntries.add(entry)

}

val barDataSet = BarDataSet(barEntries, "")

context?.let { barDataSet.color = (ContextCompat.getColor(it, R.color.color_bar_chart)) }

barDataSet.setDrawValues(true)

val barData = BarData(barDataSet)

val xAxisOfBarData = view.bar_chart_step.xAxis

val stringDateList = DateUtil.listStringDatePastDays(7)

xAxisOfBarData.apply {

valueFormatter = IAxisValueFormatter { value, axis ->

stringDateList[value.toInt()]

}

position = XAxis.XAxisPosition.BOTTOM

//xAxisOfBarData.setDrawAxisLine(false)

setDrawGridLines(false)

}

val yAxisOfBarData = view.bar_chart_step.axisLeft

yAxisOfBarData.apply {

axisMinimum = 0f

setDrawGridLines(false)

}

view.bar_chart_step.apply {

legend.isEnabled = false

data = barData

description.isEnabled = false

setDrawGridBackground(false)

axisRight.isEnabled = false

animateY(1000, Easing.Linear)

animateX(1000, Easing.Linear)

setNoDataText("暂时没有相应数据")

invalidate()

}

}

PieChart 饼图

填充数据

依旧类似:

Entry 变成了 PieEntry

LineDataSet 变成了 PieDataSet

LineData 变成了 PieData

LineChart 变成了 PieChart

完整代码:

val pieEntries = ArrayList()

pieEntries.add(PieEntry(0.3, "Pie1"))

pieEntries.add(PieEntry(0.5, "Pie2"))

pieEntries.add(PieEntry(0.2, "Pie3"))

val pieDataSet = PieDataSet(pieEntries, "")

val pieData = PieData(pieDataSet)

view.pie_chart_exp.data = pieData

view.pie_chart_exp.invalidate()

稍微注意一点的地方是,PieEntry没有x、y值,只有一个value占比数值。

所有PieEntry的Value总和应该为1,要不然可能显示不正常。

然后你会得到一块效果很丑的饼:

c0c567b63d3d

04.jpg

可以看到所有每一块的颜色都是相同的,图例也只显示了一个,并且所有饼块都紧邻在了一起,右下角的描述也需要去掉,冰块上方的数字应该改成百分比显示。

设置样式

首先是设置颜色。

// pieColors的颜色会与pieEntries一一对应

val pieColors = ArrayList()

pieColors.add(ContextCompat.getColor(context,R.color.red))

pieColors.add(ContextCompat.getColor(context,R.color.green))

pieColors.add(ContextCompat.getColor(context,R.color.blue))

pieDataSet.colors = pieColors

PieDataSet设置饼块间隔、数值字体大小。

pieDataSet.sliceSpace = 3.0f

pieDataSet.valueTextSize = 9.0f

PieData设置数值以百分比显示和字体颜色。

// 设置ValueFormatter让数值变成百分号(%)形式显示,但是数值还是原来的0.x

pieData.setValueFormatter(PercentFormatter())

pieData.setValueTextColor(ContextCompat.getColor(it, R.color.white))

PieChart的样式设置。

view.pie_chart_exp.apply{

// 设置以百分比显示,这里是指将原来的0.x乘100,并不会加上“%”符号

setUsePercentValues(true)

// 设置Label的字体大小(比如上方的Pie1)

setEntryLabelTextSize(10.0f)

// 设置中间的文本显示

centerText = "经验分布"

// 去掉右下角的Description

description.isEnabled = false

setNoDataText("暂时没有相应数据")

// 开启动画效果

animateY(1000, Easing.Linear)

animateX(1000, Easing.Linear)

}

至此,饼图已经变得挺好看了:

c0c567b63d3d

设置样式后的饼图

当然,你还能进行更多的样式调整,可以参考官方Github Wiki和API文档的介绍。

官方参考文档

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29692851/article/details/117493532

智能推荐

MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用_lambdaquerywrapper查询一条最近记录-程序员宅基地

文章浏览阅读5.3k次,点赞6次,收藏10次。假如我们有一张banner_item表,现需要通过banner_id查出所有数据(查询List)@Datapublic class BannerItem { private Long id; private String name; private String img; private String keyword; private Integer type; private Long bannerId;}QueryWrapp.._lambdaquerywrapper查询一条最近记录

现场嵌入式设备中的EC20模块如何通过互联网将TCP报文传输到家庭局域网_ec20双端口连接-程序员宅基地

文章浏览阅读850次。情况说明: 现场有几台嵌入式设备,每台设备上有一块EC20模块做为TCP客户端,希望将现场采集的传感器数据通过互联网传输到家庭局域网,在家庭局域内任意一台电脑经过配置IP地址后,上面运行一个用C#语言编写的服务器程序,就可以接收现场设备采集的传感器数据。一、家庭网关IP地址1、IP地址218.6.144.60二、家庭网关私网IP地址和私网端口号 1、私网IP地址192.168.16.201 2、私网端口号5000三、嵌入式设备TCP客户端连..._ec20双端口连接

Improving Software Security Analysis using Exploitation Properties_intersecting elements found csdn-程序员宅基地

文章浏览阅读1.5k次。Improving Software Security Analysis using Exploitation Properties12/2007skape [email protected] AbstractReliable exploitation of software vulnerabilities has continued to become more_intersecting elements found csdn

机器学习-分类模型(鸢尾花案例)_鸢尾花模型-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏103次。众所周知,鸢尾花根据 '花瓣长度','花瓣宽度','花萼长度','花萼宽度',分为三类,在数据集中分别用0,1,2来表示类别本次就是通过对鸢尾花特征进行训练来判断出为哪一类,用到了分类算法的4个模型一 导入库函数和数据集,该数据已经分好了训练集和测试集,直接导入import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdata_train = pd.read_csv('./iris_training.csv'_鸢尾花模型

在windows上搭建cs231n本地作业环境_cs231n在本地运行-程序员宅基地

文章浏览阅读731次,点赞2次,收藏3次。在windows上搭建cs231n本地作业环境最近在学习斯坦福大学计算机视觉实验室推出的 cs231n 这门课,在此分享一些自己的学习心得,希望在提升自己的同时能帮大家解决一些小问题。搭建本地作业环境下载作业包 Spring 2020 Assignments(IE浏览器打不开,换其它浏览器)下载好后解压(我放在了桌面)下载数据集CIFAR-10,解压后放到作业代码下的cs231n/datasets里(作业一)下载Anaconda:Anaconda官网在网页底端找到对应版本下载并安装_cs231n在本地运行

centos8.2使用docker安装mysql5.7并导入sql文件_sql注入 mysql linux docker centos-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏3次。centos8.2使用docker安装并启动mysql5.71.安装mysql5.72.查看镜像2.运行容器3.安装成功拷贝sql文件4.进入容器5进入mysql6.创建数据库并导入1.安装mysql5.7docker pull mysql5.7 //指定版本5.7 docker pull mysql //不指定版本默认拉取最新版本2.查看镜像docker images2.运行容器docker run --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT__sql注入 mysql linux docker centos

随便推点

matlab人工选择阈值进行分割,基于MATLAB的图像阈值分割算法的研究-程序员宅基地

文章浏览阅读3.6k次。[摘要]:图像分割是一种重要的数字图像处理技术。本文首先介绍了图像分割技术,其次总结了目前图像分割技术中所用到的阈值、边缘检测、区域提取等方法以及分水岭算法。针对各种阈值分割算法,本文在最后做了详细的研究,并给出了相应的MATLAB程序源代码。[关键词]:数字图像处理;图像分割;阈值;算法ResearchonlgorithmAbstract:ImageInthisthesis,thedigi..._基于matlab的数据阈值处理

【吐血整理】那些让你起飞的计算机基础知识:学什么,怎么学?-程序员宅基地

文章浏览阅读399次。戳蓝字“CSDN云计算”关注我们哦!作者 |帅地责编 | 阿秃我公众号的读者学生以及非科班的应该挺多的,所以我今天这篇文章就写一写,我学过的计算机基础知识,看过的书以及我学过的顺序当然,以下是我个人的一些经验,并且学过的一些知识,仅供参考,也欢迎大家进行补充一、计算机网络在我们用的程序中,99% 都离不开网络,作为一个程序员,我觉得了解计算机网络是必须的,在大学的课程中,一般也都会开设这一门课。..._操作系统学起枯燥

CentOS 安装桌面版向日葵_centos webkitgtk3anzhuang-程序员宅基地

文章浏览阅读6.7k次,点赞2次,收藏20次。1.下载官方的rpm包通过页面下载或者wget下载,无论通过页面安装还是命令安装都会提示失败,缺失依赖,如下:rpm -ivh SunloginClient-10.1.1.38139_amd64.rpm 错误:依赖检测失败: webkitgtk3 被 sunloginclient-10.1.1.38139-1.x86_64 需要 libappindicator-gtk3 被 sunloginclient-10.1.1.38139-1.x86_64 需要2.解决liba._centos webkitgtk3anzhuang

python练习-对n个字符串按照字典序排列_python输入 n(n≤10)个不超过 4 位的整数,并要求按字典顺序(字典顺序的方法:先比-程序员宅基地

文章浏览阅读3.5k次。对n个字符串按照字典序排列题目描述解题思路python代码实现题目描述输入n+1行,第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。需要将n个字符串按照字典排序输出。解题思路1.读取输入正整数num2.再循环读取num行字符串,并放入列表中3.循环比较列表中的元素,第一次比较将最小元素与第一个元素位置调换,第二次比较将第二小元素与第二个元素位置调换。。。python代码实现def swap(a, b): tmp = a_python输入 n(n≤10)个不超过 4 位的整数,并要求按字典顺序(字典顺序的方法:先比

【C++】Windows API 串口通讯通用类源码_c++ 串口类-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏15次。文章目录01、串口通讯02、 CreateFile API03、串口通讯Demo01、串口通讯在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。RS232通信协议是目前最常用的一种全双工点对点式的异步串行通信协议接口标准。RS232接口标准由于出现较早,所以其目前存在很多问题。接口电平值较高,易损坏接口电路的芯片。传输速率较低,大约为20Kbps;传输距离较短,大约为15米左右。接口由三根线TX、RX、GND组成,没有构成差分线_c++ 串口类

QTabWidget设置某个界面不可点击显示_qt tablewidget设置某一页不可点击-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏2次。ui->tabWidget->setTabEnabled(1,false);//设置index=1的页面enabled_qt tablewidget设置某一页不可点击