我使用AchartEngine创建了一个条形图。我喜欢为两个x网格之间的空间设置不同的颜色,如下图所示。以及如何删除每个轴标签中的“ - ”符号。(需要删除4小时内出现的“ - ”)。如果无法设置颜色,我只想显示4 y标签,顶部最高值。而且我喜欢自己修复两个标签之间的空间。我还需要为y标签添加hr或其他文本。下面的代码是我使用的。在某些设备中,值为0,显示细线。我不希望这样,如果值大于0,则只应存在bar。我就是这样的。我希望图表与问题末尾的图表类似。
int largest = y[0];
for (int i = 1; i < y.length; i++) {
if (y[i] > largest) {
largest = y[i];
}
}
CategorySeries series = new CategorySeries("");
for (int i = 0; i < y.length; i++) {
series.add("Bar" + (i + 1), y[i]);
}
XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset();
dataSet.addSeries(series.toXYSeries()); // number of series
// customization of the chart
XYSeriesRenderer renderer = new XYSeriesRenderer(); // one renderer for
// one series
renderer.setColor(Color.RED);
renderer.setDisplayChartValues(false);
renderer.setChartValuesSpacing((float) 5.5d);
renderer.setLineWidth((float) 1.5d);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
// mRenderer.setChartTitle("Demo Graph");
// mRenderer.setXTitle("xValues");
mRenderer.setYTitle("minutes");
mRenderer.setLabelsColor(getResources().getColor(R.color.txt_blue));
mRenderer.setShowGridX(false); // this will show the grid in graph
mRenderer.setShowGridY(false);
// mRenderer.setAntialiasing(true);
mRenderer.setBarSpacing(.5); // adding spacing between the line or
// stacks
// mRenderer.setApplyBackgroundColor(true);
// mRenderer.setBackgroundColor(Color.BLACK);
mRenderer.setXAxisMin(0);
mRenderer.setYAxisMin(0);
mRenderer.setXAxisMax(7);
mRenderer.setZoomInLimitY(10);
if (largest < 6) {
mRenderer.setYAxisMax(6);
} else {
mRenderer.setYAxisMax(largest);
}
mRenderer.setScale(4);
mRenderer.setXLabels(0);
mRenderer.addXTextLabel(1, "Sun");
mRenderer.addXTextLabel(2, "Mon");
mRenderer.addXTextLabel(3, "Tue");
mRenderer.addXTextLabel(4, "Wed");
mRenderer.addXTextLabel(5, "Thu");
mRenderer.addXTextLabel(6, "Fri");
mRenderer.addXTextLabel(7, "Sat");
// mRenderer.setYLabels(0);
//
// mRenderer.addYTextLabel(2, "2 min");
//
// mRenderer.addYTextLabel(4, "4 min");
//
// mRenderer.addYTextLabel(6, "6 min");
// mRenderer.addYTextLabel(7, "Sat");
mRenderer.setXLabelsColor(getResources().getColor(R.color.txt_blue));
mRenderer.setYLabelsColor(0, getResources().getColor(R.color.txt_blue));
mRenderer.setLabelsColor(getResources().getColor(R.color.txt_blue));
// mRenderer.setYLabelsAlign(Align.RIGHT);
mRenderer.setYLabelsPadding(20);
mRenderer.setPanEnabled(false, false);
mRenderer.setZoomEnabled(false, false);
mRenderer.setPanEnabled(false, false); // will fix the chart position
// Intent intent = ChartFactory.getBarChartIntent(context, dataSet,
// mRenderer,Type.DEFAULT);
mRenderer.setBarSpacing(1);
// mRenderer.setYLabelsPadding(5);
mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
mRenderer.setShowAxes(false);
// mRenderer.setXAxisMin(-0.5);
// 1080 x 1920
if (screen_width == 480 && screen_height == 800) {
mRenderer.setAxisTitleTextSize(15);
mRenderer.setLabelsTextSize(15);
} else if (screen_width > 480 && screen_width < 1000
&& screen_height > 800 && screen_height < 1700) {
mRenderer.setAxisTitleTextSize(20);
mRenderer.setLabelsTextSize(20);
}
else if (screen_width > 1000 && screen_height > 1700) {
mRenderer.setAxisTitleTextSize(30);
mRenderer.setLabelsTextSize(30);
} else if (screen_width < 480 && screen_height < 800) {
mRenderer.setAxisTitleTextSize(10);
mRenderer.setLabelsTextSize(10);
}
mRenderer.setShowLegend(false);
mChart = (GraphicalView) ChartFactory.getBarChartView(getBaseContext(),
dataSet, mRenderer, Type.DEFAULT);
// Adding the Line Chart to the LinearLayout
chartContainer.addView(mChart);
答案 0 :(得分:3)
两件事:
我得到这种背景的方法是在x轴上添加一个堆积的条形系列,在y轴上添加尽可能多的值。然后先渲染这个堆叠的条形图,让真正的条形图呈现在它上面。另一方面,将背景颜色设置为透明并且在图表后面绘制背景是很困难的。我试过了,但我没有找到一种方法将背景与图表中的值同步(基本上我放弃了这个并且成功地使用了'背景系列')。
消除破折号:我的想法是,将破折号设置为透明色。但是AChartEngine的颜色取决于标签的颜色,而不是 - 正如人们所预料的那样 - 取决于轴的颜色。因此,如果不重写渲染器的部分,则在此版本(目前为1.1)中不可能消除值上的破折号。
编辑:第一点的例子。
这是一些为自己生成背景的简短代码。
public Intent execute(Context context) {
// The demo source counts series by number of titles here
String[] titles = new String[] { "The Background", "", "" };
// "stacked" values. The highest first. It's printed first.
List<double[]> values = new ArrayList<double[]>();
values.add(new double[] { 6d, 6d, 6d, 6d, 6d, 6d, 6d });
values.add(new double[] { 4d, 4d, 4d, 4d, 4d, 4d, 4d });
values.add(new double[] { 2d, 2d, 2d, 2d, 2d, 2d, 2d });
// Background colors. Here blue and white to actually differentiate it
int[] colors = new int[] { Color.BLUE, Color.WHITE, Color.BLUE};
// Some settings for the renderer. Change as necessary
XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
setChartSettings(
renderer, "", "", "", 1d, 7d, 0d, 6d,
Color.TRANSPARENT, Color.TRANSPARENT);
renderer.setXLabels(0);
renderer.setYLabels(0);
renderer.setPanEnabled(false, false);
renderer.setZoomEnabled(false);
renderer.setBarSpacing(0d);
renderer.setShowLegend(false);
// done. start activity with given intent
return ChartFactory.getBarChartIntent(
context, buildBarDataset(titles, values), renderer, Type.STACKED);
}
我已经使用了演示源来尽可能缩短代码。我使用的方法是buildBarRenderer
,buildBarDataset
和setChartSettings
。您可以在AbstractDemoChart
课程中找到它们。
最小值和最大值硬编码为1-7(工作日),y值为0-6。此外,设置只是远离所有装饰。在您的情况下,您可以按照示例中的说明进行设置。
由于aChartEngine没有叠加条形图的真实概念 - 它只是将条形图拉到彼此之后,因此具有最高值的条形图在其他条形图上方显示 - 您只需要在最后添加您的值值列表作为新系列。