轉自:http://blog.sina.com.cn/s/blog_4697cdcd0100pre5.html

average_temperature_landscape.png  





應用程式的開發過程中,經常會遇到和曲線圖打交道的情況,相比自己寫代碼繪製,無疑的,使用一些美觀高效的開源庫是一個更好的選擇。目前開源的曲線圖繪製工作有很多,本文以achartengine為例,介紹在Android系統下開發曲線圖相關程式的有關方法。

 

AChartEngine是專為Android系統設計的圖形庫,可以用於繪製多種圖表,具體清單如下,且每張圖上都支援多條曲線:

 

line chart ; area chart ; scatter chart ; time chart ; bar chart ;

 

pie chart ; bubble chart ; doughnut chart ; range (high-low) bar chart ;

 

下麵主要介紹畫line chart的方法:

 

幾個主要的類:

 

XYMultipleSeriesRenderer renderer; //曲線圖的格式,包括顏色,值的範圍,點和線的形狀等等
XYMultipleSeriesDataset dataset; //保存點集資料 ,包括每條曲線的X,Y座標

 

對圖表而言幾個重要的變數:

 

String[] titles; //每條曲線的名稱
List<double []> x; //點集的x座標
List<double []> y; //點集的y座標
int[] colors; //每條曲線的顏色
PointStyle[] styles; //每條曲線點的形狀

 

XYMultipleSeriesRenderer中的一些重要的方法,由名稱可以看出具體功能:

 

public void addSeriesRenderer(SimpleSeriesRenderer renderer)
public void removeSeriesRenderer(SimpleSeriesRenderer renderer)
public SimpleSeriesRenderer getSeriesRendererAt(int index)

 

public void setBackgroundColor(int color)
public void setAxesColor(int color)
public void setLabelsColor(int color)
public void setShowAxes(boolean showAxes)

 

public void setChartTitle(String title)
public void setChartTitleTextSize(float textSize)
public void setXTitle(String title)
public void setAxisTitleTextSize(float textSize)
public void setXAxisMin(double min)
public void setXAxisMax(double max)
public void setYTitle(String title)
public void setYAxisMin(double min)
public void setYAxisMax(double max)



XYMultipleSeriesDataset中的一些重要方法,由名稱可看出具體功能:

 

public void addSeries(XYSeries series)
public void removeSeries(int index)
public void removeSeries(XYSeries series)



AChartEngine的事例代碼中提供了一些管理XYMultipleSeriesDataset和XYMultipleSeriesRenderer的方式,通過buildRenderer,setChartSettings,buildDataset來實現,減少了分條目設置屬性的麻煩,具體見代碼中的函數。

 

下文代碼在一張圖中繪製了兩條曲線,並在主表單中顯示出來:

 

package net.ispiders;

 

import java.util.ArrayList;
import java.util.List;

 

import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;

 

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;

 

public class chartDemo extends Activity {

 

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

 

String[] titles = new String[] { "First", "Second"};

 

List x = new ArrayList();
List y = new ArrayList();

 

x.add(new double[] { 1, 3, 5, 7, 9, 11} );
x.add(new double[] { 0, 2, 4, 6, 8, 10} );

 

y.add(new double[] { 3, 14, 5, 30, 20, 25});
y.add(new double[] { 18, 9, 21, 15, 10, 6});

 

XYMultipleSeriesDataset dataset = buildDataset(titles, x, y);

 

int[] colors = new int[] { Color.BLUE, Color.GREEN};
PointStyle[] styles = new PointStyle[] { PointStyle.CIRCLE, PointStyle.DIAMOND};
XYMultipleSeriesRenderer renderer = buildRenderer(colors, styles, true);

 

setChartSettings(renderer, "Line Chart Demo", "X", "Y", -1, 12, 0, 35 , Color.WHITE, Color.WHITE);

 

View chart = ChartFactory.getLineChartView(this, dataset, renderer);

 

setContentView(chart);
}

 

protected XYMultipleSeriesDataset buildDataset(String[] titles,
List xValues,
List yValues)
{
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();

 

int length = titles.length; //有幾條線
for (int i = 0; i < length; i++)
{
XYSeries series = new XYSeries(titles[i]); //根據每條線的名稱創建
double[] xV = xValues.get(i); //獲取第i條線的資料
double[] yV = yValues.get(i);
int seriesLength = xV.length; //有幾個點

 

for (int k = 0; k < seriesLength; k++) //每條線裡有幾個點
{
series.add(xV[k], yV[k]);
}

 

dataset.addSeries(series);
}

 

return dataset;
}

 

protected XYMultipleSeriesRenderer buildRenderer(int[] colors, PointStyle[] styles, boolean fill)
{
XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
int length = colors.length;
for (int i = 0; i < length; i++)
{
XYSeriesRenderer r = new XYSeriesRenderer();
r.setColor(colors[i]);
r.setPointStyle(styles[i]);
r.setFillPoints(fill);
renderer.addSeriesRenderer(r);
}
return renderer;
}
 protected void setChartSettings(XYMultipleSeriesRenderer renderer, String title, 
                                String xTitle,String yTitle, double xMin, 
                                double xMax, double yMin, double yMax, 
                                int axesColor,int labelsColor) 
    { 
        renderer.setChartTitle(title); 
        renderer.setXTitle(xTitle); 
        renderer.setYTitle(yTitle); 
        renderer.setXAxisMin(xMin); 
        renderer.setXAxisMax(xMax); 
        renderer.setYAxisMin(yMin); 
        renderer.setYAxisMax(yMax); 
        renderer.setAxesColor(axesColor); 
        renderer.setLabelsColor(labelsColor); 
    } 
}
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()