2013-04-01 20 views
9

Mam wykres słupkowy przy użyciu biblioteki AChartEngine jak pokazano poniżej ::wykres słupkowy za pomocą AChartEngine bibliotekę

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

powyższym wykresie kod wygląda następująco:

pic http://i49.tinypic.com/2j5xhrs.png

ale muszę narysować wykres z następującą usługą:

  1. Oś X będzie wyświetlać aktualny czas. Czas wykres pewne gdzie> 2 nad ranem
  2. każdy pręt w osi X jest 5 minut kreskowe
  3. za każde 5 minut mogę wysłać dane należy wyciągnąć pasek oparciu o wartości.
  4. teraz ignorować Y parametr oś wystarczy jak fabuła wymaga X-atrakcji turystycznych Aix

Graph niektóre co wygląda następująco:

pic http://i46.tinypic.com/13ypbw7.png

Odpowiedz

4

Możesz zachować uniksowe znaczniki czasu na X osi i kontrolować etykiety samemu. Można dodawać własne etykiety osi X przy użyciu:

renderer.addXTextLabel(x, "label"); 

Unix timestamp jest wartością, że getTime() na obiekt Date zwrotów. Więc można dodać te wartości do serii:

series.add(date.getTime(), value); 

Następnie można dodawać własne etykiety na niektóre wartości:

SimpleDateFormat format = new SimpleDateFormat("h a"); 
renderer.addXTextLabel(date.getTime(), format.format(date.getTime())); 
+0

proszę, możesz mi wyjaśnić na przykładzie sir..Regarding unix timestamps na osi x .. – Kiran

+0

Proszę zobaczyć moje edytowane odpowiedzi. –

+0

Ya dzięki spróbuje to – Kiran

5

zrobiłem coś takiego :: dla danych statycznych

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

} 

mam wykres jak

df http://i50.tinypic.com/jqtlpl.png

UPDATE :::

dla danych rzeczywistych czasu aktualizować serii jak

static ArrayList<Integer> sleep = new ArrayList<Integer>(); 

jak i kiedy newval jest dostępny

sleep.add(newval); 

następnie wywołać openChart(); w tym pierwszym zbiorze (jasny dataset.clear();) , a następnie zadzwoń pod numer repaint();

0

Myślę, że Twoje wymagania, Tworzenie niestandardowych wykresów słupkowych ułatwi. Oto przykład, który możesz rozwinąć za pomocą tego przykładu, po prostu używając 5 tablic, które chcesz pokazać na wykresie.

Bar Chart in Android With out any Built in jars

Wystarczy przejść gruntowną przykład i to sprawdzić.

Główną zaletą jest to, że nie trzeba używać żadnych predefiniowanych bibliotek do rysowania wykresów. będzie to możliwe z prostym interfejsem użytkownika podobnym do Androida, takim jak TextView and ListView