MPAndroidChart中文翻译(七设置数据)

本章介绍了如何为各种图表设置数据。

折线图

如果要向图表添加值(数据),则必须通过:

public void setData(ChartData data) { ... }

基类ChartData类封装了在渲染期间图表所需的所有数据和信息。对于不同类型的图表,存在对应的ChartData子类(例如LineData)用于设置图表数据。在构造函数中,你可以提供一个List<? extends IDataSet>作为要显示的值。下面以LineData类(继承自ChartData)为示例,将数据添加到折线图:

/** List constructor */
 public LineData(List<ILineDataSet> sets) { ... } 
/** Constructor with one or multiple ILineDataSet objects */
 public LineData(ILineDataSet...) { ... }

那么,什么是DataSet,为什么你需要它?这实际上很简单。 一个DataSet对象表示图表中属于一起的一组条目(例如,Entry类)。 它用于在逻辑上分隔图表中不同的值组。不同类型的图表都有其对应的继承自DataSet的特定样式的子类对象(例如LineDataSet)。
例如,你可能希望在折线图中显示两个不同公司的一年的季度收入。在这种情况下,建议创建两个不同的LineDataSet对象,每个对象包含四个值(每个季度一个值)。也可以只提供一个LineDataSet对象,包含两个公司的所有8个值。
那么如何设置一个LineDataSet对象呢?

public LineDataSet(List<Entry> entries, String label) { ... }

当查看构造函数(不同的构造函数都可用)时,可以看到,LineDataSet需要一个Entry类型的List和一个用来描述LineDataSet的String和一个用于图例的标签。此外,此标签可用于在LineData对象中的其他LineDataSet对象中查找LineDataSet。
Entry类型的列表封装了图表的所有值。 Entry对象是图表中具有x值和y值的条目附加的包装器:

public Entry(float x, float y) { ... }

综合考虑(两家公司季度收入超过一年的例子):
首先,创建将保存你的值的Entry类型的列表:

List<Entry> valsComp1 = new ArrayList<Entry>();
 List<Entry> valsComp2 = new ArrayList<Entry>();

然后,使用Entry对象填充列表。 确保输入对象包含x轴的正确索引。(当然,这里可以使用循环,在这种情况下,循环的计数器变量可以是x轴上的索引)。

Entry c1e1 = new Entry(0f, 100000f); // 0 == quarter 1 
valsComp1.add(c1e1);
Entry c1e2 = new Entry(1f, 140000f); // 1 == quarter 2 ... 
valsComp1.add(c1e2);
// and so on ...
Entry c2e1 = new Entry(0f, 130000f); // 0 == quarter 1 
valsComp2.add(c2e1);
Entry c2e2 = new Entry(1f, 115000f); // 1 == quarter 2 ... 
valsComp2.add(c2e2);
//...

现在我们有了Entry对象的列表,可以创建LineDataSet对象:

LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1"); 
setComp1.setAxisDependency(AxisDependency.LEFT);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2"); 
setComp2.setAxisDependency(AxisDependency.LEFT);

通过调用Axis Dependency(...),指定DataSet应该绘制的轴。 最后,我们创建一个DataSet的列表并构建我们的ChartData对象:

// use the interface ILineDataSet
List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>(); 
dataSets.add(setComp1); 
dataSets.add(setComp2); 

LineData data = new LineData(dataSets);
mLineChart.setData(data);
mLineChart.invalidate(); // refresh

调用invalidate()后,图表将刷新并绘制提供的数据。
如果我们要向x轴添加更多描述性值(而不是为不同季度在0到3之间的数字),我们可以使用Axis Value Formatter接口来实现。此接口允许在X轴上绘制自定义样式的值。 在此示例中,格式化程序可能如下所示:

// the labels that should be drawn on the XAxis
final String[] quarters = new String[] { "Q1", "Q2", "Q3", "Q4" };
IAxisValueFormatter formatter = new IAxisValueFormatter() { 

    @Override 
    public String getFormattedValue(float value, AxisBase axis) { 
        return quarters[(int) value]; 
    } 
   // we don't draw numbers, so no decimal digits needed
   @Override 
    public int getDecimalDigits() { return 0; }
};

XAxis xAxis = mLineChart.getXAxis();
xAxis.setGranularity(1f); // minimum axis-step (interval) is 1
xAxis.setValueFormatter(formatter);

有关Axis Value Formatter接口的详细信息,请参见此处
如果应用了附加样式,则此示例生成的折线图应类似于下面的示例:


一般BarChart,ScatterChart,BubbleChart和CandleStickChart的设置数据类似于LineChart。 一个特殊的情况是BarChart有多个(分组)条,这将在下面解释。

条目的顺序

请注意,此库不正式支持未按条目的x位置升序方式绘制折线图数据。以未排序的方式添加条目可能会正确绘图,但也可能出现意外。可以手动或使用条目比较器对条目对象列表进行排序:

List<Entry> entries = ...;
Collections.sort(entries, new EntryXComparator());

这样做是因为使用二进制搜索算法可以更好地处理排序列表,性能更高。

饼图

与其他图表类型不同,饼图以PieEntry对象的形式获取数据。构造函数如下所示:

public PieEntry(float value, String label) { ... }

构造函数的第一个参数用于应该在饼图中绘制为饼形图的实际“值”。第二个参数“label”用于提供对切片的附加描述。
示例代码:

List<PieEntry> entries = new ArrayList<>();

entries.add(new PieEntry(18.5f, "Green"));
entries.add(new PieEntry(26.7f, "Yellow"));
entries.add(new PieEntry(24.0f, "Red"));
entries.add(new PieEntry(30.8f, "Blue"));

PieDataSet set = new PieDataSet(entries, "Election Results");
PieData data = new PieData(set);
pieChart.setData(data);
pieChart.invalidate(); // refresh

PieEntry对象不保存x位置的值,因为图表中显示的PayEntry对象的顺序由它们在条目列表中的顺序确定。图标如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 8,327评论 0 16
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,047评论 25 707
  • 记得年度计划就说要带儿子去趟上海迪斯尼,而这也是我去年就欠孩子的。趁着这个端午假期,我请了半天假去完成这个承诺,也...
    透明的橙阅读 174评论 1 1
  • 最近早上单位组织唱歌,自己负责调控音乐。有一天操作期间一个来自甘肃的电话打过来,一名操着普通话的男声说:“你好,是...
    傅青竹阅读 304评论 0 0