jqPlotのチャート(Javascript)部分

jqPlotのチャート

まずは、棒グラフ

HTMLファイルで

<script src="js/jqplot/plugins/jqplot.barReaderer.min.js"></script>
<script src="js/jqplot/plugins/jqplot.categoryAxisReaderer.js"></script>

で必要なライブラリーの読みこみ

jqplot.barReaderer.min.js
は、棒グラフの表示

jqplot.categoryAxisReaderer.js
は、横軸にカテゴリ表示

次に
HTMLファイルで

<div id="barchart"></div>

でグラフの表示領域を指定

例えば、利益と売上を棒グラフにするなら、Javascriptは


//棒グラフのデータ
var bardata = [
[10,20,50,30],   //売上
[2,4,5,6]  //利益
];

var opts = {
title:'業績',

//オプションの定義で、グラフのレンダラを棒グラフを描画する $.jqplot.BarReadererに指定
seriesDefaults:{
renderer:$.jqplot.BarReaderer,
},

//グラフの凡例の設定
series:{
{label:'売上'},
{label:'利益'},
},

legend:{
show:true,
location:'ne',
},

//横軸になるxaxisのレンダラ
//$.jqplot.CategoryAxisReadererを指定して、カテゴリ表示
axes:{
xaxis:{
renderer: $.jqplot.CategoryAxisReaderer,

//カテゴリ名表示
ticks:['2010','2011','2012','2013'],
}
}
};

$(document).on("pageshow","#barchart",function(e){
barplot = $,jqplot("barchart",data,opts);
});

となる

Google Chart Toolsみたいに積み上げ表示も可能で

stackSeriesオプションを使えば
グラフを積み上げて表示できる
積み上げグラフにするなら

棒グラフの設定へ
stackSeries:true
を追加する

場所は
title:’業績’,
の下あたり

ソースにすると

var opts = {
title:'業績',
stackSeries:true,
seriesDefaults:{

}
}

というようになる

jqPlotのチャート

jqPlotのチャート

まずは、棒グラフ

HTMLファイルで

<script src="js/jqplot/plugins/jqplot.barReaderer.min.js"></script>
<script src="js/jqplot/plugins/jqplot.categoryAxisReaderer.js"></script>

で必要なライブラリーの読みこみ

jqplot.barReaderer.min.js
は、棒グラフの表示

jqplot.categoryAxisReaderer.js
は、横軸にカテゴリ表示

今回は、棒グラフのレンダラだけど
他にも
バブルチャートなら
jqplot.bubbleReaderer

ろくそくなら
jqplot.onlcReaderer

円グラフなら
jqplot.pieReaderer

メーターなら
jqplot.meterGaugeReaderer

ピラミッドなら
jqplot.pyramidReaderer

ブロックグラフなら
jqplot.blockReaderer

ペジェ曲線なら
jqplot.BezierCurveReaderer

ドーナツグラフなら
jqplot.donutsReaderer

となる
これらは、カテゴリ軸を利用するときのレンダラで

その他の軸のレンダラとしては

カテゴリ軸なら
jqplot.categoryAxisReaderer

日付軸なら
jqplot.dataAxisReaderer

対数軸なら
jqplot.logAxisReaderer

目盛りカスタマイズなら
jqplot.canvasAxisTrickReaderer

軸ラベルカスタマイズなら
jqplot.canvasAxisLabelReaderer

ピラミッド軸なら
jqplot.pyramidAxisReaderer

になる

軸のレンダラは、棒グラフ以外でも使えるけど
ピラミッド軸は、人口ピラミッドなどに使う pyramidReadererと組み合わせる

円グラフなどの場合
軸はないため、軸関係のレンダラは使えない

jqPlotとオプション

jqPlotのデータとオプションについて

オプションは

var opts={


};

まずは、タイトルの表示

title:'グラフタイトル',

この部分でタイトルを設定
これを省くとタイトルがなくなる

次に、データのラベル情報
これは、seriesで定義する


series:{
{
label:'データ1',
showMarker:false
},
{
label:'データ2',
showMarker:trueand
};

},

最初のハッシユの
{
label:’データ1′,
showMarker:false
},
は、1つめのデータに対する情報

2つめのハッシユの
{
label:’データ2′,
showMarker:true
};
は、2つめのデータに対する情報

showMarkerは、trueにすると
データのところにマーカーが表示される
falseなら、マーカーは非表示になる

マーカーは、折れ線グラフなら点がでる

次に、凡例の表示について
凡例は使い方とかを箇条書きにしたもの

凡例の表示は、legendでコントロールする

legend:{
show:true,
location:'ne',
}

