Achartengine graph displaying too much space between values - android

I am trying to plot a graph using achartengine. As you can see from the image, it looks quite ugly.I want to ,
1. Reduce space between values. I cannot have that much space since I need to add more series to it.
2. I am not plotting any negative values, so why it's showing lines at the bottom. The values displayed at the bottom are -1.I want to eliminate any lines at the bottom.
3. If possible, I want to change the background color of graph from black to some other color.
Thanks. Code is included with which I am working.
String see = pull.trim();
String str = '"' + see + '"';
int[] intArray = new int[str.length()];
for(int i=0; i < str.length(); i++){
intArray[i] = Character.digit(str.charAt(i), 10);
}
CategorySeries series = new CategorySeries("My Graph");
for(int i = 0; i <intArray.length; i++){
series.add("Bar ", intArray[i]);
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series.toXYSeries());
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing((float) 0.1);
renderer.setColor(getResources().getColor(R.color.fuchsia));
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
mRenderer.setChartTitle("My Graph");
mRenderer.setYTitle("Values");
mRenderer.setZoomButtonsVisible(true);
LinearLayout chart_container=(LinearLayout)findViewById(R.id.Chart_layout);
mChart=(GraphicalView)ChartFactory.getBarChartView(getBaseContext(), dataset, mRenderer, Type.DEFAULT);
chart_container.addView(mChart);

I found out that the bottom negative values were showing because there were spaces in my string with which I was plotting graph.So I wrote it this way,
Hopefully it helps someone in the future.
String see = pull.replaceAll("\\s+","");
int[] intArray = new int[see.length()];
for(int k=0; k < see.length(); k++){
intArray[k] = Character.digit(see.charAt(k), 10);
}

Related

How to remove space between bars in achart engine Android

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);

AChartEngine - How to Add onClickListener and conflict between setClickEnabled() and setPanEnabled()

I have an application that creates a bar chart based on Database values. In my main activity, I have this function:
public void onClick(View view){
BarGraph bar = new BarGraph();
bar.setCustomerCD(String.valueOf(spinner1.getSelectedItem()));
yagoDB.open();
ArrayList<String> stringList = yagoDB.getCustomerItem(String.valueOf(spinner1.getSelectedItem()));
String[] itemArray = new String[stringList.size()];
String[] returnedArray = stringList.toArray(itemArray);
bar.setItemCD(returnedArray);
bar.setMax(yagoDB.getQtyMax(String.valueOf(spinner1.getSelectedItem())));
bar.setItemCount(yagoDB.getItemCDCount(String.valueOf(spinner1.getSelectedItem())));
ArrayList<Integer> stringList2 = yagoDB.getCustomerQtyInt(String.valueOf(spinner1.getSelectedItem()));
yagoDB.close();
int[] returnedQty = convertIntegers(stringList2);
bar.setQty(returnedQty);
Intent barIntent = bar.getIntent(this);
startActivity(barIntent);
}
In this function, I'm basically creating an instance of my BarGraph class, initializing some of its variables, after which, I call its getIntent function. Here is the getIntent() function in the BarGraph class, the rest of the class contains setters and getters:
public Intent getIntent(Context context) {
int y[] = Qty;
CategorySeries series = new CategorySeries("Bar1");
for (int i = 0; i < y.length; i++) {
series.add("Bar" + (i + 1), y[i]);
}
// collection of series under one object, there could any number of series
XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset();
dataSet.addSeries(series.toXYSeries());
// customization of the chart
XYSeriesRenderer renderer = new XYSeriesRenderer();
renderer.setColor(Color.BLUE);
renderer.setDisplayChartValues(true);
renderer.setChartValuesSpacing((float) 50d);
renderer.setChartValuesTextSize(30);
renderer.setLineWidth((float) 10.5d);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
mRenderer.setChartTitle("Sales for " + customerCD);
mRenderer.setXTitle("\n \n Item Codes");
mRenderer.setAxisTitleTextSize(30);
mRenderer.setChartTitleTextSize(30);
mRenderer.setLabelsTextSize(20);
mRenderer.setYTitle("\n\n\n\n\n\n\n Number of Orders");
mRenderer.setLabelsColor(Color.BLACK);
mRenderer.setZoomButtonsVisible(true);
mRenderer.setShowLegend(true);
mRenderer.setLegendTextSize(25);
mRenderer.setShowGridX(true); // this will show the grid in graph
mRenderer.setShowGridY(true);
mRenderer.setAxesColor(Color.BLACK);
mRenderer.setGridColor(Color.BLACK);
mRenderer.setYLabelsColor(0, Color.BLACK);
mRenderer.setXLabelsColor(Color.BLACK);
mRenderer.setBarSpacing(.5);
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(Color.WHITE);
mRenderer.setMarginsColor(Color.WHITE);
mRenderer.setXAxisMin(0);
mRenderer.setXAxisMax(itemCount + 1);
mRenderer.setXLabels(0);
mRenderer.setYAxisMin(0);
mRenderer.setYAxisMax(max+1);
//right, top, left, bottom
mRenderer.setMargins(new int[]{30,50,100,10});
mRenderer.setXLabelsPadding(10);
mRenderer.setYLabelsPadding(20);
for(int i = 0 ; i < ItemCD.length; i++){
mRenderer.addXTextLabel(i+1, ItemCD[i]);
}
mRenderer.setZoomEnabled(true, false);
//mRenderer.setClickEnabled(true);
mRenderer.setPanEnabled(true, false); // will fix the chart position
//xMin, xMax, yMin, yMax
mRenderer.setPanLimits(new double[]{0, itemCount + 1, 0, max + 1});
mRenderer.setOrientation(Orientation.VERTICAL);
Intent intent = ChartFactory.getBarChartIntent(context, dataSet,
mRenderer, Type.DEFAULT);
return intent;
}
I have googled examples and tutorials in how to and onClickListeners to a Graph generated by AChartEngine, but most of them involve generating the graph in the same class/activity. However, I noticed that the example that does not have to call an intent and I'm quite puzzled on how that worked.
Also, I had an issue where I set setClickEnabled() to true and it disabled setPanEnabled() from functioning properly.
So, several questions:
How do you add an onClickListener() on individual bars in a graph generated by AChartEngine?
Is there a way to enable setClickEnabled() and have it not conflict setPanEnabled()?
For the first question, see this example, starting at line #157.
For the second question, you can have them both enabled, but when you pan, the setOnClickListener will be running as well.

