我想绘制一个包含五个单独栏的条形图 - 我使用了Achartengine。 我能够以相同的颜色显示所有五个条形,但我想区分一个不同颜色的条形,但我不能显示多种颜色。请告诉我如何显示不同的颜色。 我的代码......
values.add(new double[] {21,56,33,10,20});
int[] colors = new int[] { Color.rgb(227, 121, 15) };
XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
setChartSettings(renderer, "", "", "", 0,5, 0,100, Color.WHITE, Color.WHITE);
renderer.setXLabels(8);
renderer.setYLabels(10);
renderer.setDisplayChartValues(true);
mChartView= ChartFactory.getBarChartView(context, buildBarDataset(titles, values), renderer,
Type.DEFAULT);
layout.addView(mChartView, 350, 500);
答案 0 :(得分:6)
可以通过扩展SimpleSeriesRenderer和BarChart类来实现。这是我对RangeBarChart的解决方案(所有感谢gilenodm,希望我有一些声誉来支持你的答案):
import org.achartengine.renderer.SimpleSeriesRenderer;
public class AdvancedSeriesRenderer extends SimpleSeriesRenderer
{
private int [] colors;
public void AdvancedSeriesRenderer ()
{
}
public int getColor ( int position )
{
return colors[position];
}
}
import org.achartengine.chart.RangeBarChart;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.SimpleSeriesRenderer;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
public class AdvancedRangeBarChart extends RangeBarChart
{
private int [] barChartColors;
public AdvancedRangeBarChart ( XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, Type type )
{
super ( dataset, renderer, type );
}
public void setColors ( int [] colorsIn )
{
barChartColors = colorsIn;
}
@Override
public void drawSeries ( Canvas canvas, Paint paint, float [] points, SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex )
{
int seriesNr = mDataset.getSeriesCount ();
int length = points.length;
paint.setStyle ( Style.FILL );
float halfDiffX = getHalfDiffX ( points, length, seriesNr );
int start = 0;
if ( startIndex > 0 )
{
start = 2;
}
for ( int i = start; i < length; i += 4 )
{
int colorIndex = (int) ( i / 4 ) % barChartColors.length;
paint.setColor ( barChartColors[colorIndex] );
if ( points.length > i + 3 )
{
float xMin = points[i];
float yMin = points[i + 1];
// xMin = xMax
float xMax = points[i + 2];
float yMax = points[i + 3];
drawBar ( canvas, xMin, yMin, xMax, yMax, halfDiffX, seriesNr, seriesIndex, paint );
}
}
}
}
答案 1 :(得分:5)
我做了一个黑客来达到这个效果。
Org.achartengine.SimpleSeriesRenderer
更改了该类,我添加了int[] colors
和boolean multipleColorsEnabled
及其getter和setter。
所以,我在类中更改了org.achartengine.BarChart
方法drawSeries,其中设置了循环中每个条的颜色,如下所示:
int j = startIndex;
for (int i = 0; i < length; i += 2) {
if (seriesRenderer.isMultipleColorsEnabled()) {
paint.setColor(seriesRenderer.getColors()[j++]);
} else {
paint.setColor(seriesRenderer.getColor());
}
float x = points[i];
float y = points[i + 1];
drawBar(canvas, x, yAxisValue, x, y, halfDiffX, seriesNr,
seriesIndex, paint);
}
在加载所用数据的类中:
seriesRenderer.setMultipleColorsEnabled(true);
seriesRenderer.setColors(myColors);
答案 2 :(得分:2)
我使用achartengine已经有一段时间了,但我认为每个系列都必须有自己的颜色。作为一种解决方法,您可以创建要区分其自己的系列成员的栏,并为该系列设置不同的颜色。也许其他人有更好的方法。
答案 3 :(得分:0)
您必须在 buildBarRenderer()调用中使用不同的 SimpleSeriesRenderer ,并使用这种方式定义尽可能多的系列颜色(替换前两行代码):
values.add(new double[] {21});
values.add(new double[] {56});
values.add(new double[] {33});
//ETC.
int[] colors = new int[] { Color.rgb(227, 121, 15),
Color.rgb(227, 121, 227),
Color.rgb(127, 121, 127) };
其余代码应与您的相同,但我没有测试过。 AFAIK 你需要不同的系列,因为每个系列只能有一种颜色。