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);
Related
ScreenShot
Hello, i have a trouble with bar chart, i must remove this sticks on X and Y axis above numbers but i don't know how to do this, here is my code for creating chart: `String[] monthDays = new String[lastDayOfMonth];
// Create month days labels
int[] x = new int[lastDayOfMonth];
for (int i = 0; i < monthDays.length; i++) {
monthDays[i] = "" + (i + 1);
x[i] = i + 1;
}
// Create series
XYSeries majorSeries = new XYSeries("Major");
XYSeries middleSeries = new XYSeries("Middle");
XYSeries minorSeries = new XYSeries("Minor");
XYSeries restSeries = new XYSeries("Rest");
// Add data to series
for(int i = 0; i < x.length; i++) {
majorSeries.add(i, majorData[i]);
middleSeries.add(i, middleData[i]);
minorSeries.add(i, minorData[i]);
restSeries.add(i, restData[i]);
}
// Create series data set
XYMultipleSeriesDataset xyMultipleSeriesDataset = new XYMultipleSeriesDataset();
// Add series to data set
xyMultipleSeriesDataset.addSeries(restSeries);
xyMultipleSeriesDataset.addSeries(minorSeries);
xyMultipleSeriesDataset.addSeries(middleSeries);
xyMultipleSeriesDataset.addSeries(majorSeries);
// Create series render for major data set
XYSeriesRenderer majorXySeriesRenderer = new XYSeriesRenderer();
majorXySeriesRenderer.setColor(Color.parseColor("#4797b4"));
majorXySeriesRenderer.setFillPoints(true);
majorXySeriesRenderer.setLineWidth(2);
// Create series render for middle data set
XYSeriesRenderer middleXySeriesRenderer = new XYSeriesRenderer();
middleXySeriesRenderer.setColor(Color.parseColor("#4ec697"));
middleXySeriesRenderer.setFillPoints(true);
middleXySeriesRenderer.setLineWidth(2);
// Create series render for minor data set
XYSeriesRenderer minorXySeriesRenderer = new XYSeriesRenderer();
minorXySeriesRenderer.setColor(Color.parseColor("#1fb1ba"));
minorXySeriesRenderer.setFillPoints(true);
minorXySeriesRenderer.setLineWidth(2);
// Create series render for rest data set
XYSeriesRenderer restXySeriesRenderer = new XYSeriesRenderer();
restXySeriesRenderer.setColor(Color.parseColor("#c2c2c2"));
restXySeriesRenderer.setFillPoints(true);
restXySeriesRenderer.setLineWidth(2);
// Creating XYMultipleSeriesRenderer to customize chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setOrientation(XYMultipleSeriesRenderer.Orientation.HORIZONTAL);
// Add labels to x
for(int i = 0; i < monthDays.length; i++) {
multiRenderer.addXTextLabel(i, monthDays[i]);
}
multiRenderer.setXLabels(0);
multiRenderer.setYLabels(0);
multiRenderer.setXLabelsColor(Color.BLACK);
multiRenderer.setYLabelsColor(0, Color.BLACK);
multiRenderer.setLabelsTextSize(24);
multiRenderer.setZoomButtonsVisible(false);
multiRenderer.setPanEnabled(true, false);
multiRenderer.setPanLimits(new double[] {-0.75, 31, 0, 0});
multiRenderer.setClickEnabled(false);
multiRenderer.setZoomEnabled(false, false);
multiRenderer.setShowGridY(false);
multiRenderer.setShowGridX(false);
multiRenderer.setFitLegend(true);
multiRenderer.setShowAxes(false);
multiRenderer.setShowLegend(false);
multiRenderer.setShowGrid(false);
multiRenderer.setZoomEnabled(false);
multiRenderer.setExternalZoomEnabled(false);
multiRenderer.setAntialiasing(true);
multiRenderer.setInScroll(true);
multiRenderer.setLegendHeight(30);
multiRenderer.setXLabelsAlign(Paint.Align.CENTER);
multiRenderer.setYLabelsAlign(Paint.Align.LEFT);
multiRenderer.setTextTypeface("sans_serif", Typeface.NORMAL);
multiRenderer.setYAxisMax(maxValue + (maxValue * 2 / 100));
multiRenderer.addYTextLabel(0, currency + "0.0");
if (maxValue == 0) {
multiRenderer.setYAxisMax(500);
multiRenderer.addYTextLabel(500, currency + maxValue);
} else {
multiRenderer.addYTextLabel(multiRenderer.getYAxisMax(), currency + maxValue);
}
multiRenderer.setXAxisMin(-0.5);
multiRenderer.setXAxisMax(11);
multiRenderer.setBarSpacing(0.5);
multiRenderer.setBackgroundColor(Color.TRANSPARENT);
multiRenderer.setMarginsColor(Color.argb(0x00, 0xff, 0x00, 0x00));
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setMargins(new int[]{30, 30, 30, 30});
// Add all renders to multi render
multiRenderer.addSeriesRenderer(restXySeriesRenderer);
multiRenderer.addSeriesRenderer(minorXySeriesRenderer);
multiRenderer.addSeriesRenderer(middleXySeriesRenderer);
multiRenderer.addSeriesRenderer(majorXySeriesRenderer);
// Create array of chart types
CombinedXYChart.XYCombinedChartDef[] types = new CombinedXYChart.XYCombinedChartDef[]{
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 0),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 1),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 2),
new CombinedXYChart.XYCombinedChartDef(BarChart.TYPE, 3)};
// Get view of chart
GraphicalView graphicalView = ChartFactory.getCombinedXYChartView(getContext(), xyMultipleSeriesDataset, multiRenderer, types);
chart.removeAllViews();
chart.addView(graphicalView);`
Solved
To do this you can set labels color same as your background or transparent
multiRenderer.setXLabelsColor(Color.WHITE);
multiRenderer.setYLabelsColor(0, Color.WHITE);
After this you have to create your own class that extends chart class witch you need
public class MyChart extends CombinedXYChart {
int color;
public MyChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer, XYCombinedChartDef[] chartDefinitions) {
super(dataset, renderer, chartDefinitions);
}
#Override
protected void drawString(Canvas canvas, String text, float x, float y, Paint paint) {
paint.setColor(color);
super.drawString(canvas, text, x, y, paint);
}
public void setColor(int color) {
this.color = color;
}}
And finally you have to use your own class to create graphicalView and place it in layout
MyChart myChart = new MyChart(xyMultipleSeriesDataset, multiRenderer, types);
myChart.setColor(Color.BLACK);
GraphicalView graphicalView = new GraphicalView(getContext(), myChart);
This steps will override method from AbstractChart class witch draws only text values in your chart, but sticks will remain same color as your background, so they would be invisible
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 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);
}
I am developing a Bar chart using achartengine lib, It has two single series.In which one series should show the same color always and other series show different colors as per the given values
E.g.:
<200 green color,200> x < 300 blue color >300 orange color
The code is below:`
public class ChartActivity extends Activity {
private String[] mMonth = new String[] {
"Jan", "Feb" , "Mar", "Apr", "May", "Jun",
"Jul", "Aug" , "Sep", "Oct", "Nov", "Dec"
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chart);
Button btnChart = (Button) findViewById(R.id.btn_chart);
// Defining click event listener for the button btn_chart
OnClickListener clickListener = new OnClickListener() {
#Override
public void onClick(View v) {
// Draw the Income vs Expense Chart
openChart();
}
};
btnChart.setOnClickListener(clickListener);
}
private void openChart(){
int[] x = { 0,1,2,3,4,5,6,7 };
int[] income = { 25,50,75,100,125,150,175};
int[] expense = {50, 75, 100, 125, 150, 175, 200, 225 };
// Creating an XYSeries for Income
XYSeries incomeSeries = new XYSeries("Income");
// Creating an XYSeries for Expense
XYSeries expenseSeries = new XYSeries("Expense");
// Adding data to Income and Expense Series
for(int i=0;i<x.length;i++){
incomeSeries.add(i,income[i]);
expenseSeries.add(i,expense[i]);
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
dataset.addSeries(incomeSeries);
// Adding Expense Series to dataset
dataset.addSeries(expenseSeries);
// Creating XYSeriesRenderer to customize incomeSeries
XYSeriesRenderer incomeRenderer = new XYSeriesRenderer();
incomeRenderer.setColor(Color.BLUE);
incomeRenderer.setFillPoints(true);
incomeRenderer.setLineWidth(2);
incomeRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer expenseRenderer = new XYSeriesRenderer();
expenseRenderer.setColor(Color.RED);
expenseRenderer.setFillPoints(true);
expenseRenderer.setLineWidth(2);
expenseRenderer.setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setAxesColor(Color.BLACK);
multiRenderer.setXLabelsAlign(Align.RIGHT);
multiRenderer.setChartTitle("Income vs Expense Chart");
multiRenderer.setXTitle("Year 2012");
multiRenderer.setYTitle("Amount in Dollars");
multiRenderer.setBarSpacing(0.5);
multiRenderer.setMarginsColor(Color.WHITE);
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setBackgroundColor(Color.WHITE);
multiRenderer.setMargins(new int[] {20, 30, 15, 0});
multiRenderer.setZoomButtonsVisible(true);
for(int i=0; i< x.length;i++){
multiRenderer.addXTextLabel(i, mMonth[i]);
}
// Adding incomeRenderer and expenseRenderer to multipleRenderer
// Note: The order of adding dataseries to dataset and renderers to multipleRenderer
// should be same
multiRenderer.addSeriesRenderer(incomeRenderer);
multiRenderer.addSeriesRenderer(expenseRenderer);
// Creating an intent to plot bar chart using dataset and multipleRenderer
Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, multiRenderer, Type.DEFAULT);
// Start Activity
startActivity(intent);
}`
for that I have developed the code written below:
Different colors for single series(or elements of same series) is not yet implemented or provided by the Achartengine library... :
But there are methods using multiple series or Stacked bar graph
Check Bar chart using achartengine thread. and Different color bars using multiple series .
UPDATE:
For stacke bar graph
suppose ur input data for which u want to use different color
int[] expense = {50, 75, 100, 125, 150, 175, 200, 225 };
declare different series as array list
static ArrayList<Integer> series1 = new ArrayList<Integer>();
static ArrayList<Integer> series2 = new ArrayList<Integer>();
static ArrayList<Integer> series3 = new ArrayList<Integer>();
now check data from input and add it to appropriate series
for(int i=0;i<expense.lenght;i++)
{
if(expense[i]> 50 & expense[i]<100)
{ series1.add(expense[i]);
series2.add(0);
series3.add(0);}
if(expense[i]> 100 & expense[i]<150)
{.......}
}
i have implement the bar chart with the latest jar file anad its not displaying properly
This is my code:
private void openChart(){
int[] x = { 10,20,30,40,50,60,70 };
// int[] y = { 10,20,30,40,50,60,70 };
int[] income = { 20,25,27,30,28,35,37,38};
int[] expense = {22, 27, 29, 28, 26, 30, 33, 34 };
int[] sample = {22, 27, 29, 28, 26, 30, 33, 34 };
// Creating an XYSeries for Income
XYSeries incomeSeries = new XYSeries("Income");
// Creating an XYSeries for Expense
XYSeries expenseSeries = new XYSeries("Expense");
// Creating an XYSeries for Expense
XYSeries sampleseries = new XYSeries("Sample");
// Adding data to Income and Expense Series
for(int i=0;i<x.length;i++){
incomeSeries.add(i,income[i]);
expenseSeries.add(i,expense[i]);
sampleseries.add(i,sample[i]);
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
dataset.addSeries(incomeSeries);
// Adding Expense Series to dataset
dataset.addSeries(expenseSeries);
// Adding Expense Series to dataset
dataset.addSeries(sampleseries);
// Creating XYSeriesRenderer to customize incomeSeries
XYSeriesRenderer incomeRenderer = new XYSeriesRenderer();
incomeRenderer.setColor(Color.rgb(130, 130, 230));
incomeRenderer.setFillPoints(true);
incomeRenderer.setLineWidth(2);
incomeRenderer.setChartValuesTextAlign(Align.CENTER);
incomeRenderer.setChartValuesTextSize(18);
incomeRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer expenseRenderer = new XYSeriesRenderer();
expenseRenderer.setColor(Color.rgb(220, 80, 80));
expenseRenderer.setFillPoints(true);
expenseRenderer.setLineWidth(2);
expenseRenderer.setChartValuesTextAlign(Align.CENTER);
expenseRenderer.setChartValuesTextSize(18);
expenseRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer samplseries = new XYSeriesRenderer();
samplseries.setColor(Color.rgb(120, 40, 40));
samplseries.setFillPoints(true);
samplseries.setLineWidth(2);
samplseries.setChartValuesTextAlign(Align.CENTER);
samplseries.setChartValuesTextSize(18);
samplseries.setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setMargins(new int[] {30, 50, 50, 20});
multiRenderer.setZoomRate(0.2f); // disable pinch to zoom
multiRenderer.setZoomEnabled(false, false); // disable pinch to zoom
multiRenderer.setBarSpacing(0.3f); // space between series
multiRenderer.setXAxisMin(-1); // for x axis to start with some space
multiRenderer.setXAxisMax(5);
multiRenderer.setYAxisMin(0);
multiRenderer.setYAxisMax(50);
multiRenderer.setAxisTitleTextSize(20); // increase the text size of title of x and y
multiRenderer.setAxesColor(Color.BLACK); // x and y line color
multiRenderer.setGridColor(Color.GRAY); // grid line color
multiRenderer.setShowGridX(true); // to show the grid line
multiRenderer.setXLabels(0);
multiRenderer.setPanEnabled(true, false);
multiRenderer.setPanLimits(new double[] {-1,x.length,0,x.length});
// multiRenderer.setYLabels(0);
// multiRenderer.setChartTitle("Income vs Expense Chart");
multiRenderer.setLegendTextSize(26);
multiRenderer.setLabelsColor(Color.BLACK); // changing the x,y title color
multiRenderer.setLabelsTextSize(20); // changing the text size labels of x and y
multiRenderer.setXLabelsColor(Color.BLACK); // changing the color of x label
multiRenderer.setXTitle("Tests"); // title for x
multiRenderer.setYLabelsAlign(Align.RIGHT);// labels to display right
multiRenderer.setYLabelsColor(0, Color.BLACK);// changing the color of y label
multiRenderer.setYTitle("Scores");// title for y
for(int i=0; i< x.length;i++){
multiRenderer.addXTextLabel(i, mMonth[i]);
}
/*for(int i=0; i< x.length;i++){
multiRenderer.addYTextLabel(i, mScores[i]);
}*/
// Adding incomeRenderer and expenseRenderer to multipleRenderer
// Note: The order of adding dataseries to dataset and renderers to multipleRenderer
// should be same
multiRenderer.addSeriesRenderer(incomeRenderer);
multiRenderer.addSeriesRenderer(expenseRenderer);
multiRenderer.addSeriesRenderer(samplseries);
// Creating an intent to plot bar chart using dataset and multipleRenderer
Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, multiRenderer, Type.DEFAULT);
// Start Activity
startActivity(intent);
}
this is how my bar chart looks like ;
Where am i going wrong?
its not scrolling, not displaying the x-axis,y-axis values due to the black background and also i have given pan limits but nothing is working
ok i solved it by myself i had missed out to add multiRenderer.setMarginsColor(Color.WHITE);