Bar chart not working in AchartEngine

I am trying to create Bar Chart using AchartEngine but various things doesn't work for me..
1) Unable to show Grid.
2) Unable to remove category series title i.e "Bar Graph".
3) It's not showing bars as it should show.
4) By Default white color background is visible.
is it possible to provide space between each bars??
Bar Chart Code
CategorySeries series = new CategorySeries("Bar Graph");
for (int i = 0; i < availCatList.size(); i++)
series.add(availCatList.get(i), mTotal.get(i));
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series.toXYSeries());
XYSeriesRenderer seriesRenderer = new XYSeriesRenderer();
seriesRenderer.setChartValuesSpacing(0.5f);
seriesRenderer.setDisplayChartValues(true);
seriesRenderer.setColor(Color.GREEN);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
mRenderer.setChartTitle("Bar Chart");
mRenderer.setShowGrid(true);
mRenderer.setAxisTitleTextSize(15);
mRenderer.setXLabelsAlign(Align.CENTER);
mRenderer.setXTitle("Categories");
mRenderer.setYTitle("Amount");
mRenderer.setScale(1.0f);
for (int i = 0; i < availCatList.size(); i++) {
mRenderer.addXTextLabel(i + 1, availCatList.get(i));
}
mRenderer.setXLabels(0);
mRenderer.addSeriesRenderer(seriesRenderer);
view = ChartFactory.getBarChartView(this, dataset, mRenderer,
Type.DEFAULT);
// layout.removeAllViews();
layout.addView(view);
Any Help would be highly appreciated..
Thanks
mRenderer.setShowGrid(true) works fine in all the examples in the demo code. Try to set another color using mRenderer.setGridColor(color);
You mean the legend: mRenderer.setShowLegend(false);
series.add(mTotal.get(i)); is the correct usage for bar charts.
That's probably from the profile. Just set your own background color.
Space between bars: read the APIs for mRenderer.setBarSpacing();

AChartEngine Multiple Y Axis overlapping Values

