9

我有一个使用库的条形图AChartEngine,如下所示::

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

上面的代码图如下所示:

图片

但我需要绘制具有以下属性的图表:

  1. X轴必须显示当前时间。如下图所示,时间是> 2am
  2. X 轴上的每个柱子是 5 分钟柱子
  3. 每 5 分钟我发送一个数据,它应该根据值绘制一个条形图。
  4. 现在忽略 Y 轴参数只需要如何绘制所需的 X-aixs

图表看起来像这样:

图片

4

3 回答 3

5

我做了这样的事情:: 用于静态数据

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

}

我得到了像

df

更新:::

对于实时数据,更新系列如

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

当 newval 可用时

 sleep.add(newval);

然后调用openChart();第一个清除数据集(dataset.clear();)然后调用repaint();

于 2013-04-09T04:40:28.733 回答
4

您可以在 X 轴上保留 Unix 时间戳并自己控制标签。您可以使用以下方法添加自定义 X 轴标签:

renderer.addXTextLabel(x, "label");

Unix 时间戳是 Date 对象上的 getTime() 返回的值。因此,您可以将这些值添加到您的系列中:

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

然后,您可以为某些值添加自定义标签:

SimpleDateFormat format = new SimpleDateFormat("h a");
renderer.addXTextLabel(date.getTime(), format.format(date.getTime()));
于 2013-04-04T20:03:50.860 回答
0

我认为根据您的要求,创建自定义条形图将变得容易。这是示例,您可以通过简单地使用要在图表上显示的 5 个数组来使用此示例进行开发。

Bar Chart in Android With out any Built in jars

只是,仔细阅读示例并检查它。

主要优点是您不需要使用任何预定义的库来绘制图表。可以使用简单的android UI,例如TextView and ListView

于 2013-06-03T04:02:08.350 回答