我正在使用MPAndroid图表绘制条形图。现在所有的条都是相同颜色的,但我想根据Y轴值为条形设置不同的颜色,比如如果值>100,颜色=红色,就像下面的图片一样。这可能吗?请有人帮忙。
谢谢。
我正在使用MPAndroid图表绘制条形图。现在所有的条都是相同颜色的,但我想根据Y轴值为条形设置不同的颜色,比如如果值>100,颜色=红色,就像下面的图片一样。这可能吗?请有人帮忙。
谢谢。
public class MyBarDataSet extends BarDataSet {
public MyBarDataSet(List<BarEntry> yVals, String label) {
super(yVals, label);
}
@Override
public int getColor(int index) {
if(getEntryForXIndex(index).getVal() < 95) // less than 95 green
return mColors.get(0);
else if(getEntryForXIndex(index).getVal() < 100) // less than 100 orange
return mColors.get(1);
else // greater or equal than 100 red
return mColors.get(2);
}
}
你需要像这样定义你的颜色:
MyBarDataSet set = new MyBarDataSet(yVals, "");
set.setColors(new int[]{ContextCompat.getColor(context, R.color.green),
ContextCompat.getColor(context, R.color.orange),
ContextCompat.getColor(context, R.color.red)});
ArrayList<BarDataSet> dataSets = new ArrayList<>();
dataSets.add(set);
BarData data = new BarData(xVals, dataSets);
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
// sets colors for the dataset, resolution of the resource name to a "real" color is done internally
setComp1.setColors(new int[] { R.color.red1, R.color.red2, R.color.red3, R.color.red4 }, Context);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setColors(new int[] { R.color.green1, R.color.green2, R.color.green3, R.color.green4 }, Context);
向@m4n3k4s所提供的答案点赞。只是想进一步澄清这些行,因为我花了一段时间才明白:
set.setColors(new int[]{ContextCompat.getColor(context, R.color.green),
ContextCompat.getColor(context, R.color.orange),
ContextCompat.getColor(context, R.color.red)});
在我找到这个帖子之前,我不知道什么是context
或如何使用它。 我将上面的行替换为:
barDataSet.setColors(
ContextCompat.getColor(barchart.getContext(), R.color.green),
ContextCompat.getColor(barchart.getContext(), R.color.yellow),
ContextCompat.getColor(barchart.getContext(), R.color.red)
);
BarChart
是View
的一个子类,而getContext()
是View
类的一个方法。因此,我的完整代码看起来像这样,其中KpBarDataSet是我自定义的类,它覆盖了BarDataSet,并且DateKp是一个自定义类。BarChart barchart = (BarChart) findViewById(R.id.barchart);
List<BarEntry> entries = new ArrayList<BarEntry>();
List<String> dateLabels = new ArrayList<>();
int i = 0;
for (DateKp day : data) {
// turn your data into Entry objects
entries.add(new BarEntry(i, day.getValueY()));
dateLabels.add(day.getLabel());
i++;
}
KpBarDataSet barDataSet = new KpBarDataSet(entries, null);
barDataSet.setColors(
ContextCompat.getColor(barchart.getContext(), R.color.green),
ContextCompat.getColor(barchart.getContext(), R.color.yellow),
ContextCompat.getColor(barchart.getContext(), R.color.red)
);
R.color.green
、R.color.red
等在/res/values/colors.xml中定义之前是不存在的。if(floatArray.get(i) >= 0.0 && floatArray.get(i) <= max1)
{
barColorArray1[i] = Color.rgb(0, 128, 0);
}
else if(floatArray.get(i) > max1 && floatArray.get(i) <= max2)
{
barColorArray1[i] = Color.rgb(247, 207, 19);
}
else if(floatArray.get(i) > max2 )
{
barColorArray1[i] = Color.rgb(199, 0, 15);
}
我已创建一个包含颜色整数值的数组。最后将其作为BarDataSet
传递给barDataSet1.setColors(barColorArray1);
class MyBarDataSet extends BarDataSet {
public MyBarDataSet(List<BarEntry> yVals, String label) {
super(yVals, label);
}
@Override
public int getColor(int index) {
if(getEntryForIndex(index).getY() < 140)
return mColors.get(0);
else if(getEntryForIndex(index).getY() > 145)
return mColors.get(1);
else
return mColors.get(2);
}
}
更新
来自m4n3k4的答案
public class MyBarDataSet extends BarDataSet {
public MyBarDataSet(List<BarEntry> yVals, String label) {
super(yVals, label);
}
@Override
public int getColor(int index) {
if(getEntryForIndex(index).getY() ==40) // less than 95 green
return mColors.get(0);
else if(getEntryForIndex(index).getY() ==30) // less than 100 orange
return mColors.get(1);
else // greater or equal than 100 red
return mColors.get(2);
}
}
并且在Java代码中
set1.setColors(ContextCompat.getColor(StepCountsActivity.this, R.color.purple),
ContextCompat.getColor(StepCountsActivity.this, R.color.light_purple),
ContextCompat.getColor(StepCountsActivity.this, R.color.blue));
}