i use the AChartEngine as a library to draw my line Charts. This Line-Chart consists of Multiple Y-Axis (3-5 Axis) and goes on a Timeline on the X-Axis.
My Problem is, that Y-Axis-Values are overlapping (see image)
Heres my code:
//Puls, Geschwindigkeit und Hoehenmeter dem Diagramm hinzufugen
HashMap<Long, Heartrate> heartrateMap = trainingLog.getHeartrateList();
HashMap<Long, GPS> gpsMap = trainingLog.getGpsList();
//Puls, Geschwindigkeit und Hoehenmeter dem Diagramm hinzufugen
XYSeries heartrateSeries = new XYSeries("Puls", 0);
XYSeries altitudeSeries = new XYSeries("Höhenmeter", 1);
XYSeries speedSeries = new XYSeries("Geschwindigkeit", 2);
for(int i=0; i<trainingLog.getDuration(); i++){
Heartrate heartrate = heartrateMap.get(Long.valueOf(i));
if(heartrate != null){
heartrateSeries.add(i, heartrate.getHeartrate());
}
GPS gps = gpsMap.get(Long.valueOf(i));
if(gps != null){
altitudeSeries.add(i, gps.getAltitude());
speedSeries.add(i, gps.getSpeed());
}
}
XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset();
dataSet.addSeries(0, heartrateSeries);
dataSet.addSeries(1, altitudeSeries);
dataSet.addSeries(2, speedSeries);
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer(3);
//Renderer fuer Pulswerte
XYSeriesRenderer rendererHeartrate = new XYSeriesRenderer();
rendererHeartrate.setColor(Color.RED);
multiRenderer.addSeriesRenderer(rendererHeartrate);
//Renderer fuer Hoehenmeter
XYSeriesRenderer rendererAltitude = new XYSeriesRenderer();
rendererAltitude.setColor(Color.BLUE);
multiRenderer.addSeriesRenderer(rendererAltitude);
//Renderer fuer Geschwindigkeit
XYSeriesRenderer rendererSpeed = new XYSeriesRenderer();
rendererSpeed.setColor(Color.DKGRAY);
multiRenderer.addSeriesRenderer(rendererSpeed);
//Hintergrundfarbe weiß setzen
multiRenderer.setApplyBackgroundColor(true);
multiRenderer.setBackgroundColor(Color.WHITE);
multiRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
//Label--Einstellungen
multiRenderer.setYLabelsColor(0, Color.RED);
multiRenderer.setYLabelsColor(1, Color.BLUE);
multiRenderer.setYLabelsColor(2, Color.DKGRAY);
multiRenderer.setLabelsTextSize(25);
int length = multiRenderer.getSeriesRendererCount();
for (int i = 0; i < length; i++) {
XYSeriesRenderer r = (XYSeriesRenderer) multiRenderer.getSeriesRendererAt(i);
r.setLineWidth(2f);
}
//Legenden-Einstellungen
multiRenderer.setLegendTextSize(20);
multiRenderer.setMargins(new int[] {20, 20, 20, 20});
Looper.prepare();
graphicalView = ChartFactory.getLineChartView(getActivity(), dataSet, multiRenderer);
Does anyone know how to solve this problem? The best way would be to set the y-labels parallel to each other, but i havent found a way to do this. Or is there a function to set the margin of each y-label to the y-axis?
Thanks for your help!
You could set different alignments for your Y axis labels. For instance, the first series would align the labels on the left, the second one on the right and the third on center.
multiRenderer.setYLabelsAlign(Align.LEFT, 0);
multiRenderer.setYLabelsAlign(Align.RIGHT, 1);
multiRenderer.setYLabelsAlign(Align.CENTER, 2);
Simply set y axis minimum value and maximum value for all three scales you used.
Then change color of two Y scales to transparent using Color.argb

android - How to implement the Line Graph using Achartengine

I am new to Graph concept in android. In my app i want implement the line graph using achartengine. I have the demo of achartengine it consists a lot of code. I am not able to understand the line graph. I want simple Line graph using achartengine. Please can anybody help me.
thanks
Following method will generate random points (x,y) and add it to XYSeries (it is series of points to be plotted on chart).
private XYMultipleSeriesDataset getDemoDataset() {
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
final int nr = 7;
Random r = new Random();
for (int i = 0; i < SERIES_NR; i++) {
XYSeries series = new XYSeries("Demo series " + (i + 1));
for (int k = 0; k < nr; k++) {
series.add(k, 20 + r.nextInt() % 100);
}
dataset.addSeries(series);
}
return dataset;
}
Following Method will return a multiple renderer which is used to draw line charts.
private XYMultipleSeriesRenderer getDemoRenderer() {
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
renderer.setAxisTitleTextSize(12);
renderer.setChartTitleTextSize(12);
renderer.setLabelsTextSize(15);
renderer.setLegendTextSize(15);
renderer.setPointSize(5f);
renderer.setMargins(new int[] { 20, 30, 15, 0 });
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(Color.BLACK);
r.setPointStyle(PointStyle.CIRCLE);
r.setFillBelowLine(false);
r.setFillPoints(true);
renderer.addSeriesRenderer(r);
setChartSettings(renderer);
return renderer;
}
Following method will set the settings for your chart. You can look for more options in docs provided by AChartEngine.
private void setChartSettings(XYMultipleSeriesRenderer renderer) {
renderer.setChartTitle("Chart demo");
renderer.setXTitle("x values");
renderer.setYTitle("y values");
renderer.setApplyBackgroundColor(false);
renderer.setRange(new double[] {0,6,-70,40});
renderer.setFitLegend(false);
renderer.setAxesColor(Color.BLACK);
renderer.setShowGrid(true);
renderer.setXAxisMin(0.5);
renderer.setXAxisMax(10.5);
renderer.setYAxisMin(0);
renderer.setZoomEnabled(false);
renderer.setYAxisMax(30);
}
You can now get the line chart in two ways:
Chart as a view which can be added to any layout:
ChartFactory.getLineChartView(this,
getDemoDataset(), getDemoRenderer());
Chart as an Intent for a new activity alltogether
ChartFactory.getLineChartIntent(this,
getDemoDataset(), getDemoRenderer());
PS: SERIES_NR is a constant which tells how many line series you want to draw.

Categories

Resources