2014年2月21日金曜日

AFreeChartで積立グラフ :AFreeChart


package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.chart.axis.NumberAxis;
import org.afree.chart.plot.XYPlot;
import org.afree.chart.renderer.xy.StackedXYBarRenderer;
import org.afree.data.xy.DefaultTableXYDataset;
import org.afree.data.xy.XYSeries;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XYSeries series1 = new XYSeries("First", true, false);
series1.add(1, 10);
series1.add(2, 0);
series1.add(3, 30);
series1.add(4, 40);
series1.add(5, 50);
XYSeries series2 = new XYSeries("Second", true, false);
series2.add(1, 50);
series2.add(2, 40);
series2.add(3, 30);
series2.add(4, 20);
series2.add(5, 10);
DefaultTableXYDataset dataset = new DefaultTableXYDataset();
dataset.addSeries(series1);
dataset.addSeries(series2);
// X軸の定義
NumberAxis domainAxis = new NumberAxis("X軸");
// Y軸の定義
NumberAxis rangeAxis = new NumberAxis("Y軸");
// 折れ線の定義
//XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
StackedXYBarRenderer renderer = new StackedXYBarRenderer();
renderer.setMargin(0.2);
renderer.setShadowVisible(false);//影
XYPlot plot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);
AFreeChart chart = new AFreeChart(plot);
NumberAxis numberAxis = (NumberAxis) plot.getDomainAxis();
numberAxis.setLowerBound(0);
numberAxis.setUpperBound(6);
GraphView spcv = (GraphView) findViewById(R.id.graphView1);
spcv.setChart(chart);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

2014年2月20日木曜日

棒グラフ:XYBarRenderer :AFreeChart



package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.chart.axis.NumberAxis;
import org.afree.chart.plot.XYPlot;
import org.afree.chart.renderer.xy.XYBarRenderer;
import org.afree.data.xy.XYSeries;
import org.afree.data.xy.XYSeriesCollection;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series = new XYSeries("XYSeries");
series.add(1, 1);
series.add(2, 2);
series.add(3, 3);
series.add(4, 4);
series.add(5, 5);
series.add(6, 6);
series.add(7, 7);
dataset.addSeries(series);
// X軸の定義
NumberAxis domainAxis = new NumberAxis("X軸");
// Y軸の定義
NumberAxis rangeAxis = new NumberAxis("Y軸");
// 折れ線の定義
//XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
XYBarRenderer renderer = new XYBarRenderer();
XYPlot plot = new XYPlot(dataset, domainAxis, rangeAxis, renderer);
AFreeChart chart = new AFreeChart(plot);
GraphView spcv = (GraphView) findViewById(R.id.graphView1);
spcv.setChart(chart);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.graphics.geom.RectShape;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class GraphView extends View {
private AFreeChart chart;
private RectShape chartArea;
public GraphView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
chartArea = new RectShape();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
chartArea.setWidth(w);
chartArea.setHeight(h);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.chart.draw(canvas, chartArea);
}
public void setChart(AFreeChart chart) {
this.chart = chart;
}
}
view raw GraphView.java hosted with ❤ by GitHub

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.afreechart.GraphView
android:id="@+id/graphView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

AFreeChartで棒グラフ :AFreeChart

