bar graph using AChartEngine library - android

I have a bar graph using AChartEngine library as shown below ::
public class MainActivity extends Activity {
private String[] mMonth = new String[] {
"Jan", "Feb" , "Mar", "Apr", "May", "Jun",
"Jul", "Aug" , "Sep", "Oct", "Nov", "Dec"
};
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Getting reference to the button btn_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();
}
};
// Setting event click listener for the button btn_chart of the MainActivity layout
btnChart.setOnClickListener(clickListener);
}
private void openChart(){
int[] x = { 0,1,2,3,4,5,6,7 };
int[] income = { 2000,2500,2700,3000,2800,3500,3700,3800};
int[] expense = {2200, 2700, 2900, 2800, 2600, 3000, 3300, 3400 };
// Creating an XYSeries for Income
//CategorySeries incomeSeries = new CategorySeries("Income");
XYSeries incomeSeries = new XYSeries("Income");
// Creating an XYSeries for Income
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.rgb(130, 130, 230));
incomeRenderer.setFillPoints(true);
incomeRenderer.setLineWidth(2);
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.setDisplayChartValues(true);
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setChartTitle("Income vs Expense Chart");
multiRenderer.setXTitle("Year 2012");
multiRenderer.setYTitle("Amount in Dollars");
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);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Above code graph looks like:
But i need to draw a graph with following property:
X-axis will have to display current time.as show in below graph time
is some where >2am
each bar in X-axis is 5 minutes bar
for every 5 minutes i send a data it should draw a bar based on
value.
for now ignore Y axis parameter just need how to plot required
X-aixs
The Graph some what looks like this:

