I am using achartengine 1.0.1 (latest) and want to demonstrate a bar chart.
This is what I want:
My Desired Graph
What I achieved so far
1:1 view:
Zoom-out View:
Problems:
the left and right portion of graph are lost in 1:1 view.
The distance between Bar is so much high. I need to reduce it.
The Bar is not appropriately above the text label.
The text label color is white. I tried setLabelColor() but not working.
The text-size above bar is small.
XAxis Text "AC", "WA" etc are overlapping with 1, 2, 3. I want to remove 1, 2, 3 and only show "AC", "WA" etc.
Do you know how to fix these problems? I need a graph approximately like my desired graph. Thanks in advance.
Edit:
This is my trying code:
public GraphicalView getView(Context context)
{
// Bar 1
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
XYSeries ac = new XYSeries("AC");
XYSeries pe = new XYSeries("PE");
XYSeries wa = new XYSeries("WA");
XYSeries tl = new XYSeries("TL");
XYSeries ml = new XYSeries("ML");
XYSeries ce = new XYSeries("CE");
XYSeries re = new XYSeries("RE");
XYSeries ot = new XYSeries("OT");
ac.add(1, 291);
pe.add(2, 11);
wa.add(3, 204);
tl.add(4, 28);
ml.add(5, 0);
ce.add(6, 21);
re.add(7, 51);
ot.add(8, 4);
dataset.addSeries(ac);
dataset.addSeries(pe);
dataset.addSeries(wa);
dataset.addSeries(tl);
dataset.addSeries(ml);
dataset.addSeries(ce);
dataset.addSeries(re);
dataset.addSeries(ot);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.setChartTitle("Submission Statistics");
mRenderer.setXTitle("Verdict Code");
mRenderer.setYTitle("No. of Submissions");
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setLabelsColor(Color.BLACK);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.WHITE);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setZoomEnabled(true);
mRenderer.setZoomButtonsVisible(true);
mRenderer.setBarSpacing(-0.5);
// mRenderer.setMargins(new int[] {20, 30, 15, 0});
mRenderer.setAxisTitleTextSize(16);
mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(15);
mRenderer.setLegendTextSize(15);
mRenderer.addXTextLabel(1, "AC");
mRenderer.addXTextLabel(2, "PE");
mRenderer.addXTextLabel(3, "WA");
mRenderer.addXTextLabel(4, "TL");
mRenderer.addXTextLabel(5, "ML");
mRenderer.addXTextLabel(6, "CE");
mRenderer.addXTextLabel(7, "RE");
mRenderer.addXTextLabel(8, "OT");
mRenderer.setBarWidth(50);
// mRenderer.setXAxisMax(9);
mRenderer.setXAxisMin(0);
mRenderer.setYAxisMin(0);
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.parseColor("#00AA00"));
renderer.setDisplayChartValues(true);
XYSeriesRenderer renderer2 = new XYSeriesRenderer();
renderer2.setColor(Color.parseColor("#666600"));
renderer2.setDisplayChartValues(true);
XYSeriesRenderer renderer3 = new XYSeriesRenderer();
renderer3.setColor(Color.parseColor("#FF0000"));
renderer3.setDisplayChartValues(true);
XYSeriesRenderer renderer4 = new XYSeriesRenderer();
renderer4.setColor(Color.parseColor("#0000FF"));
renderer4.setDisplayChartValues(true);
XYSeriesRenderer renderer5 = new XYSeriesRenderer();
renderer5.setColor(Color.parseColor("#6767D0"));
renderer5.setDisplayChartValues(true);
XYSeriesRenderer renderer6 = new XYSeriesRenderer();
renderer6.setColor(Color.parseColor("#AAAA00"));
renderer6.setDisplayChartValues(true);
XYSeriesRenderer renderer7 = new XYSeriesRenderer();
renderer7.setColor(Color.parseColor("#00AAAA"));
renderer7.setDisplayChartValues(true);
XYSeriesRenderer renderer8 = new XYSeriesRenderer();
renderer8.setColor(Color.parseColor("#000000"));
renderer8.setDisplayChartValues(true);
mRenderer.addSeriesRenderer(renderer);
mRenderer.addSeriesRenderer(renderer2);
mRenderer.addSeriesRenderer(renderer3);
mRenderer.addSeriesRenderer(renderer4);
mRenderer.addSeriesRenderer(renderer5);
mRenderer.addSeriesRenderer(renderer6);
mRenderer.addSeriesRenderer(renderer7);
mRenderer.addSeriesRenderer(renderer8);
return ChartFactory.getBarChartView(context, dataset,mRenderer, Type.DEFAULT);
}
Edit (After applying Dan's suggestion)
My new code:
.........
mRenderer.setChartTitle("Submission Statistics");
mRenderer.setXTitle("Verdict Code");
mRenderer.setYTitle("No. of Submissions");
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.WHITE);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setZoomEnabled(true);
mRenderer.setBarSpacing(-0.5);
mRenderer.setMargins(new int[] {20, 30, 15, 0});
mRenderer.setShowLegend(false);
mRenderer.setAxisTitleTextSize(16);
mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(15);
mRenderer.setLegendTextSize(15);
mRenderer.addXTextLabel(1, "AC");
mRenderer.addXTextLabel(2, "PE");
mRenderer.addXTextLabel(3, "WA");
mRenderer.addXTextLabel(4, "TL");
mRenderer.addXTextLabel(5, "ML");
mRenderer.addXTextLabel(6, "CE");
mRenderer.addXTextLabel(7, "RE");
mRenderer.addXTextLabel(8, "OT");
mRenderer.setBarWidth(50);
mRenderer.setXAxisMin(-2);
mRenderer.setXAxisMax(11);
mRenderer.setYAxisMin(0);
mRenderer.setYLabelsAlign(Align.RIGHT);
mRenderer.setXLabelsColor(Color.BLACK);
mRenderer.setYLabelsColor(0, Color.BLACK);
mRenderer.setXLabels(0);
mRenderer.setChartValuesTextSize(16);
.........
Now the problems are:
mRenderer.setChartValuesTextSize(size); is not working as it is
deprecated
Bar text remains small till now
The highest bar is split off at the top
X Axis Label is not in proper alignment with bar
Following your numbering scheme:
You can fix this by setting the X axis min and max of the visible area: mRenderer.setXAxisMin(min); and mRenderer.setXAxisMax(max);
You can reduce it by increasing the width or by using the above methods such as there is more space to the left and right.
There is an opened issue for this.
Try mRenderer.setXLabelsColor(color);
renderer.setChartValuesTextSize(size);
mRenderer.setXLabels(0);
Edit:
Use renderer.setChartValuesTextSize(size);
Same as #1.
mRenderer.setYAxisMax(300);
Known issue: http://code.google.com/p/achartengine/issues/detail?id=312
I discovered that sizes are not correctly density calculated.
If u want:
mRenderer.setLabelsTextSize(15);
mRenderer.setLegendTextSize(15);
You need to set:
mRenderer.setLabelsTextSize(15* getResources().getDisplayMetrics().density);
mRenderer.setLegendTextSize(15* getResources().getDisplayMetrics().density);
I encounter the same problem. This is because AChartegine is trying to allocate enough space for each renderer so make a shift. This should simply resolved by Type.STACKED
Change
ChartFactory.getBarChartView(context, dataset,mRenderer, Type.DEFAULT);
to
ChartFactory.getBarChartView(context, dataset,mRenderer, Type.STACKED);
Hope this helps!
GraphicalView mChart = createIntent();
layout_graph.addView(mChart);
public GraphicalView createIntent() {
String[] titles = new String[] { " " };
List<Double> values = new ArrayList<Double>();
for (int i = 0; i < yaxes_value.size(); i++) {
// values.add(Double.parseDouble(yaxes_value.get(i)));
}
int[] colors = new int[] { Color.parseColor("#4DBA7A") };
XYMultipleSeriesRenderer renderer = buildBarRenderer(colors);
setChartSettings(renderer, "Simple Bar Chart", X_title, Y_title+type,
Color.BLACK, Color.BLACK,values);
for (int i = 0; i < Xaxes_value.size(); i++) {
renderer.addXTextLabel(i + 1, Xaxes_value.get(i));
}
int length = renderer.getSeriesRendererCount();
for (int i = 0; i < length; i++) {
SimpleSeriesRenderer seriesRenderer = renderer
.getSeriesRendererAt(i);
// seriesRenderer.setDisplayChartValues(true);
}
final GraphicalView grfv = ChartFactory.getBarChartView(
GraphActivity.this, buildBarDataset(titles, values), renderer,
Type.DEFAULT);
return grfv;
}
protected XYMultipleSeriesRenderer buildBarRenderer(int[] colors) {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxisTitleTextSize(25);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(20);
renderer.setLegendTextSize(20);
renderer.setPanEnabled(false, false);
renderer.setPanEnabled(false);
renderer.setZoomEnabled(false);
renderer.setZoomEnabled(false, false);
renderer.setBarSpacing(1f);
renderer.setBarWidth(50f);
renderer.setMarginsColor(Color.WHITE);
renderer.setXLabelsColor(Color.BLACK);
renderer.setYLabelsColor(0, Color.BLACK);
renderer.setApplyBackgroundColor(true);
renderer.setXLabelsAngle(335);
int length = colors.length;
for (int i = 0; i < length; i++) {
SimpleSeriesRenderer r = new SimpleSeriesRenderer();
r.setColor(colors[i]);
r.setChartValuesSpacing(10);
renderer.addSeriesRenderer(r);
}
return renderer;
}
protected XYMultipleSeriesDataset buildBarDataset(String[] titles,
List<Double> values) {
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
int length = titles.length;
for (int i = 0; i < length; i++) {
CategorySeries series = new CategorySeries(titles[i]);
for (int j = 0; j < values.size(); j++) {
series.add(values.get(j));
}
dataset.addSeries(series.toXYSeries());
}
return dataset;
}
protected void setChartSettings(XYMultipleSeriesRenderer renderer,
String title, String xTitle, String yTitle, int axesColor,
int labelsColor,List<Double> values) {
renderer.setChartTitle(title);
renderer.setYLabelsAlign(Align.RIGHT);
renderer.setXTitle(xTitle);
renderer.setYTitle(yTitle);
renderer.setXAxisMin(0);
renderer.setXLabels(0);
renderer.setXLabelsPadding(10);
renderer.setYLabelsPadding(2);
renderer.setYAxisMin(0);
renderer.setMargins(new int[] { 40, 100, 40, 20 });
// renderer.setYAxisMin((Collections.min(values)) / 2);
// renderer.setYAxisMax((Collections.max(values))
// + (Collections.min(values)));
renderer.setXAxisMax(layout_addrow.getChildCount() + 1);
renderer.setAxesColor(axesColor);
renderer.setLabelsColor(labelsColor);
}
Related
Hi, please help me to remove space between bars in chart and set
bars very close. have tried many ways. Anyone have solution,
please suggest me.Thanks in advance.The following is my code.
void drawChart(String[] items, float[] amount){
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
XYSeries[] qtySeries = new XYSeries[amount.length];
XYSeriesRenderer[] qtyRenderer = new XYSeriesRenderer[amount.length];
for(int i=0;i<amount.length ;i++){
qtySeries[i] = new XYSeries("");
qtySeries[i].add(i,amount[i]);
dataset.addSeries(qtySeries[i]);
qtyRenderer[i] = new XYSeriesRenderer();
qtyRenderer[i].setColor(color[i]);
qtyRenderer[i].setDisplayChartValues(true);
qtyRenderer[i].setChartValuesTextSize(15);
qtyRenderer[i].setChartValuesSpacing(22);
mRenderer.addSeriesRenderer(qtyRenderer[i]);
mRenderer.addXTextLabel(i+1, items[i]);
}
float max=amount[0];
for (int i = 0; i < amount.length; i++) {
if (amount[i] > max) {
max = amount[i];
}
}
mRenderer.setYAxisMax(max + 20);
mRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.VERTICAL);
mRenderer.setBarWidth(40f);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setBarSpacing(0.5);
mRenderer.setShowLegend(false);
mRenderer.setPanEnabled(true, false);
mRenderer.setZoomEnabled(false,false);
mRenderer.setXLabelsColor(Color.WHITE);
mRenderer.setYLabelsColor(0,Color.WHITE);
mRenderer.setXLabelsPadding(0.0f);
mRenderer.setYAxisMin(0);
mRenderer.setBarSpacing(0.0f);
lLytHourlyChart.removeAllViews();
lLytHourlyChart.addView(ChartFactory.getBarChartView(getActivity(), dataset, mRenderer, BarChart.Type.DEFAULT));
}
add bar spacing
mRenderer.setBarSpacing(-1);
I am having a AchartEngine Barchart. I have only two bars to show with Orientation as Vertical. The space between the two bars is very high and I am not able to change it. I have tried the following
1. Change the values passed to setBarSpacing() method from -100, -10, -.9, -.5, -.1, 0, .1, .5, .9, 10, 100
2. Used two XYSeries and then one. In both cases, the space is significant
3. Increased and decreased width of Bar
4. Set the min, max and values at different ranges. min = .9, max = 2.1, x1 = 1, x2 = 2
Nothing is working. Can some one please help me with this?
Try the following method.
The method below adds a barchart showing data for two months with values. If you want to change the color and some other properties, you are free to do that.
private void createChart() {
String[] mMonth = new String[] { "Jan", "Feb" };
int[] mData = new int[] { 20, 25 };
// creating XY series for Data
XYSeries series = new XYSeries("Performance");
// fill the data
for (int i = 0; i < mMonth.length; i++) {
series.add(i, mData[i]);
}
// create a dataset to hold each data series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding dataseries to datast
dataset.addSeries(series);
// create a renderer to customize the series
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.GREEN);
renderer.setFillPoints(true);
renderer.setLineWidth(2);
renderer.setDisplayChartValues(true);
renderer.setChartValuesTextSize(30);
// create a renderer to customize entire chart
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.setXLabels(0);
mRenderer.setXTitle("Quarter 1");
mRenderer.setYTitle("Values in K");
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.WHITE);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setZoomButtonsVisible(false);
mRenderer.setZoomEnabled(false, false);
mRenderer.setPanEnabled(false, false);
// margins
int marginT = 50;
int marginL = 80;
int marginB = 15;
int marginR = 15;
mRenderer.setMargins(new int[] { marginT, marginL, marginB, marginR });
mRenderer.setShowLegend(false);
mRenderer.setAxisTitleTextSize(30);
// mRenderer.setChartTitleTextSize(20);
mRenderer.setLabelsTextSize(30);
mRenderer.setLegendTextSize(30);
// mRenderer.addXTextLabel(8, "OT");
mRenderer.setXAxisMin(-0.5);
mRenderer.setXAxisMax(3);
mRenderer.setYAxisMin(0);
mRenderer.setYLabelsAlign(Align.RIGHT);
mRenderer.setXLabelsColor(Color.BLACK);
mRenderer.setYLabelsColor(0, Color.BLACK);
mRenderer.setXLabels(0);
mRenderer.setBarSpacing(2);
// We want to avoid black border
// transparent margins
mRenderer.setMarginsColor(Color.argb(0x00, 0xff, 0x00, 0x00));
for (int i = 0; i < mMonth.length; i++) {
mRenderer.addXTextLabel(i, mMonth[i]);
}
// adding renderer to multiple renderer(chart)
mRenderer.addSeriesRenderer(renderer);
GraphicalView view = ChartFactory.getBarChartView(this, dataset,
mRenderer, Type.STACKED);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.rlBarChart);
layout.addView(view, 0);
}
Hope this helps.
I am creating Default bar chart using Achartengine library. The values doesn't show properly. I want to show the chart value at top of the bar and align to center. For me only the values from the first bar are visible, but I want to see the values from both bars. How can I do that? I would appreciate any help.
Here is my code
public Intent getIntent(Context context)
{
// Bar 1
int[] y = { 124, 135, 443, 456, 234, 123, 342, 134, 123, 643, 234, 274 };
CategorySeries series = new CategorySeries("Demo Bar Graph 1");
for (int i = 0; i < y.length; i++) {
series.add("Bar " + (i+1), y[i]);
}
// Bar 2
int[] y2 = { 124, 135, 243, 256, 234, 223, 242, 234, 223, 243, 234, 274 };
CategorySeries series2 = new CategorySeries("Demo Bar Graph 2");
for (int i = 0; i < y.length; i++) {
series2.add("Bar " + (i+1), y2[i]);
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series.toXYSeries());
dataset.addSeries(series2.toXYSeries());
// This is how the "Graph" itself will look like
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.setChartTitle("Demo Graph Title");
mRenderer.setXTitle("X VALUES");
mRenderer.setYTitle("Y VALUES");
mRenderer.setAxesColor(Color.GREEN);
mRenderer.setLabelsColor(Color.RED);
mRenderer.setBarSpacing(2.0f);
// Customize bar 1
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.RED);
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing((float) 2.5);
mRenderer.addSeriesRenderer(renderer);
// Customize bar 2
XYSeriesRenderer renderer2 = new XYSeriesRenderer();
renderer.setColor(Color.GREEN);
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing((float) 2.5);
mRenderer.addSeriesRenderer(renderer2);
Intent intent = ChartFactory.getBarChartIntent(context, dataset,mRenderer, Type.DEFAULT);
return intent;
}
You are instantiating a renderer and a renderer2, but you are calling renderer.setDisplayChartValues(true) twice and never call renderer2.setDisplayChartValue(true);
I am totally new to Android and i am trying to create a bar chart using AChartEngine, it has 3 bars and each bar should be different color. I tried using multiple series but can't make my x-axis values align with bars
protected void onResume() {
super.onResume();
layout = (LinearLayout) findViewById(R.id.chart);
if (mChartView == null)
{
PeakSeries = new XYSeries("Income");
ForecastPeakSeries = new XYSeries("Expense");
ForecastSeries = new XYSeries("Expense");
int[] x = { 1,2,3};
int income = 2000;
int expense = 2700;
System.out.println("Here");
Series1.add(x[0],income);
Series2.add(x[1],expense);
Series3.add(x[2],expense);
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(Series1);
dataset.addSeries(Series2);
dataset.addSeries(Series3);
XYSeriesRenderer Renderer1 = new XYSeriesRenderer();
Renderer1 .setColor(Color.RED);
Renderer1 .setChartValuesTextSize(18);
Renderer1 .setFillPoints(true);
Renderer1 .setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer Renderer2 = new XYSeriesRenderer();
Renderer2 .setColor(Color.YELLOW);
Renderer2 .setChartValuesTextSize(18);
Renderer2 .setDisplayChartValues(true);
XYSeriesRenderer Renderer3 = new XYSeriesRenderer();
Renderer3 .setColor(Color.CYAN);
Renderer3 .setChartValuesTextSize(18);
Renderer3 .setFillPoints(true);
Renderer3 .setChartValuesTextAlign(Align.CENTER);
Renderer3 .setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
double[] range = {0,5,0,5};
multiRenderer.setMargins(new int[] {50, 50, 50, 50});
multiRenderer.setAxisTitleTextSize(16);
multiRenderer.setChartTitleTextSize(30);
multiRenderer.setLabelsTextSize(15);
multiRenderer.setLegendTextSize(20);
multiRenderer.setLegendHeight(40);
multiRenderer.setBarSpacing(-0.7);
multiRenderer.setAxesColor(Color.WHITE);
multiRenderer.setInitialRange(range, 1);
multiRenderer.setXAxisMin(0.4);
multiRenderer.setXAxisMax(4);
multiRenderer.setYAxisMax(5000);
multiRenderer.setYAxisMin(0);
multiRenderer.setXLabelsAlign(Align.RIGHT);
multiRenderer.setYLabelsAlign(Align.RIGHT);
//multiRenderer.s(Align.LEFT);
multiRenderer.setPanEnabled(false, false);
multiRenderer.setZoomEnabled(true, true);
multiRenderer.setChartTitle("7 Day Outlook - Maxiumum Demand");
multiRenderer.setXTitle("Date");
multiRenderer.setYTitle("MW");
multiRenderer.addSeriesRenderer(Renderer1 );
multiRenderer.addSeriesRenderer(Renderer2 );
multiRenderer.addSeriesRenderer(Renderer3 );
final GraphicalView mChartView = ChartFactory.getBarChartView(TestSevenDay1.this, dataset, multiRenderer,Type.DEFAULT);
layout.addView(mChartView);
}
else
{
mChartView.repaint();
}
}
Any help is greatly appreciated.
I handled it by setting the Type from Type.Default to Type.Stacked in the getBarChartView.
ChartFactory.getBarChartView(TestSevenDay1.this, dataset, multiRenderer, Type.STACKED);
When you have bar charts with only one item per series, it is a good idea not to use renderer.setBarSpacing() and use renderer.setBarWidth() instead.
I am plotting line graph using achart in which I need to put an image instead of a point style. How can i do that? Please help me?
protected void setRenderer(XYMultipleSeriesRenderer renderer, int[] colors, PointStyle[] styles) {
renderer.setAxisTitleTextSize(16);
renderer.setChartTitleTextSize(20);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[] { 20, 30, 15, 20 });
int length = colors.length;
for (int i = 0; i < length; i++) {
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
// I need to use image instead of styles here
r.setPointStyle(styles[i]);
renderer.addSeriesRenderer(r);
}
}