Android统计图表MPAndroidChart:动态添加数据更新【6】
Android MPAndroidChart的LineDataSet代表一条统计图表中统计折线,一张统计图表可以同时存在若干条统计折线,其在内存中存储的模型类型数组,从0开始下标。
动态的往MPAndroidChart添加数据,就是增加往LineData里面增加Entry。
写一个例子加以说明。
先写一个LineChart布局,顶部的Button每点一次增加一个数据点:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="zhangphil.chart.MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="动态添加数据" />
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Java代码:
package zhangphil.chart;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.XAxis.XAxisPosition;
import com.github.mikephil.charting.components.YAxis.AxisDependency;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.components.Legend.LegendForm;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.utils.ColorTemplate;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private LineChart mChart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mChart = (LineChart) findViewById(R.id.chart);
mChart.setDescription("Zhang Phil @ http://blog.csdn.net/zhangphil");
mChart.setNoDataTextDescription("暂时尚无数据");
mChart.setTouchEnabled(true);
// 可拖曳
mChart.setDragEnabled(true);
// 可缩放
mChart.setScaleEnabled(true);
mChart.setDrawGridBackground(false);
mChart.setPinchZoom(true);
// 设置图表的背景颜色
mChart.setBackgroundColor(Color.LTGRAY);
LineData data = new LineData();
// 数据显示的颜色
data.setValueTextColor(Color.WHITE);
// 先增加一个空的数据,随后往里面动态添加
mChart.setData(data);
// 图表的注解(只有当数据集存在时候才生效)
Legend l = mChart.getLegend();
// 可以修改图表注解部分的位置
// l.setPosition(LegendPosition.LEFT_OF_CHART);
// 线性,也可是圆
l.setForm(LegendForm.LINE);
// 颜色
l.setTextColor(Color.WHITE);
// x坐标轴
XAxis xl = mChart.getXAxis();
xl.setTextColor(Color.WHITE);
xl.setDrawGridLines(false);
xl.setAvoidFirstLastClipping(true);
// 几个x坐标轴之间才绘制?
xl.setSpaceBetweenLabels(5);
// 如果false,那么x坐标轴将不可见
xl.setEnabled(true);
// 将X坐标轴放置在底部,默认是在顶部。
xl.setPosition(XAxisPosition.BOTTOM);
// 图表左边的y坐标轴线
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setTextColor(Color.WHITE);
// 最大值
leftAxis.setAxisMaxValue(90f);
// 最小值
leftAxis.setAxisMinValue(40f);
// 不一定要从0开始
leftAxis.setStartAtZero(false);
leftAxis.setDrawGridLines(true);
YAxis rightAxis = mChart.getAxisRight();
// 不显示图表的右边y坐标轴线
rightAxis.setEnabled(false);
// 每点击一次按钮,增加一个点
Button addButton = (Button) findViewById(R.id.button);
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addEntry();
}
});
}
// 添加进去一个坐标点
private void addEntry() {
LineData data = mChart.getData();
// 每一个LineDataSet代表一条线,每张统计图表可以同时存在若干个统计折线,这些折线像数组一样从0开始下标。
// 本例只有一个,那么就是第0条折线
LineDataSet set = data.getDataSetByIndex(0);
// 如果该统计折线图还没有数据集,则创建一条出来,如果有则跳过此处代码。
if (set == null) {
set = createLineDataSet();
data.addDataSet(set);
}
// 先添加一个x坐标轴的值
// 因为是从0开始,data.getXValCount()每次返回的总是全部x坐标轴上总数量,所以不必多此一举的加1
data.addXValue((data.getXValCount()) + "");
// 生成随机测试数
float f = (float) ((Math.random()) * 20 + 50);
// set.getEntryCount()获得的是所有统计图表上的数据点总量,
// 如从0开始一样的数组下标,那么不必多次一举的加1
Entry entry = new Entry(f, set.getEntryCount());
// 往linedata里面添加点。注意:addentry的第二个参数即代表折线的下标索引。
// 因为本例只有一个统计折线,那么就是第一个,其下标为0.
// 如果同一张统计图表中存在若干条统计折线,那么必须分清是针对哪一条(依据下标索引)统计折线添加。
data.addEntry(entry, 0);
// 像ListView那样的通知数据更新
mChart.notifyDataSetChanged();
// 当前统计图表中最多在x轴坐标线上显示的总量
mChart.setVisibleXRangeMaximum(5);
// y坐标轴线最大值
// mChart.setVisibleYRange(30, AxisDependency.LEFT);
// 将坐标移动到最新
// 此代码将刷新图表的绘图
mChart.moveViewToX(data.getXValCount() - 5);
// mChart.moveViewTo(data.getXValCount()-7, 55f,
// AxisDependency.LEFT);
}
// 初始化数据集,添加一条统计折线,可以简单的理解是初始化y坐标轴线上点的表征
private LineDataSet createLineDataSet() {
LineDataSet set = new LineDataSet(null, "动态添加的数据");
set.setAxisDependency(AxisDependency.LEFT);
// 折线的颜色
set.setColor(ColorTemplate.getHoloBlue());
set.setCircleColor(Color.WHITE);
set.setLineWidth(10f);
set.setCircleSize(5f);
set.setFillAlpha(128);
set.setFillColor(ColorTemplate.getHoloBlue());
set.setHighLightColor(Color.GREEN);
set.setValueTextColor(Color.WHITE);
set.setValueTextSize(10f);
set.setDrawValues(true);
return set;
}
}
运行结果:
相关文章:
【1】《Android统计图表MPAndroidChart》链接地址:http://blog.csdn.net/zhangphil/article/details/47656521
【2】《基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能》链接地址:http://blog.csdn.net/zhangphil/article/details/47685515
【3】《Android实现天气预报温度/气温折线趋势图》链接地址:http://blog.csdn.net/zhangphil/article/details/47702245
【4】《Android统计图表之柱状图(条形图)》链接地址:http://blog.csdn.net/zhangphil/article/details/47727913
【5】《Android MPAndroidChart之PieChart和数据结构以及模型【5】》链接地址:http://blog.csdn.net/zhangphil/article/details/50172817
【6】MPAndroidChart在github上的项目主页:https://github.com/PhilJay/MPAndroidChart