AFreeChartのサンプルのデモを参考にやってみる。
https://code.google.com/p/afreechart/source/browse/trunk/afreechart_sample/src/org/afree/chart/demo/view/BarChartDemo1View.java?r=41


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.afreechart.GraphView
android:id="@+id/graphView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.graphics.geom.RectShape;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class GraphView extends View {
private AFreeChart chart;
private RectShape chartArea;
public GraphView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
chartArea = new RectShape();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
chartArea.setWidth(w);
chartArea.setHeight(h);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.chart.draw(canvas, chartArea);
}
public void setChart(AFreeChart chart) {
this.chart = chart;
}
}
view raw GraphView.java hosted with ❤ by GitHub
package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.chart.ChartFactory;
import org.afree.chart.axis.CategoryAxis;
import org.afree.chart.axis.CategoryLabelPositions;
import org.afree.chart.axis.NumberAxis;
import org.afree.chart.plot.CategoryPlot;
import org.afree.chart.plot.PlotOrientation;
import org.afree.chart.renderer.category.BarRenderer;
import org.afree.data.category.CategoryDataset;
import org.afree.data.category.DefaultCategoryDataset;
import org.afree.graphics.GradientColor;
import org.afree.graphics.SolidColor;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GraphView spcv = (GraphView) findViewById(R.id.graphView1);
CategoryDataset dataset = createDataset();
AFreeChart chart = createChart(dataset);
spcv.setChart(chart);
}
private static AFreeChart createChart(CategoryDataset dataset) {
// create the chart...
AFreeChart chart = ChartFactory.createBarChart(
"Bar Chart Demo 1", // chart title
"Category", // domain axis label
"Value", // range axis label
dataset, // data
PlotOrientation.VERTICAL, // orientation
true, // include legend
true, // tooltips?
false // URLs?
);
// NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
// set the background color for the chart...
chart.setBackgroundPaintType(new SolidColor(Color.WHITE));
// get a reference to the plot for further customisation...
CategoryPlot plot = (CategoryPlot) chart.getPlot();
// set the range axis to display integers only...
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// disable bar outlines...
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setDrawBarOutline(false);
// set up gradient paints for series...
GradientColor gp0 = new GradientColor(Color.BLUE, Color.rgb(0, 0, 64));
GradientColor gp1 = new GradientColor(Color.GREEN, Color.rgb(0, 64, 0));
GradientColor gp2 = new GradientColor(Color.RED, Color.rgb(64, 0, 0));
renderer.setSeriesPaintType(0, gp0);
renderer.setSeriesPaintType(1, gp1);
renderer.setSeriesPaintType(2, gp2);
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(
Math.PI / 6.0));
// OPTIONAL CUSTOMISATION COMPLETED.
return chart;
}
private static CategoryDataset createDataset() {
// row keys...
String series1 = "First";
String series2 = "Second";
String series3 = "Third";
// column keys...
String category1 = "Category 1";
String category2 = "Category 2";
String category3 = "Category 3";
String category4 = "Category 4";
String category5 = "Category 5";
// create the dataset...
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1.0, series1, category1);
dataset.addValue(4.0, series1, category2);
dataset.addValue(3.0, series1, category3);
dataset.addValue(5.0, series1, category4);
dataset.addValue(5.0, series1, category5);
dataset.addValue(5.0, series2, category1);
dataset.addValue(7.0, series2, category2);
dataset.addValue(6.0, series2, category3);
dataset.addValue(8.0, series2, category4);
dataset.addValue(4.0, series2, category5);
dataset.addValue(4.0, series3, category1);
dataset.addValue(3.0, series3, category2);
dataset.addValue(2.0, series3, category3);
dataset.addValue(3.0, series3, category4);
dataset.addValue(6.0, series3, category5);
return dataset;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

AFreeChartでグラフ作成 :AFreeChart

1.ライブラリ:afreechart-0.0.4.jar をダウンロードして、libs フォルダに入れる。
2.view を作成する。
3.データを入れる。


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.afreechart.GraphView
android:id="@+id/graphView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.graphics.geom.RectShape;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
public class GraphView extends View {
private AFreeChart chart;
private RectShape chartArea;
public GraphView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
chartArea = new RectShape();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
chartArea.setWidth(w);
chartArea.setHeight(h/2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
this.chart.draw(canvas, chartArea);
}
public void setChart(AFreeChart chart) {
this.chart = chart;
}
}
view raw GraphView.java hosted with ❤ by GitHub
package com.example.afreechart;
import org.afree.chart.AFreeChart;
import org.afree.chart.ChartFactory;
import org.afree.chart.plot.PlotOrientation;
import org.afree.data.xy.XYSeries;
import org.afree.data.xy.XYSeriesCollection;
import org.afree.graphics.SolidColor;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series = new XYSeries("XYSeries");
series.add(1, 1);
series.add(2, 2);
series.add(3, 3);
series.add(4, 4);
series.add(5, 5);
series.add(6, 6);
series.add(7, 7);
dataset.addSeries(series);
AFreeChart chart = ChartFactory.createXYLineChart("タイトル", "X軸ラベル",
"y軸ラベル", dataset, PlotOrientation.VERTICAL, false, true, false);
chart.setBackgroundPaintType(new SolidColor(Color.GRAY));//背景の色
chart.setBorderPaintType(new SolidColor(Color.BLACK));//枠線の色
GraphView spcv = (GraphView) findViewById(R.id.graphView1);
spcv.setChart(chart);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

2014年2月19日水曜日

積み上げグラフに挑戦 :Androidplot

棒グラフに挑戦 のソースコードを、AndroidplotのDocsのExamplesにあるBar Plot を参考変更する。