show:falseにすると非表示になる
locationは、表示位置で、方角で書く
nなら Northなので北
neなら North Eastで北東
nwなら North West で北西
e なら East で東
se なら South East で南東
s なら Southで南
sw なら South West で南西
w なら West で西
となる

スマートフォンだと画面が小さいため
複数のグラフを並べると表示領域が小さくなり
スクロールしないとグラフが見れなくなってしまう

このため、凡例をグラフの上側に表示して確認しやすくする

見た目を考えれば、ne か nwあたり

次に、軸と目盛りの制限

軸は axesで設定
xaxisで X軸、yaxisでY軸を設定する

また、
labelReadererへ
$.jqplot.CanvasAxisLabelReaderer
を設定するとラベルの設定ができるようになる

グラフの目盛りの設定ができるようにするには
tickReadererへ
$.jqplot.CanvasAxisTickReaderer
を設定する

これにより
min:
で目盛りの最小値

max:
で目盛りの最大値

tickInterval:
で目盛りの幅を設定する

min:0,
max:100,
tickInterval:10
なら
0~100の目盛りで
目盛りは10,20,30 … というようになる

あと、目盛りのテキストを斜めに傾けたりするデザインにするなら
tickOptions:{angle:角度}
で設定できる

例えば
tickOptions:{angle:-30}

これらを使い、経済指標とかだしたいのなら

axes:{

xaxis:{
label:'雇用統計',
labelReaderer:$.jqplot.CanvasAxisLabelReaderer,
tickReaderer:$.jqplot.CanvasAxisTickReaderer,
tickOptions:{angle:-30}
},

yaxis:{
label:'2013年',
labelReaderer:$.jqplot.CanvasAxisLabelReaderer,
tickReaderer:$.jqplot.CanvasAxisTickReaderer,

}

}

Google Maps Android API v2 のmeta-data でハマる

Google Maps Android API v2
で地図を表示しようとしたものの
地図がでずエラーがでるので調べた結果

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="apiキー"
            />
        <meta-data 
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

を書く場所を間違えていたことが判明

本来、application タグの中に書くけど
間違えて
manifest タグの中に書いていたためエラーとなりました

eclipseのメモリ割り当て変更

eclipse で Android のアプリ開発で実行しようとすると
最近頻繁にエラーになるので

Eclipse.ini の設定を変更し、パフォーマンス改善しよう
を参考に
割り当てメモリを変更

cd eclipse
vim eclipse.ini
でファイルを開き

-Xms40m
-Xmx512m
となっている部分を変更します

-Xms40m
は起動時に確保するメモリ量

-Xmx512m
はeclipse が使用する最大のメモリ量

搭載しているメモリは8GB あるので
もっと領域を増やしてみました

-Xms2048m
-Xmx2048m

へ変更し保存

これでしばらくは問題なさそうです

debugキーで Google Maps Android API v2 キー取得

debugキーで Google Maps Android API v2 キー取得

まずはデバッグキーで証明書のフィンガプリントを取得
デバッグキーと自分のキーとの違いは
リリースできるかどうかなので
最初はデバッグキーで十分

最初から公開するためにデバッグでないほうをやろうとするとマップがでなくて挫折したりするので
最初はデバッグキーでやりましょう

keytool -list -v -keystore .android/debug.keystore -alias androiddebugkey -storepass android -keypass android

を実行すると証明書の フィンガープリントがでるので
SHA1 のほうをコピーしておく

Google API Console にアクセスして

すでに地図API key を取得したことがあるのなら
create new Android key …
をクリック

そして
SHAの値: パッケージ名
というように入力し
Create をクリック

サンプルとしては

45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

みたいに入力する

v1 のときには API キーを使いまわしできたけど
v2 になってからはアプリごとに取得するので面倒

ちなみにすでに v1 のキー取得はできないので
v2 対応の情報でみることが必要になります

取得に参考にしたのは
Google Maps Android API v2キーの取得


を参考にしました

jqPlotをjQueryMobileで使うときのポイント

jqPlotをjQueryMobileで使うときのポイント

jqPlotをjQueryMobileで使うときには
グラフ作成のタイミングが重要になる

グラフを表示したいページに
pageshowイベントで
$.jqplotを呼び出すことでグラフを描画する
グラフが表示されないときには、呼び出すイベントに注目

$(document).on("pageshow","#chartbasic",function(e){
  plot = $.jqplot("chart",data,opts);
});

#chartbasicは
data-role=”page” id=”chartbasic”
で、表示するページのid

