我正在使用MPAndroidChart进行制图。我正在构建一个包含多个数据集对象的折线图。
从MPAndroidChart提供的示例中我可以观察到,可以在同一折线图中绘制多个数据集对象,但是具有相同数量的点(y值)和那些以相同x值引用的y值。如果我想在同一折线图中绘制多个数据集对象,并且每个参考不同的x值的不同点数(y值),会发生什么?我怎么能摆脱这个?我无法做到。
例如:
Dataset object 1 Y-values: 0, 12, 23, 34, 50, 100, 130
X-values: 0, 10, 15, 20, 25, 30, 35
Dataset object 2 Y-values: 1, 5, 10, 15, 20, 30, 40, 70, 75, 80
X-values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
答案 0 :(得分:3)
解决方案很简单。
创建一个范围从0到36的x值数组:
ArrayList<String> xvals = new ArrayList<String>();
for(int i = 0; i <= 35; i++) {
xvals.add("Label"+i);
}
// create your entries...
// add the data...
通过这种方式,您可以显示x-indices范围为0到35的条目。 确保为要显示的每个条目设置正确的x-index。
答案 1 :(得分:2)
创建 0到36 {min - max},而不是创建Xvalues1
&amp;的联盟。 Xvalues2
与Yvalue
个&{ 反之亦然。
int[] Xvalues1 = { 0, 10, 15, 20, 25, 30, 35 };
int[] Yvalues1 = { 5, 112, 23, 34, 50, 100, 130 };
int[] Xvalues2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 10 };
int[] Yvalues2 = { 1, 5, 20, 15, 10, 30, 40, 70, 75, 100 };
// X = X1 ⋃ X2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 35]
// Y1 ⋃ Y2 (w.r.t X) = [5, null, null, null, null, null, null, null, null, 112, 23, 34, 50, 100, 130]
对Y1,Y2,Y3 ......,
绘制 X据我所知 MPAndroidChart 没有绘制
null
值&amp;安全地跳到下一个值。
public void startMerging() throws ArrayIndexOutOfBoundsException {
List<Integer> x1 = new ArrayList<Integer>();
List<Integer> y1 = new ArrayList<Integer>();
List<Integer> x2 = new ArrayList<Integer>();
List<Integer> y2 = new ArrayList<Integer>();
List<XYMerger> mergedData = getMergedData(Xvalues1, Yvalues1, Xvalues2);
for (XYMerger xy : mergedData) {
x1.add(xy.getX());
y1.add(xy.getY());
}
mergedData = getMergedData(Xvalues2, Yvalues2, Xvalues1);
for (XYMerger xy : mergedData) {
x2.add(xy.getX());
y2.add(xy.getY());
}
mergedData.clear();
System.out.println(x1); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 35]
System.out.println(y1); // [5, null, null, null, null, null, null, null, null, 112, 23, 34, 50, 100, 130]
System.out.println("\n");
System.out.println(x2); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 35] // X = X1 = X2
System.out.println(y2); // [1, 5, 20, 15, 10, 30, 40, 70, 75, 100, null, null, null, null, null]
}
/**
* @param orgXvals : Original X Values
* @param orgYvals : Original Y Values
* @param extdXvals : Extended X values to be merged
* @return Sorted mergedData
*/
private List<XYMerger> getMergedData(int[] orgXvals , int[] orgYvals , int[] extdXvals) {
HashSet<Integer> tempSet = new HashSet<Integer>();
List<XYMerger> tempMerger = new ArrayList<XYMerger>();
tempSet.clear();
tempMerger.clear();
for (int i = 0; i < orgXvals.length; i++) {
tempSet.add(orgXvals[i]);
XYMerger xy = new XYMerger();
xy.setX(orgXvals[i]);
xy.setY(orgYvals[i]);
tempMerger.add(xy);
}
for (int i = 0; i < extdXvals.length; i++) {
if (tempSet.add(extdXvals[i])) {
XYMerger xy = new XYMerger();
xy.setX(extdXvals[i]);
xy.setY(null);
tempMerger.add(xy);
}
}
Collections.sort(tempMerger, new IntegerComparator(true));
return tempMerger;
}
<强> XYMerger 强>
public class XYMerger {
int x;
Integer y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public Integer getY() {
return y;
}
public void setY(Integer y) {
this.y = y;
}
}
<强> IntegerComparator 强>
public class IntegerComparator implements java.util.Comparator<XYMerger> {
boolean ascending;
public IntegerComparator(boolean isAscending) {
this.ascending = isAscending;
}
@Override
public int compare(XYMerger obj1 , XYMerger obj2) {
if (ascending) {
return (obj1.getX() < obj2.getX() ? -1 : (obj1.getX() == obj2.getX() ? 0 : 1));
}
return (obj1.getX() > obj2.getX() ? -1 : (obj1.getX() == obj2.getX() ? 0 : 1));
}
}