i did something like this:: for static data
public class MainActivity extends Activity {
final Calendar c = Calendar.getInstance();
int mMinute = c.get(Calendar.MINUTE);
int mHour = c.get(Calendar.HOUR_OF_DAY);
int am =c.get(Calendar.AM_PM);
int[] x =new int[1920];
int[] sleep = {4,3,2,1,4,3,2,1,4,3,2,1,4,1,1,1,4,4,2,2,2,3,3,2,2,2,2,2,1,1,1,1,1,1,4,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2};
public String getnext(int a)
{
String ap;
if(am==1){ap="PM";}
else{ap="AM";}
String s= mHour+" "+ap;
mMinute=mMinute+5;
if (mHour >=12){
mHour=mHour-12;
switch(am){case 0:am=1; break; case 1:am=0;break;}
}
if(mMinute >= 60)
{
mHour= mHour+1;
mMinute=mMinute-60;
}
//Log.d("Gr","mMinute: "+mMinute);
if(mMinute==1 | mMinute==2 | mMinute==3 |mMinute==4 | mMinute==0)
{s= mHour+" "+ap;}
else{s="";}
return (s);}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
openChart();
}
private void openChart(){
XYSeries sleepSeries = new XYSeries("Sleep");
for(int i=0;i<sleep.length;i++){
sleepSeries.add(i,sleep[i]);
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
dataset.addSeries(sleepSeries);
// Creating XYSeriesRenderer to customize incomeSeries
XYSeriesRenderer sleepRenderer = new XYSeriesRenderer();
sleepRenderer.setColor(Color.GREEN);
sleepRenderer.setFillPoints(true);
sleepRenderer.setLineWidth((float) .2);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setYAxisMin(0);
multiRenderer.setYLabels(0);
multiRenderer.setYAxisMax(4);
multiRenderer.setChartTitle("Sleep vs Time");
multiRenderer.setBarSpacing(.5);
//multiRenderer.setZoomButtonsVisible(true);
multiRenderer.setLegendHeight((int) 5);
multiRenderer.setPanEnabled(true, false);
multiRenderer.addSeriesRenderer(sleepRenderer);
// Creating an intent to plot bar chart using dataset and multipleRenderer
Intent intent = ChartFactory.getBarChartIntent(getBaseContext(), dataset, renderer, Type.DEFAULT);
// Start Activity
startActivity(intent);
}
i got graph like
UPDATE:::
for real time data , update series like
static ArrayList<Integer> sleep = new ArrayList<Integer>();
as and when newval is available
sleep.add(newval);
then call openChart(); in that first clear dataset (dataset.clear();)
then call repaint();

You can keep Unix timestamps on the X axis and control the labels yourself. You can add custom X axis labels using:
renderer.addXTextLabel(x, "label");
A Unix timestamp is the value that the getTime() on a Date object returns. So you can add such values to your series:
series.add(date.getTime(), value);
Then, you can add custom labels for some of the values:
SimpleDateFormat format = new SimpleDateFormat("h a");
renderer.addXTextLabel(date.getTime(), format.format(date.getTime()));

I think for your requirement, Creating custom bar charts will make easy.Here is the example, you can develop with this example by simply using 5 arrays which you want to show on graph.
Bar Chart in Android With out any Built in jars
Just, go thorough the example and check it.
The main advantage is you need not use any predefined libraries for drawing charts. it will be possible with simple android UI like TextView and ListView

Related

How to display specific dates period on axis with TimeChartView using achartengine

I'm displaying set of dates by x-axis and scores by y-axis. But now dates displaying like this skipping whole weeks from 11 to 27 and then 12. But should be 11-18-25-1 - every week.
I saw similar questions here. But not really get how to implement it. Now I'm doing this chart like this:
private String[] xValues = null;
private double[] yValues = null;
/** The main dataset that includes all the series that go into a chart. */
private XYMultipleSeriesDataset mDataset = new XYMultipleSeriesDataset();
/** The main renderer that includes all the renderers customizing a chart. */
private XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer();
/** The most recently added series. */
private XYSeries mCurrentSeries;
/** The most recently created renderer, customizing the current series. */
private XYSeriesRenderer mCurrentRenderer;
private GraphicalView mChartView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
// set some properties on the main renderer
mRenderer.setApplyBackgroundColor(true);
mRenderer.setBackgroundColor(getResources().getColor(R.color.bkg_green));
mRenderer.setAxisTitleTextSize(25);
mRenderer.setChartTitleTextSize(25);
mRenderer.setLabelsTextSize(20);
mRenderer.setLegendTextSize(25);
mRenderer.setShowGrid(true);
mRenderer.setMargins(new int[] {50, 50, 25, 25 });
mRenderer.setMarginsColor(Color.argb(0x00, 0x01, 0x01, 0x01));
mRenderer.setAxesColor(getResources().getColor(R.color.white));
mRenderer.setLabelsColor(getResources().getColor(R.color.white));
mRenderer.setXLabelsColor(getResources().getColor(R.color.white));
mRenderer.setYLabelsColor(0, getResources().getColor(R.color.white));
mRenderer.setZoomEnabled(true,false);
mRenderer.setPointSize(5);
mRenderer.setPanEnabled(true, false);
}
//init chart with data
#Override public void onSuccess(final GraphResponse response) {
runOnUiThread(new Runnable() {
#Override public void run() {
mProgressBar.setVisibility(View.INVISIBLE);
response.clearFromNullPoints();
xValues = new String[response.getData().size()];
yValues = new double[response.getData().size()];
for (int i = 0; i < response.getData().size(); i++) {
xValues[i] = response.getData().get(i).getDate();
yValues[i] = response.getData().get(i).getValue();
}
if (mChartView == null) {
LinearLayout layout = (LinearLayout) findViewById(R.id.chart);
mChartView = ChartFactory.getTimeChartView(getApplicationContext(), mDataset, mRenderer,
"dd.MM.yyyy");
layout.addView(mChartView,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
addSeries();
} else {
mChartView.repaint();
}
}
});
}
void addSeries() {
TimeSeries series = new TimeSeries("Progress");
// populate data
for (int i = 0; i < xValues.length; i++) {
try {
series.add(dateFormat.parse(xValues[i]), yValues[i]);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
mDataset.addSeries(series);
mCurrentSeries = series;
// create a new renderer for the new series
XYSeriesRenderer renderer = new XYSeriesRenderer();
mRenderer.addSeriesRenderer(renderer);
// set some renderer properties
renderer.setPointStyle(PointStyle.CIRCLE);
renderer.setFillPoints(true);
renderer.setDisplayChartValues(true);
renderer.setDisplayChartValuesDistance(40);
renderer.setChartValuesTextSize(30);
renderer.setColor(getResources().getColor(R.color.white));
renderer.setLineWidth(3.0f);
mCurrentRenderer = renderer;
mChartView.repaint();
}
How to display dates by x-axis with specific period - one week?
You probably want to have the chart display the actual data labels rather than the rounded ones. So, I suggest you do:
mRenderer.setXRoundedLabels(false);
Update: Another way to set your own labels is to disable the regular labels and add your custom ones:
mRenderer.setXLabels(0);
// one such call for every label
mRenderer.addXTextLabel(x, label);
I finally ended up setting own xAxis displaying period:
mRenderer.setXAxisMin(series.getX(0));
mRenderer.setXAxisMax(series.getX(0) + ONE_MONTH);
And setting up grid with 4 labels:
mRenderer.setXLabels(4);
Which give period 8 days and nice one month displaying on full width of display.

Move start position of linear graph to the right in achartengine

I recently started to work with achartengine. I would like to draw a simple linear graph
but with offset away from the origin of the axis - (0,0).
I changed the x array from the original values to start from 5.
This is my code so far
public class MainActivity extends Activity {
private String[] mMonth = new String[] {
"Jan", "Feb" , "Mar", "Apr", "May", "Jun",
};
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
openChart();
}
private void openChart(){
int[] x = { 5,6,7,8,9};
int[] income = { 240,467,259,570,500};
int[] expense = {200, 521, 290, 219, 457};
// Creating an XYSeries for Income
XYSeries incomeSeries = new XYSeries("Income");
// Creating an XYSeries for Income
XYSeries expenseSeries = new XYSeries("Expenses");
// Adding data to Income and Expense Series
for(int i=0;i<x.length;i++){
incomeSeries.add(x[i], income[i]);
expenseSeries.add(x[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.WHITE);
incomeRenderer.setPointStyle(PointStyle.CIRCLE);
incomeRenderer.setFillPoints(true);
incomeRenderer.setLineWidth(2);
incomeRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer expenseRenderer = new XYSeriesRenderer();
expenseRenderer.setColor(Color.BLUE);
expenseRenderer.setPointStyle(PointStyle.CIRCLE);
expenseRenderer.setFillPoints(true);
expenseRenderer.setLineWidth(3);
expenseRenderer.setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setChartTitle("Income vs Expense Chart");
multiRenderer.setXTitle("Year 2011");
multiRenderer.setYTitle("Amount in Rupees");
multiRenderer.setZoomButtonsVisible(true);
for(int i=0;i<x.length;i++){
multiRenderer.addXTextLabel(i+1, 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 line chart using dataset and multipleRenderer
Intent intent = ChartFactory.getLineChartIntent(getBaseContext(), dataset, multiRenderer);
// Start Activity
startActivity(intent);
}
}
It sounds like you are looking to control the visible area of the chart:
mRenderer.setXAxisMin(minValue);
mRenderer.setXAxisMax(maxValue);

Customizing achart engine XYMultipleSeriesRenderer display

I am currently working on an android application where I need to display linegraph. I choose achartengine and make XYMultipleSeriesRenderer with timeseries. I am using following code.
private void openChart(){
int count = 5;
Date[] dt = new Date[5];
for(int i=0;i<count;i++){
GregorianCalendar gc = new GregorianCalendar(2012, 10, i+1);
dt[i] = gc.getTime();
}
int[] visits = { 40,40,40,40,40};
int[] views = {55, 51, 44, 41, 39};
// Creating TimeSeries for Visits
TimeSeries visitsSeries = new TimeSeries("Theshold");
// Creating TimeSeries for Views
TimeSeries viewsSeries = new TimeSeries("Readings");
// Adding data to Visits and Views Series
for(int i=0;i<dt.length;i++){
visitsSeries.add(dt[i], visits[i]);
viewsSeries.add(dt[i],views[i]);
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding Visits Series to the dataset
dataset.addSeries(visitsSeries);
// Adding Visits Series to dataset
dataset.addSeries(viewsSeries);
// Creating XYSeriesRenderer to customize visitsSeries
XYSeriesRenderer thresholdRenderer = new XYSeriesRenderer();
thresholdRenderer.setColor(Color.GREEN);
thresholdRenderer.setPointStyle(PointStyle.CIRCLE);
thresholdRenderer.setFillPoints(true);
thresholdRenderer.setLineWidth(2);
thresholdRenderer.setDisplayChartValues(true);
// Creating XYSeriesRenderer to customize viewsSeries
XYSeriesRenderer readingRenderer = new XYSeriesRenderer();
readingRenderer.setColor(Color.BLUE);
readingRenderer.setPointStyle(PointStyle.CIRCLE);
readingRenderer.setFillPoints(true);
readingRenderer.setLineWidth(2);
readingRenderer.setDisplayChartValues(true);
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setLabelsTextSize(20);
multiRenderer.setXLabelsPadding(5);
multiRenderer.setYAxisMax(90);
multiRenderer.setYAxisMin(-20);
multiRenderer.setXTitle("Time Stamps");
multiRenderer.setYTitle("Temperature");
multiRenderer.setZoomButtonsVisible(true);
// Adding visitsRenderer and viewsRenderer to multipleRenderer
// Note: The order of adding dataseries to dataset and renderers to multipleRenderer
// should be same
multiRenderer.addSeriesRenderer(thresholdRenderer);
multiRenderer.addSeriesRenderer(readingRenderer);
// Getting a reference to LinearLayout of the MainActivity Layout
LinearLayout chartContainer = (LinearLayout) findViewById(R.id.chart_container);
// Creating a Time Chart
mChart = (GraphicalView) ChartFactory.getTimeChartView(getBaseContext(), dataset, multiRenderer,"dd-MMM-yyyy");
multiRenderer.setClickEnabled(true);
multiRenderer.setSelectableBuffer(10);
// Setting a click event listener for the graph
mChart.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
Format formatter = new SimpleDateFormat("dd-MMM-yyyy");
SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint();
if (seriesSelection != null) {
int seriesIndex = seriesSelection.getSeriesIndex();
String selectedSeries="Visits";
if(seriesIndex==0)
selectedSeries = "Visits";
else
selectedSeries = "Views";
// Getting the clicked Date ( x value )
long clickedDateSeconds = (long) seriesSelection.getXValue();
Date clickedDate = new Date(clickedDateSeconds);
String strDate = formatter.format(clickedDate);
// Getting the y value
int amount = (int) seriesSelection.getValue();
// Displaying Toast Message
Toast.makeText(
getBaseContext(),
selectedSeries + " on " + strDate + " : " + amount ,
Toast.LENGTH_SHORT).show();
}
}
});
// Adding the Line Chart to the LinearLayout
chartContainer.addView(mChart);
}
Using the above code I am able to generated following view
I am now stuck on the customizing the view. How can I remove the black background around the chart. And how can I increase the text size of legends and the xlabel and ylabel as well.
Using the setLabelsTextSize will only increase the size of the data in x and y axis (e.g. the date and the temperature value).
Thanks
Updated image:
To change the legend text size use multiRenderer.setLegendTextSize(). To change the outline background color use multiRenderer.setMarginsColor().
As a general note, customizations that involve the entire graph are probably going to be found as part of your XYMultipleSeriesRenderer. I recommend playing with the different settings and finding what each does.
ADDITIONAL
To increase the axes title size use multiRenderer.setAxesTitleSize(). As for the axes label colors use multiRenderer.setXLabelsColor() and multiRenderer.setYLabelsColor(). The axis color can be changed with multiRenderer.setAxesColor().
Again, I encourage you to play with the settings of the renderer. In your IDE, type multiRenderer. and all available methods will be shown. Scroll through those and you can probably find what you are looking. Most of the methods have clear descriptive names.
Change the color and font size use these code
XYSeriesRenderer incomeRenderer = new XYSeriesRenderer();
incomeRenderer.setColor(Color.rgb(130, 130, 230));
incomeRenderer.setChartValuesTextSize(15);
incomeRenderer.setDisplayChartValues(true);
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setChartTitle("Question vs Time Chart");
multiRenderer.setInScroll(true);
multiRenderer.setXTitle("Questions");
multiRenderer.setLabelsColor(Color.BLACK);
multiRenderer.setAxesColor(Color.BLACK);
multiRenderer.setXLabelsColor(Color.RED);
multiRenderer.setYLabelsColor(0, Color.RED);
multiRenderer.setLabelsTextSize(15);
multiRenderer.setYLabelsPadding(10);
multiRenderer.setZoomEnabled(false, false);
double[] set_pan=new double[]{-1.0,Double.MAX_VALUE,0.0,Double.MAX_VALUE+2};
multiRenderer.setPanLimits(set_pan);
multiRenderer.setPanEnabled(true, false);
multiRenderer.setLegendTextSize(15);
multiRenderer.setAxisTitleTextSize(18);
multiRenderer.setChartTitleTextSize(25);
multiRenderer.setTextTypeface("Arial", Typeface.BOLD);
multiRenderer.setMarginsColor(Color.WHITE);

remove titles, labels, legends from achartengine Android

I am trying to draw a chart(like below image) using achart engine library in android.
DESIRED_CHART.png
Here is what i achieved
CURRENT_CHART.png
Code to draw this is as below
private void drawChart(){
int[] x = { 1,2,3,4,5,6,7,8 };
int[] happyness = { 5,2,4,1,0,4,5,0};
int[] energy = { 5,4,3,1,4,3,5,0};
int[] strenth = { 2,0,1,3,2,4,3,0};
int[] endurance = { 0,2,1,4,3,5,2,0};
// Creating an XYSeries for Income
XYSeries happynessSeries = new XYSeries("Happyness");
// Creating an XYSeries for Income
XYSeries energySeries = new XYSeries("Energy");
// Adding data to Income and Expense Series
XYSeries strenthSeries = new XYSeries("Strenth");
XYSeries enduranceSeries = new XYSeries("Endurance");
for(int i=0;i<x.length;i++){
happynessSeries.add(x[i], happyness[i]);
energySeries.add(x[i],energy[i]);
strenthSeries.add(x[i],strenth[i]);
enduranceSeries.add(x[i],endurance[i]);
}
// Creating a dataset to hold each series
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
// Adding Income Series to the dataset
dataset.addSeries(happynessSeries);
// Adding Expense Series to dataset
dataset.addSeries(energySeries);
dataset.addSeries(strenthSeries);
dataset.addSeries(enduranceSeries);
// Creating XYSeriesRenderer to customize incomeSeries
XYSeriesRenderer happynessRenderer = new XYSeriesRenderer();
happynessRenderer.setColor(Color.parseColor("#f4ed21"));//chart border color
happynessRenderer.setPointStyle(PointStyle.CIRCLE);
happynessRenderer.setFillPoints(true);
happynessRenderer.setLineWidth(2);
happynessRenderer.setDisplayChartValues(true);
happynessRenderer.setFillBelowLine(true);
happynessRenderer.setFillBelowLineColor(Color.parseColor("#bbf4ed21"));
// Creating XYSeriesRenderer to customize expenseSeries
XYSeriesRenderer energyRenderer = new XYSeriesRenderer();
energyRenderer.setColor(Color.parseColor("#20bff2"));
energyRenderer.setPointStyle(PointStyle.CIRCLE);
energyRenderer.setFillPoints(true);
energyRenderer.setLineWidth(2);
energyRenderer.setDisplayChartValues(true);
energyRenderer.setFillBelowLine(true);
energyRenderer.setFillBelowLineColor(Color.parseColor("#bb20bff2"));
// strenth
XYSeriesRenderer strenthRenderer = new XYSeriesRenderer();
strenthRenderer.setColor(Color.parseColor("#f97b1d"));
strenthRenderer.setPointStyle(PointStyle.CIRCLE);
strenthRenderer.setFillPoints(true);
strenthRenderer.setLineWidth(2);
strenthRenderer.setDisplayChartValues(true);
strenthRenderer.setFillBelowLine(true);
strenthRenderer.setFillBelowLineColor(Color.parseColor("#bbf97b1d"));
// endurance
XYSeriesRenderer enduranceRenderer = new XYSeriesRenderer();
enduranceRenderer.setColor(Color.parseColor("#c68c4d"));
enduranceRenderer.setPointStyle(PointStyle.CIRCLE);
enduranceRenderer.setFillPoints(true);
enduranceRenderer.setLineWidth(2);
enduranceRenderer.setDisplayChartValues(true);
enduranceRenderer.setFillBelowLine(true);
enduranceRenderer.setFillBelowLineColor(Color.parseColor("#bbc68c4d"));
// Creating a XYMultipleSeriesRenderer to customize the whole chart
XYMultipleSeriesRenderer multiRenderer = new XYMultipleSeriesRenderer();
multiRenderer.setXLabels(0);
multiRenderer.setZoomButtonsVisible(true);
for(int i=0;i<x.length;i++){
multiRenderer.addXTextLabel(i+1, mMonth[i]);
}
multiRenderer.setLabelsTextSize(50);
multiRenderer.setYLabels(0);
multiRenderer.setMargins(new int[]{0,0,0,0});
multiRenderer.addSeriesRenderer(happynessRenderer);
multiRenderer.addSeriesRenderer(energyRenderer);
multiRenderer.addSeriesRenderer(strenthRenderer);
multiRenderer.addSeriesRenderer(enduranceRenderer);
multiRenderer.setPanEnabled(false, false);
multiRenderer.setZoomEnabled(false, false);
multiRenderer.setZoomEnabled(false, false);
// Creating an intent to plot line chart using dataset and multipleRenderer
mChart =(GraphicalView) ChartFactory.getLineChartView(getBaseContext(), dataset, multiRenderer);
llChart.addView(mChart);
}
first and last x Axis points values (Mon feb 3 and Mon Feb 9) are cutting. I am struggling to show these values as DESIRED_CHART.png
How to remove this black background behind the Xaxis Values?
To change background color
multiRenderer.setMarginsColor(Color.GREEN);
and give margins to show whole x Axis points values text
multiRenderer.setMargins(new int[]{0,40,0,40});
To hide title
multiRenderer.setChartTitle("");
To hide legends
multiRenderer.setShowLegend(false);
where multiRenderer is XYMultipleSeriesRenderer .

Singleseries bar displaying multiple colors on the basis of given data in a Barchart uding achartengine lib

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)
{.......}
}

Categories

Resources