次の注意点として、パソコンと違いスマートフォンでは、画面が横向になる
デフォルトだと
横向になるとグラフが画面からはみ出たり
横が余る
これを防止するには
端末の向きが横向になると発生するイベント
orientationchangeイベントを検出したら
グラフを再描画するようにする

$(window).on(""orientationchange",function(e){
plot.replot();
});

また、端末の向きの変更でグラフの再描画をしたときに
ブラウザーのウインドウの幅と高さが
画面の幅と高さと
あっていないと
これも、グラフがはみ出たり、横が余る

この対処としては
viewportの設定をすることで解決する
ほとんどのスマートフォン向けWebアプリではこれを付けることも多い

<meta name="viewport"  content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>

あと、重要なのが
別のページに行ったときに、jQueryMobileは現在のページのDOM情報を保持したまま
別ページ遷移する

このため、もう一度同じページに戻ると
再びグラフ描画が実行され
2つのグラフが描画されてしまい
レイアウトが崩れる

この対策としては、
別のページに遷移した後にグラフを削除しておく

$(document).on("pagehide","#chartbasic",function(e){
  plot.destroy();
});

チャートライブラリー jqPlot

チャートライブラリー jqPlot

jqPlotは無料のチャートライブラリーで
株価チャートなども扱える

ライセンスはGPL ver2になり
商用プロダクトやオープンソースで使える

http://www.jqplot.com
からダウンロードできる

ダウンロードしたら解凍し
この中で使うのは
jquery.jqplot.min.js
jquery.jqplot.min.css
pluginフォルダー

まずは簡単なグラフから
jqPlotは、プラグインを組み合わせて
グラフの描画をする

プラグインは
レンダラと呼ばれるグラフや
線を描画するプラグインと

その他のプラグインがある
チャート用のレンダラには
棒グラフ、円グラフを担当

軸ラベル用のレンダラは、x,y軸を担当

メモり用のレンダラは、日付、対数、斜め描画を担当

その他のプラグインでは、
ズーム、値の表示、トレンド線などを担当する

jqPlotでは、これらのプラグインを組み合わせて、いろいろなグラフを描画する

簡単な線を書くには
まず、HTMLファイルで

<link rel="stylesheet" href="js/jqplot/jquery.jqplot.min.css">
<script src="js/jquery.jqplot.min.js"></script>
<script src="js/jqplot/plugins/jqplot.canvasTextReaderer.min.js"></script>
<script src="js/jqplot/plugins/jqplot.canvasAxisLabelReaderer.min.js"></script>
<script src="js/jqplot/plugins/jqplot.curssor.min.js"></script>
<script src="js/jqplot/plugins/jqplot.mobile.min.js"></script>
<script src="js/jqplot/plugins/custom-basicchart.js"></script>

で必要なライブラリーを読み込む

表示領域については

<div data-role="page" id="chartbasic">
<div data-role="header">
<h1>jqPlotの基本</h1>
</div>
<div data-role="content">
<div id="chart"></div>
</div>
</div>

となる

Javascript部分は
custom-basicchart.jsで書く
var data = [
[[1,1],[2,2],[3,5],[4,2],[5,4]], //データ1
[[1,6],[2,4],[3,3],[4,4],[5,5]] //データ2
];

//プラグインの有効化
$.jqplot.configenablePlugins = true;

var opts={
title:’グラフタイトル’,

series:[
{label:’データ1′,
showMarker:false},
{label:’データ2′,
showMarker:false},
],

legend:{
show:true;
location:’ne’,
},

xaxis:{
label:’x軸ラベル’,
labelReaderer:$.jqplot.CanvasAxisLabelReaderer,
tickReaderer:$.jqplot.CanvasAxisTickReaderer,
tickOptions:{angle- 30}
},

yaxis:{
label:’y軸ラベル’,
labelReaderer:$.jqplot.CanvasAxisLabelReaderer,
tickReaderer:$.jqplot.CanvasAxisTickReaderer,
}
},
cursor:{zoom:true}
};

$(document).on(“pageshow”,”#chartbasic”,function(e){
plot = $.jqplot(“chart”,data,opts);
});

$(window).on(“orientationchange”,function(e){
plot.replot();
});

$(document).on(“pagehide”,”#chartbasic”,function(e){
plot.destroy();
});

なんとなく書き方はGoogle chart に似ている

では、解説
まず、スタイルの
jquery.jqplot.min.css

jqPlot本体になる
jquery.jqplot.min.js

そして、プラグインの
jqplot.xxx
で始まるプラグインを読み込む

ここで軸とか目盛りのカスタマイズに必要なプラグインを読み込んでいる

スマートフォンで利用するときに便利なプラグインとして
jqplot.cursor
jqplot.mobile
を入れておく

これは、スマートフォンだと
グラフの描画領域が狭くなるけど
この2つのプラグインを入れることで
グラフをタッチしてなぞると指定領域の拡大表示が可能になる

次に、jqplotでのグラフ作成

処理のJavascriptは

$.jqplot.config.enablePlugins = true;

plot = $.jqplot("chart",data,opts);

描画領域は

<div id="chart"></div>

となる

$.jqplot.config.enablePlugins
は、プラグインの利用設定
これは、ほとんどの場合プラグインは使うから true

plot = $.jqplot(“chart”,data,opts);

一番目の引数の
“chart”は、グラフを描画する要素のid
つまり、今回なら

<div id="chart"></div>

で id=”chart”になっているから

2番目の引数はデータ
3番目の引数はオプションになる

カメラで撮った写真のアップロード

カメラで撮った写真のアップロード

Androidでは、Webブラウザーで
input要素へ type=”file” を指定することで
ファイルアップロードが可能

これを使うことで、写真を撮って、アップロードすることができる

また、accept=””の設定で
アップロードするファイルも指定することができる

アップロードには、HTMLでファイルをアップロードするマルチパートを使う

注意点としては、formの中で
data-ajax=”false”
にすること

理由は、jQueryMobileがAjax通信しているため
enctype=”multipart/form-data”
を指定したマルチパート形式でファイルのアップロードができないから

ソースにすると

<form action="upload.php" method="post" enctype="multipart/form-data" data-ajax="false" data-role="fieldcontain">
<label for="photo">写真</label>
<input type="file" name="photo" id="photo"></input>
<input type="submit" value="upload">
</form>

これでもアップロードはできるけど、
ファイルの種類制限がないので、実は写真意外のアップロードも可能

セキュリティーも考えれば、不必要なファイルは良くないので
accept=”” でファイルの種類制限をかける

accept=”image/*”にすることで
画像ファイルのみ選択可能になり
カメラで撮影した写真も対象になる

ということで、ソースの修正

<form action="upload.php" method="post" enctype="multipart/form-data" data-ajax="false" data-role="fieldcontain">
<label for="photo">写真</label>
<input type="file" accept="image/*" name="photo" id="photo"></input>
<input type="submit" value="upload">
</form>

ちなみに、accept=””で指定できるのは

image/*
画像ファイル、もしくはカメラから撮影

audio/*
音声ファイル、もしくはマイクから録音

video/*
動画ファイル、もしくはカメラから撮影

より高度なPhotoSwipeの使い方

より高度なPhotoSwipeの使い方

デフォルトでは、1画面に3つまでサムネイル画像を並べて表示になる

でも、画像一覧には全然足りない

そんなときには
PhotoSwipeの
jquery-mobile.css
を編集する

デフォルトでは、

$.gallery li{float:left; width:33.33333%;}
$.gallery.li a{display:block; margin:5px; border:1px solid #3c3c3c}

これを

$.gallery li{float:left; width:20%;}
$.gallery li a{display:block; margin:2px; border:1px solid #3c3c3c;}

にする

これで、5列表示できる
marginの設定はなくても5列になるけど
この値を変更することで
サムネイル画像の間隔を変更できる

スライドショーの画像の間隔も変更可能

デフォルトの間隔は20px
間隔を0にすると、本みたいになる

var opts = {margin:0};

photoSwipeInstance = $("ul.gallery a", e.target).photoSwipe(opts,currentPage.attr('id'));

次に、自動スライドショーにする方法
デフォルトでは、画面をスワイプしないと次の画像はでない
自動スライドショーにしたいのなら
autoStartSlideshowオプションをつける
これにより、ギャラリー一覧が作れる

var opts = {autoStartSlideshow:true};

写真のサイトなので、画像のズームを無効化したいのなら
allowUserZoomをfalseにすれば設定できる

var opts ={allowUserZoom: false};

ズーム禁止じゃなくて、ズームレベルの制限をすることも可能
デフォルトだと
0.5~5倍のズームになっている
最小値は minUserZoom
最大値は maxUserZoom
で指定する

もし、等倍から倍までの制限をかけるなら

var opts = {minUserZoom:1,maxUserZoom:2};

となる

そして、あとはループの制御
デフォルトでは、最後までいったら最初にループして戻る
ギャラリーとかサンプル画面表示とかなら問題ないけど、マンガアプリとか
なんらかのコンテンツの場合なら
最後までいったらループはしない

ループさせたくないのなら
loop を falseへ設定する

var opts = {loop: false};