package com.example.androidplottest;
import java.text.DecimalFormat;
import java.util.Arrays;
import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.BarFormatter;
import com.androidplot.xy.BarRenderer;
import com.androidplot.xy.BarRenderer.BarWidthStyle;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private XYPlot plot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
plot = (XYPlot) findViewById(R.id.aprLevelsPlot);
Number[] series1Numbers10 = {2, null, 5, 2, 7, 4, 3, 7, 4, 5};
Number[] series2Numbers10 = {4, 6, 3, null, 2, 0, 7, 4, 5, 4};
Number[] series1Numbers = series1Numbers10;
Number[] series2Numbers = series2Numbers10;
XYSeries series1 = new SimpleXYSeries(Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Us");
XYSeries series2 = new SimpleXYSeries(Arrays.asList(series2Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Them");
plot.addSeries(series1, new BarFormatter(Color.BLUE, Color.BLACK));
plot.addSeries(series2, new BarFormatter(Color.RED, Color.BLACK));
plot.setDomainStepValue(10);
plot.setDomainLabel("X軸ラベル");
plot.setRangeBoundaries(0, 10, BoundaryMode.FIXED);//Y軸 0-10
plot.setRangeValueFormat(new DecimalFormat("0"));//整数
plot.setDomainValueFormat(new DecimalFormat("0"));//X軸目盛整数
//グリッド
plot.setGridPadding(20, 10, 20, 0);//left, top, right, bottom グリッドのパディング
plot.setPlotPaddingBottom(10);//ビューのパディング
plot.getGraphWidget().setMarginBottom(10);//グラフと凡例の隙間
//凡例の調整
plot.getLegendWidget().setSize(new SizeMetrics (20, SizeLayoutType.ABSOLUTE, 100, SizeLayoutType.ABSOLUTE ));
//BarRenderer の取得 変更
BarRenderer<?> barRenderer = (BarRenderer<?>) plot.getRenderer(BarRenderer.class);
if(barRenderer != null) {
Log.v("----","OK");
barRenderer.setBarWidth(10);
//barRenderer.get
barRenderer.setBarWidthStyle(BarWidthStyle.FIXED_WIDTH);
//barRenderer.setBarGap(-30);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}


plot.setRangeBoundaries(0, 10, BoundaryMode.FIXED);//Y軸 0-10 plot.setRangeValueFormat(new DecimalFormat("0"));//整数

上記のコードは、7.8を7と表示しているのでおかしくなっているので修正する。

plot.setRangeBoundaries(0, 10, BoundaryMode.FIXED);//Y軸 0-10 plot.setRangeStep(XYStepMode.SUBDIVIDE, 11);







2014年2月18日火曜日

棒グラフに挑戦 :Androidplot

とりあえず表示してみる

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.androidplot.xy.XYPlot
android:id="@+id/aprLevelsPlot"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
package com.example.androidplottest;
import java.util.Arrays;
import com.androidplot.xy.BarFormatter;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
public class MainActivity extends Activity {
private XYPlot plot;
private SimpleXYSeries aprLevelsSeries;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
plot = (XYPlot) findViewById(R.id.aprLevelsPlot);
//aprLevelsSeries = new SimpleXYSeries("APR Levels");
//aprLevelsSeries.useImplicitXVals();
Number[] series1Numbers10 = {3, 8, 5};
Number[] series1Numbers = series1Numbers10;
XYSeries series1 = new SimpleXYSeries(Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Us");
plot.addSeries(series1, new BarFormatter(Color.BLUE, Color.BLACK));
plot.setRangeBoundaries(0, 10, BoundaryMode.FIXED);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}


QuickstartのDynamically Plotting Sensor Dataのソースを見ながら調整していく。

package com.example.androidplottest;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.text.Format;
import java.text.ParsePosition;
import java.util.Arrays;
import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.BarFormatter;
import com.androidplot.xy.BarRenderer;
import com.androidplot.xy.BarRenderer.BarWidthStyle;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private XYPlot plot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
plot = (XYPlot) findViewById(R.id.aprLevelsPlot);
Number[] series1Numbers = {3, 8, 5};
SimpleXYSeries series1 = new SimpleXYSeries(Arrays.asList(series1Numbers), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, "Sensor");
plot.addSeries(series1, new BarFormatter(Color.BLUE, Color.BLACK));
plot.setDomainStepValue(3);
plot.setDomainLabel("Axis");
plot.setRangeBoundaries(0, 10, BoundaryMode.FIXED);//Y軸 0-10
plot.setRangeValueFormat(new DecimalFormat("0"));//整数
//グリッド
plot.setGridPadding(20, 10, 20, 0);//left, top, right, bottom グリッドのパディング
plot.setPlotPaddingBottom(10);//ビューのパディング
plot.getGraphWidget().setMarginBottom(10);//グラフと凡例の隙間
//凡例の調整
plot.getLegendWidget().setSize(new SizeMetrics (20, SizeLayoutType.ABSOLUTE, 100, SizeLayoutType.ABSOLUTE ));
//Y目盛り表示変更
Format myFormat = new Format(){
@Override
public StringBuffer format(Object object, StringBuffer buffer, FieldPosition field) {
// TODO Auto-generated method stub
Number num = (Number) object;
int roundNum = (int) num.floatValue() ;
switch(roundNum) {
case 0:
buffer.append("Azimuth");
break;
case 1:
buffer.append("Pitch");
break;
case 2:
buffer.append("Roll");
}
return buffer;
}
@Override
public Object parseObject(String string, ParsePosition position) {
// TODO Auto-generated method stub
return null;
}};
plot.setDomainValueFormat( myFormat );
//BarRenderer の取得 変更
BarRenderer<?> barRenderer = (BarRenderer<?>) plot.getRenderer(BarRenderer.class);
if(barRenderer != null) {
Log.v("----","OK");
barRenderer.setBarWidth(10);
//barRenderer.get
barRenderer.setBarWidthStyle(BarWidthStyle.FIXED_WIDTH);
//barRenderer.setBarGap(-30);
}
//データの変更
Number[] series1NumbersNew = {8, 5, 1};
series1.setModel(Arrays.asList(series1NumbersNew), SimpleXYSeries.ArrayFormat.Y_VALS_ONLY);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

2014年2月17日月曜日

Androidplotに挑戦 :Androidplot

Androidplot はアンドロイドでグラフを描くときに使うライブラリ

Quickstart を参考にやってみる

ライブラリ:androidplot-core-0.6.0.jarをhttp://androidplot.com/download/ からダウンロードしてくる。

プロジェクトを作成する。

libs フォルダにライブラリを入れる。

レイアウトファイル activity_main.xml を作成する。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.androidplot.xy.XYPlot
android:id="@+id/mySimpleXYPlot"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>

グラフィカルレイアウト画面ではエラーが確認できるが、よく分からないので無視して進む。
この時点で実行すると下記のように表示される。


グラフデータをセットする。
package com.example.androidplottest;
import java.util.Arrays;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ビューの取得
XYPlot plot = (XYPlot) findViewById(R.id.mySimpleXYPlot);
//グラフのデータ Yの値
Number[] series1Numbers = {1, 8, 5, 2, 7, 4};
// Turn the above arrays into XYSeries':
XYSeries series1 = new SimpleXYSeries(
Arrays.asList(series1Numbers), // SimpleXYSeries takes a List so turn our array into a List
SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
"Series1");
LineAndPointFormatter series1Format = new LineAndPointFormatter();
plot.addSeries(series1, series1Format);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}


色々調整してみる

package com.example.androidplottest;
import java.text.DecimalFormat;
import java.util.Arrays;
import com.androidplot.ui.SizeLayoutType;
import com.androidplot.ui.SizeMetrics;
import com.androidplot.xy.BoundaryMode;
import com.androidplot.xy.LineAndPointFormatter;
import com.androidplot.xy.PointLabelFormatter;
import com.androidplot.xy.SimpleXYSeries;
import com.androidplot.xy.XYPlot;
import com.androidplot.xy.XYSeries;
import com.androidplot.xy.XYStepMode;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//ビューの取得
XYPlot plot = (XYPlot) findViewById(R.id.mySimpleXYPlot);
//グラフのデータ Yの値
Number[] series1Numbers = {1, 8, 5, 2, 7, 4 ,6 ,3};
// Turn the above arrays into XYSeries':
XYSeries series1 = new SimpleXYSeries(
Arrays.asList(series1Numbers), // SimpleXYSeries takes a List so turn our array into a List
SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
"Series1");
//ラインの色 ポイントの色 塗りつぶし色 の設定
LineAndPointFormatter series1Format = new LineAndPointFormatter();
series1Format.setPointLabelFormatter(new PointLabelFormatter());
series1Format.configure(getApplicationContext(),
R.xml.line_point_formatter_with_plf1);
plot.addSeries(series1, series1Format);
plot.setPlotMargins(0, 0, 0, 20);//ビューのマージン
plot.setPlotPaddingBottom(5);//ビューのパディング
plot.setTitle("タイトル");//タイトル
plot.setGridPadding(0, 10, 10, 0);//left, top, right, bottom グリッドのパディング
plot.getGraphWidget().setMarginBottom(10);//グラフと凡例の隙間
//凡例の調整
plot.getLegendWidget().setSize(new SizeMetrics (20, SizeLayoutType.ABSOLUTE, 200, SizeLayoutType.ABSOLUTE ));
//Y軸目盛
plot.setRangeBoundaries(0.0, 10.0, BoundaryMode.FIXED);//Y軸目盛0-10
plot.setRangeValueFormat(new DecimalFormat("0"));//整数
// X軸目盛
plot.setDomainBoundaries(0, 8, BoundaryMode.FIXED);//目盛0から8
plot.setDomainStep(XYStepMode.INCREMENT_BY_VAL,2);//目盛のステップ
//グリッドとメモリの色
plot.getGraphWidget().getGridBackgroundPaint().setColor(Color.BLACK);//グリッドの背景
plot.getGraphWidget().getDomainGridLinePaint().setColor(Color.MAGENTA);//グリッドの縦線の色
plot.getGraphWidget().getRangeGridLinePaint().setColor(Color.CYAN);//グリッドの横線の色
plot.getGraphWidget().getDomainOriginLinePaint().setColor(Color.BLUE);//Y軸目盛の線
plot.getGraphWidget().getRangeOriginLinePaint().setColor(Color.WHITE);//X軸目盛の線
plot.getGraphWidget().getDomainLabelPaint().setColor(Color.GRAY);//X軸の目盛の文字色
plot.getGraphWidget().getRangeLabelPaint().setColor(Color.YELLOW);//Y軸の目盛の文字色
plot.getGraphWidget().getDomainOriginLabelPaint().setColor(Color.GREEN);//X軸の0目盛の文字色
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

ラインの色、太さ、ポイントの色、塗り潰し色、文字の色
<?xml version="1.0" encoding="utf-8"?>
<config
linePaint.strokeWidth="3dp"
linePaint.color="#00AA00"
vertexPaint.color="#ff0000"
fillPaint.color="#00000000"
pointLabelFormatter.textPaint.color="#FFFFFF"/>


2014年2月13日木曜日

android-mbed usb serial :USB Host

mbedに付いているUSBとアンドロイドをUSBホストケーブルで接続して送受信をする。

USBディバイスを接続した時点で、実行するアプリを選択する。

AndroidManifest.xml のinternt-filterの中を修正する
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mbedserialtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.mbedserialtest.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
</application>
</manifest>
device_filter.xmlをダウンロードしてきてmbedのベンダーIDを追記する
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
<usb-device vendor-id="1027" product-id="24577" />
<!-- 0x2341 / Arduino -->
<usb-device vendor-id="9025" />
<!-- 0x16C0 / 0x0483: Teensyduino -->
<usb-device vendor-id="5824" product-id="1155" />
<!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
<usb-device vendor-id="4292" product-id="60000" />
<!-- mbed blue VID:0d28 PID:0204 NXP LPC1768 -->
<usb-device vendor-id="3368"/>
</resources>

この時点でインストールしてmbedと接続すると。下の様になる。

シリアル通信するには、
FTDrvier : Android USBシリアルドライバを使うのがよさそうです。

mbed のピンD-,D+を使う場合、vendor-id="7936"

Android USB Serial Monitor Lite では、p31 (D+), p32 (D-) and GNDを使った接続と、
実装されているusb どちらでも使うことができた。

USBSerial_HelloWorld と p31 (D+), p32 (D-) and GND 接続の場合



2014年2月12日水曜日

アンドロイドとmbedをUSBで繋げてみる。 :USB Host

mbedのUSBポートとアンドロイドをUSBホストケーブルで接続する。


使用アプリ:Android USB Serial Monitor Lite
使用ケーブル:エレコムのU2HS-MB02-4S

mbed側のプログラム

#include "mbed.h"
Serial pc(USBTX, USBRX); // tx:送信, rx:受信
void rxCallback()
{
pc.putc(pc.getc());
}
int main()
{
pc.attach(rxCallback, Serial::RxIrq);
while (1) {
pc.printf("Hello World!\n");
wait(0.5);
}
}
view raw main.c hosted with ❤ by GitHub
0.5秒毎にmbedからアンドロイドに、Hello Worldを送信、
アンドロイドから mbed に文字を送信したら、mbedは割り込みで受信して、
アンドロイドにその文字を送り返す。