Android MPAndroidChart的LineDataSet代表一条统计图表中统计折线,一张统计图表可以同时存在若干条统计折线,其在内存中存储的模型类型数组,从0开始下标。以下是绘制折线图的主要步骤:
注:已不适用于MPAndroidChart3.0.0以上jar包
一、在布局文件中使用LineChart控件
二、在Java文件中对控件进行绑定并设置LineChart的基本属性。
LineChart lineChart;
lineChart=view.findViewById(R.id.lineChart);
lineChart.setDescription("");//数据描述信息
lineChart.setNoDataTextDescription("未获得数据");//没有数据时显示的信息
//可触摸
lineChart.setTouchEnabled(true);
//可缩放
lineChart.setScaleEnabled(true);
//可拖拽
lineChart.setDragEnabled(true);
//是否显示表格背景
lineChart.setDrawGridBackground(false);
//如果禁用,可以分别在x轴和y轴上进行缩放。
lineChart.setPinchZoom(true);
//设置图表上的颜色背景
lineChart.setBackgroundColor(Color.TRANSPARENT);
//表中的数据
LineData lineData=new LineData();
// 数据显示的颜色
lineData.setValueTextColor(ColorTemplate.getHoloBlue());
// 先增加一个空的数据,随后往里面动态添加
lineChart.setData(lineData);
// 当前统计图表中最多在x轴坐标线上显示的总量
lineChart.setVisibleXRangeMaximum(10);
// 将坐标移动到最新
// 此代码将刷新图表的绘图
lineChart.moveViewToX(lineData.getXValCount()-10);
//绘制动画
lineChart.animateX(2500);
数据描述信息
lineChart.setNoDataTextDescription("未获得数据");//没有数据时显示的信息
//可触摸
lineChart.setTouchEnabled(true);
//可缩放
lineChart.setScaleEnabled(true);
//可拖拽
lineChart.setDragEnabled(true);
//是否显示表格背景
lineChart.setDrawGridBackground(false);
//如果禁用,可以分别在x轴和y轴上进行缩放。
lineChart.setPinchZoom(true);
//设置图表上的颜色背景
lineChart.setBackgroundColor(Color.TRANSPARENT);
//表中的数据
LineData lineData=new LineData();
// 数据显示的颜色
lineData.setValueTextColor(ColorTemplate.getHoloBlue());
// 先增加一个空的数据,随后往里面动态添加
lineChart.setData(lineData);
// 当前统计图表中最多在x轴坐标线上显示的总量
lineChart.setVisibleXRangeMaximum(10);
// 将坐标移动到最新
// 此代码将刷新图表的绘图
lineChart.moveViewToX(lineData.getXValCount()-10);
//绘制动画
lineChart.animateX(2500);
三、添加图表的注解
// 图表的注解(只有当数据集存在时候才生效)
Legend legend=lineChart.getLegend();
// 线性,也可是圆
legend.setForm(Legend.LegendForm.LINE);
//颜色
legend.setTextColor(Color.BLACK);
四、定义X,Y轴的属性
//x轴
XAxis xAxis=lineChart.getXAxis();
xAxis.setTextColor(Color.BLACK);
// 如果设置为true,则在绘制时会避免“剪掉”在x轴上的图表或屏幕边缘的第一个和最后一个坐标轴标签项。
xAxis.setAvoidFirstLastClipping(true);
// 几个x坐标轴之间才绘制?
// xAxis.setSpaceBetweenLabels(5);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setEnabled(true);
// 图表左边的y坐标轴线
YAxis leftAxis=lineChart.getAxisLeft();
leftAxis.setTextColor(Color.BLACK);
//最大值
leftAxis.setAxisMinValue(100f);
//最小值
leftAxis.setAxisMinValue(0f);
// 不一定要从0开始
leftAxis.setStartAtZero(false);
//绘制网格线
leftAxis.setDrawGridLines(true);
//右侧y轴
YAxis rightAxis=lineChart.getAxisRight();
//不显示右侧y轴
rightAxis.setEnabled(false);
//x轴
XAxis xAxis=lineChart.getXAxis();
xAxis.setTextColor(Color.BLACK);
// 如果设置为true,则在绘制时会避免“剪掉”在x轴上的图表或屏幕边缘的第一个和最后一个坐标轴标签项。
xAxis.setAvoidFirstLastClipping(true);
// 几个x坐标轴之间才绘制?
// xAxis.setSpaceBetweenLabels(5);
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setEnabled(true);
// 图表左边的y坐标轴线
YAxis leftAxis=lineChart.getAxisLeft();
leftAxis.setTextColor(Color.BLACK);
//最大值
leftAxis.setAxisMinValue(100f);
//最小值
leftAxis.setAxisMinValue(0f);
// 不一定要从0开始
leftAxis.setStartAtZero(false);
//绘制网格线
leftAxis.setDrawGridLines(true);
//右侧y轴
YAxis rightAxis=lineChart.getAxisRight();
//不显示右侧y轴
rightAxis.setEnabled(false);
五、重写LinedataSet类
import android.graphics.Color;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineDataSet;
import java.util.List;
/**
* 根据数值显示圆圈
* Created by Lenovo on 2018/1/24.
*/
public class MyDataSet extends LineDataSet {
private int start; //最小值
private int end; //最大值
public MyDataSet(List yVals, String label, int start, int end) {
super(yVals, label);
this.start=start;
this.end=end;
}
@Override
public int getCircleColor(int index) {
//如果超出范围则返回红色
if (getEntryForXIndex(index).getVal()end){
return 0xFFff0000;
}else return super.getCircleColor(index);
}
}
六、创建LineDataSet
MyDataSet set=new MyDataSet(ylist,type+"数据",0,50);
set.setAxisDependency(YAxis.AxisDependency.LEFT);
//折线的颜色
set.setColor(ColorTemplate.getHoloBlue());
set.setCircleColor(Color.GREEN);
// set.setCircleColors(new int[]{Color.RED,Color.GREEN});
set.setCircleSize(3f);
set.setLineWidth(3f);
//内孔
set.setCircleColorHole(Color.GREEN);
set.setDrawCircleHole(true);
//高亮的线的颜色
set.setHighLightColor(Color.YELLOW);
set.setValueTextColor(Color.GREEN);
set.setValueTextSize(10f);
//启用/禁用 绘制所有 DataSets 数据对象包含的数据的值文本。
set.setDrawValues(true);
MyDataSet set=new MyDataSet(ylist,type+"数据",0,50);
set.setAxisDependency(YAxis.AxisDependency.LEFT);
//折线的颜色
set.setColor(ColorTemplate.getHoloBlue());
set.setCircleColor(Color.GREEN);
// set.setCircleColors(new int[]{Color.RED,Color.GREEN});
set.setCircleSize(3f);
set.setLineWidth(3f);
//内孔
set.setCircleColorHole(Color.GREEN);
set.setDrawCircleHole(true);
//高亮的线的颜色
set.setHighLightColor(Color.YELLOW);
set.setValueTextColor(Color.GREEN);
set.setValueTextSize(10f);
//启用/禁用 绘制所有 DataSets 数据对象包含的数据的值文本。
set.setDrawValues(true);
七、添加一个点
// 添加进去一个坐标点
public void addEntry(String xValue,float yValue){
LineData data=lineChart.getLineData();
// 每一个LineDataSet代表一条线,每张统计图表可以同时存在若干个统计折线,这些折线像数组一样从0开始下标。
// 本例只有一个,那么就是第0条折线
MyDataSet dataSet= (MyDataSet) data.getDataSetByIndex(0);
// 如果该统计折线图还没有数据集,则创建一条出来,如果有则跳过此处代码。
if (dataSet==null){
dataSet= (MyDataSet) createLineDataSet(null,"");
data.addDataSet(dataSet);
}
// 先添加一个x坐标轴的值
// 因为是从0开始,data.getXValCount()每次返回的总是全部x坐标轴上总数量,所以不必多此一举的加1
// data.addXValue(data.getXValCount()+"");
data.addXValue(xValue);
//如果异常则为红色
// set.getEntryCount()获得的是所有统计图表上的数据点总量,
// 如从0开始一样的数组下标,那么不必多次一举的加1
Entry entry=new Entry(yValue,dataSet.getEntryCount());
// 往linedata里面添加点。注意:addentry的第二个参数即代表折线的下标索引。
// 因为本例只有一个统计折线,那么就是第一个,其下标为0.
// 如果同一张统计图表中存在若干条统计折线,那么必须分清是针对哪一条(依据下标索引)统计折线添加。
data.addEntry(entry,0);
// 像ListView那样的通知数据更新
lineChart.notifyDataSetChanged();
// 当前统计图表中最多在x轴坐标线上显示的总量
lineChart.setVisibleXRangeMaximum(10);
// 将坐标移动到最新
// 此代码将刷新图表的绘图
lineChart.moveViewToX(data.getXValCount()-5);
}
以上是利用MPAndroidChart绘制动态折线图主要的几步。