本章介紹了如何為各種圖表設(shè)置數(shù)據(jù)弱判。
折線圖
如果要向圖表添加值(數(shù)據(jù))襟沮,則必須通過(guò):
public void setData(ChartData data) { ... }
基類ChartData類封裝了在渲染期間圖表所需的所有數(shù)據(jù)和信息。對(duì)于不同類型的圖表昌腰,存在對(duì)應(yīng)的ChartData子類(例如LineData)用于設(shè)置圖表數(shù)據(jù)开伏。在構(gòu)造函數(shù)中,你可以提供一個(gè)List<? extends IDataSet>作為要顯示的值遭商。下面以LineData類(繼承自ChartData)為示例固灵,將數(shù)據(jù)添加到折線圖:
/** List constructor */
public LineData(List<ILineDataSet> sets) { ... }
/** Constructor with one or multiple ILineDataSet objects */
public LineData(ILineDataSet...) { ... }
那么,什么是DataSet劫流,為什么你需要它巫玻?這實(shí)際上很簡(jiǎn)單丛忆。 一個(gè)DataSet對(duì)象表示圖表中屬于一起的一組條目(例如,Entry類)。 它用于在邏輯上分隔圖表中不同的值組鲫凶。不同類型的圖表都有其對(duì)應(yīng)的繼承自DataSet的特定樣式的子類對(duì)象(例如LineDataSet)峦椰。
例如,你可能希望在折線圖中顯示兩個(gè)不同公司的一年的季度收入粮彤。在這種情況下,建議創(chuàng)建兩個(gè)不同的LineDataSet對(duì)象姜骡,每個(gè)對(duì)象包含四個(gè)值(每個(gè)季度一個(gè)值)导坟。也可以只提供一個(gè)LineDataSet對(duì)象,包含兩個(gè)公司的所有8個(gè)值圈澈。
那么如何設(shè)置一個(gè)LineDataSet對(duì)象呢惫周?
public LineDataSet(List<Entry> entries, String label) { ... }
當(dāng)查看構(gòu)造函數(shù)(不同的構(gòu)造函數(shù)都可用)時(shí),可以看到康栈,LineDataSet需要一個(gè)Entry類型的List和一個(gè)用來(lái)描述LineDataSet的String和一個(gè)用于圖例的標(biāo)簽递递。此外,此標(biāo)簽可用于在LineData對(duì)象中的其他LineDataSet對(duì)象中查找LineDataSet啥么。
Entry類型的列表封裝了圖表的所有值登舞。 Entry對(duì)象是圖表中具有x值和y值的條目附加的包裝器:
public Entry(float x, float y) { ... }
綜合考慮(兩家公司季度收入超過(guò)一年的例子):
首先,創(chuàng)建將保存你的值的Entry類型的列表:
List<Entry> valsComp1 = new ArrayList<Entry>();
List<Entry> valsComp2 = new ArrayList<Entry>();
然后悬荣,使用Entry對(duì)象填充列表菠秒。 確保輸入對(duì)象包含x軸的正確索引。(當(dāng)然氯迂,這里可以使用循環(huán)践叠,在這種情況下,循環(huán)的計(jì)數(shù)器變量可以是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);
//...
現(xiàn)在我們有了Entry對(duì)象的列表禁灼,可以創(chuàng)建LineDataSet對(duì)象:
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
setComp1.setAxisDependency(AxisDependency.LEFT);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setAxisDependency(AxisDependency.LEFT);
通過(guò)調(diào)用Axis Dependency(...),指定DataSet應(yīng)該繪制的軸驰坊。 最后匾二,我們創(chuàng)建一個(gè)DataSet的列表并構(gòu)建我們的ChartData對(duì)象:
// 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
調(diào)用invalidate()后,圖表將刷新并繪制提供的數(shù)據(jù)拳芙。
如果我們要向x軸添加更多描述性值(而不是為不同季度在0到3之間的數(shù)字)察藐,我們可以使用Axis Value Formatter接口來(lái)實(shí)現(xiàn)。此接口允許在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);
有關(guān)Axis Value Formatter接口的詳細(xì)信息,請(qǐng)參見(jiàn)此處睹限。
如果應(yīng)用了附加樣式譬猫,則此示例生成的折線圖應(yīng)類似于下面的示例:
一般BarChart讯檐,ScatterChart,BubbleChart和CandleStickChart的設(shè)置數(shù)據(jù)類似于LineChart染服。 一個(gè)特殊的情況是BarChart有多個(gè)(分組)條别洪,這將在下面解釋。
條目的順序
請(qǐng)注意柳刮,此庫(kù)不正式支持未按條目的x位置升序方式繪制折線圖數(shù)據(jù)挖垛。以未排序的方式添加條目可能會(huì)正確繪圖,但也可能出現(xiàn)意外秉颗×《荆可以手動(dòng)或使用條目比較器對(duì)條目對(duì)象列表進(jìn)行排序:
List<Entry> entries = ...;
Collections.sort(entries, new EntryXComparator());
這樣做是因?yàn)槭褂枚M(jìn)制搜索算法可以更好地處理排序列表,性能更高蚕甥。
餅圖
與其他圖表類型不同哪替,餅圖以PieEntry對(duì)象的形式獲取數(shù)據(jù)。構(gòu)造函數(shù)如下所示:
public PieEntry(float value, String label) { ... }
構(gòu)造函數(shù)的第一個(gè)參數(shù)用于應(yīng)該在餅圖中繪制為餅形圖的實(shí)際“值”菇怀。第二個(gè)參數(shù)“l(fā)abel”用于提供對(duì)切片的附加描述凭舶。
示例代碼:
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對(duì)象不保存x位置的值,因?yàn)閳D表中顯示的PayEntry對(duì)象的順序由它們?cè)跅l目列表中的順序確定爱沟。圖標(biāo)如下: