グラフを描くには(grafica:導入とGPlotの利用)

◆PROCESSING 逆引きリファレンス

 カテゴリー:GUI

グラフを描くには(grafica:導入とGPlotの利用)

【概要】

プログラムでいろいろなデータを処理していると、時々データを使ってグラフを描きたくなることってありませんか?

そんな時は・・・Excelを使う!。はい、正解です(笑)。

でもプログラムを使って綺麗なグラフが描ければなぁという時、PROCESSINGで使えるグラフ描画用ライブラリーには以下のようなものがあります。

探せば、このほかにもまだ幾つか存在するようです。

今回はその中から手軽にグラフを描画できるgraficaを紹介したいと思います。graficaでは折れ線グラフ、棒グラフが描画できます。

なおgraficaはPROCESSING専用のライブラリーであるため、PROCESSING用のJarを組み込んでいないJava環境からは利用する事ができません。

純粋なJava環境でグラフを描画したい人や、より沢山の種類のグラフを描画したい人は、JFreeChart などの利用を検討すると良いでしょう。

graficaの使い方については、以下の4つに分けて解説したいと思います。

 

graficaをインストールする

標準エディタの場合

PROCESSINGの標準エディタを利用している人は、以下の手順で簡単にgraficaをインストールする事が可能です。

メニューで「ライブラリを追加」を選択

スケッチ->ライブラリをインポート->ライブラリを追加を選択します。

検索しインストールする

Contribution Manager 画面が開きます。Librariesタブに「grafica」と入力し、Installボタンを押下します。

2020/04現在、Ver1.9.1がインストールされます。
インストールが終わったら、標準エディタを再起動します。

 

IDEを利用している場合

PROCESSINGの開発にEclipseなどのIDEを利用している人は、以下の公式サイトから最新のJarファイルを入手して、PROCESSINGのJarファイルと共にあなたの開発環境に組み込んでください。

 

グラフを描く

graficaでは、デフォルトのグラフが折れ線グラフとなっています。

基本はsetup()関数の中で

  • グラフのベースとなるGPlotインスタンスを作成
  • GPlotにグラフ全体の描画位置、サイズ、軸などを設定
  • グラフ化するデータを登録するGPointsArrayインスタンスを作成
  • GPointsArrayにデータを登録
  • GPlotにGPointsArrayを関連付ける

という前処理を行います。

続いてdraw()関数の中で

  • GPlot描画開始(beginDraw)命令を記述
  • GPlot描画終了(endDraw)命令を記述
  • 2つの命令に挟む形で、描画したいもの(タイトルや軸、ライン、背景など)を描く命令を記述

します。

非常にシンプルなグラフ描画を行うプログラムは以下のようになります。以降は、これをベースに説明を行います。

<出力例>

 

前提知識

graficaで描くグラフの代表的な構成パーツは以下のようになっています。

赤文字は、それぞれ別の部品(クラス)として構成されています。

graficaのドキュメントは公式サイト からダウンロード可能なzipファイルに含まれるreference、またはPROCESSINGへインストールした際に作成されるreferenceを参照してください。

 

GPlotインスタンスを作成

まずはグラフのベースとなるGPlotインスタンスを作成します。

GPlotインスタンスを作成GPlot plot = GPlot(PApplet parent);
GPlot plot = GPlot(PApplet parent, float xPos, float yPos);
GPlot plot = GPlot(PApplet parent, float xPos, float yPos, float plotWidth, float plotHeight);

plot:GPlotインスタンス
parent:グラフ描画対象のPAppletを指定。通常は this
xPos:描画領域のX位置
yPos:描画領域のY位置
plotWidth:描画領域のXサイズ
plotHeight:描画領域のYサイズ

例えば、以下のように指定してGPlotを作成し場合

xPos/yPosに(0,0)を指定しても、必ず上下左右にデフォルトのマージン領域が確保されます。

plotWidthとplotHeightはグラフを描画する領域のサイズですが、上下左右に自動的に取られるデフォルトのマージン領域を含んだサイズとみなされます。

下図で言えば、青い枠の大きさを指定したことになります。


上記例の場合は
横=300 – (70 + 30) = 200
縦=300 – (40 + 60) = 200
が、実際のグラフ描画領域のサイズになります。

マージン領域のサイズは、デフォルトでは
上:40pixl
下:60pixl
左:70pixl
右:30pixl
が採用されます。

マージン領域の大きさは、後ほど紹介するsetMar命令で変更する事が可能です。

 

グラフ全体の設定を行う

作成したGPlotエリアには、グラフの描画に関する様々な設定を行うことが可能です。

以下に代表的な設定命令を紹介します。

GPlotの位置を設定void plot .setPos(float xPos, float yPos);

plot:GPlotインスタンス
xPos:描画領域のX位置
yPos:描画領域のY位置

setPos() 命令で位置の指定が可能です。ただしインスタンス生成時とは異なり、指定するのはPlotエリア全体の位置(下図赤枠の左上位置)になります。

<出力例>

 

グラフ描画領域の大きさを設定void plot .setDim(float xDim, float yDim);

plot:GPlotインスタンス
xDim:グラフ領域のXサイズ
yDim:グラフ領域のYサイズ

グラフ描画領域の大きさを指定します。こちらもインスタンス生成時とは異なり、上下左右のマージン領域を含まないサイズを設定します。

<出力例>

 

グラフ描画領域の背景色を設定void plot .setBoxBgColor(int boxColor);

plot:GPlotインスタンス
boxColor:背景色値。color()命令などで指定します

グラフ描画領域の背景色を指定します。デフォルトは白です。色はPROCESSING独自のcolor命令などで指定可能です。

<出力例>

 

マージン領域の大きさを設定void plot .setMar(float bottomMargin, float leftMargin, float topMargin, float rightMargin);

plot:GPlotインスタンス
bottomMargin:下マージン。デフォルトは60pixl
leftMargin:左マージン。デフォルトは70pixl
topMargin:上マージン。デフォルトは40pixl
rightMargin:右マージン。デフォルトは30pixl

GPlot領域内に占める上下左右のマージンエリアの大きさをセットします。マージンエリアには軸やタイトルが描画されますので、狭すぎると軸やタイトルが欠けることになるので注意してください。

<出力例>

 

 

軸を設定する

軸はGPlotにGAxisオブジェクトとして内包されています。

GPlotからGAxisオブジェクトを取り出して各種設定を行うことが可能です。またGPlotに対して、内包している軸への設定変更を直接指示する事も可能です。

以下はGPlotに対して設定できる、軸関連の代表的なメソッドです。

軸のメモリ範囲を設定void plot .setYLim(float lowerLim, float upperLim);
void plot .setXLim(float lowerLim, float upperLim);

plot:GPlotインスタンス
lowerLim:XまたはYのメモリ最小値
upperLim:XまたはYのメモリ最大値

XYの軸を描く際、メモリの最大最小値を設定します。

最大最小値は、通常はGPlotエリアにセットするデータに応じて自動的に決められますので、この命令は、あえて最大最小値を変更したい場合に利用します。

<出力例>

 

目盛線の長さを設定void plot .setTicksLength(float tickLength);

plot:GPlotインスタンス
tickLength:XY軸の目盛線の長さ

XY軸の目盛線の長さを指定します。XY軸別々に指定する事はできません。デフォルトの目盛線の長さは3pixlです。

<出力例>

 

目盛の数を設定void plot.setVerticalAxesNTicks(int nTicks);
void plot.setHorizontalAxesNTicks(int nTicks);

plot:GPlotインスタンス
nTicks:目盛の数

XY軸の目盛の数を設定します。デフォルトでは適当数の目盛が自動的に刻まれますが、本命令でXY方向の目盛の数を変更可能です。

setVerticalAxesNTicksでY軸、setHorizontalAxesNTicksでX軸の目盛の数を変更します。ただし(これはBUGなのか仕様なのか不明ですが)、指定した数+1個の目盛が割り振られることもあるようです(下記例のX軸参照)。

変更されると、その数に応じたステップ(刻み幅)で自動的に目盛りの値が割り振られます。

<出力例>

 

目盛の値を設定void plot.setVerticalAxesTicks(float[] ticks);
void plot.setHorizontalAxesTicks(float[] ticks);

plot:GPlotインスタンス
ticks:目盛の値

XY軸のメモリの値を設定します。先ほどの命令はXY軸のメモリの数を変更するものでしたが、本命令はメモリそのものの値を指定するものとなります。

setVerticalAxesTicksでY軸の目盛り値を、setHorizontalAxesTicksでX軸の目盛り値を指定します。

ただしデータの最小値、最大値を超える値を指定すると、該当値の目盛りが画面に描画されないことがあるので注意してください。

例では、Yは最小値が10、最大値が40、Xは最小値が10、最大値が30ですので、この範囲で目盛り値を指定します。

<出力例>

 

軸とグラフの距離を設定void plot.setAxesOffset(float offset);

plot:GPlotインスタンス
offset:距離

XY軸をグラフ描画エリアからどの程度離すかを設定します。XY軸で個別の設定はできません。

デフォルトではグラフと軸の距離は5pixlです。

距離を離しすぎると、描画領域から軸がはみ出して正しく表示されなくなるので注意してください。

<出力例>

 

点や線を装飾する

点の色を指定void plot.setPointColor(int pColor);

plot:GPlotインスタンス
pColor:点の色

グラフ上にプロットされる点の色を指定します。デフォルトの色は薄い赤(RGB = 251, 101, 101)です。

<出力例>

 

点の大きさを指定void plot.setPointSize(float size);

plot:GPlotインスタンス
size:点の大きさ

グラフ上にプロットされる点の大きさ(円の直径)を指定します。デフォルトの直径は6pixlです。

<出力例>

 

線の色を指定void plot.setLineColor(int lColor);

plot:GPlotインスタンス
lColor:線の色

グラフ上にプロットされる点を結ぶ線の色を指定します。デフォルトの色は灰色(RGB = 101, 101, 101)です。

<出力例>

 

線の幅を指定void plot.setLineWidth(float lWidth);

plot:GPlotインスタンス
lWidth:線の幅

グラフ上にプロットされる点を結ぶ線の幅を指定します。デフォルトの幅は1pixlです。

<出力例>

 

タイトルを設定する

タイトルを指定void plot.setTitleText(String title);

plot:GPlotインスタンス
title:タイトル文字列

グラフ描画領域の上にタイトルを設定します。タイトルの色や位置などの細かな設定は 、GPlotクラスが持つGTitleオブジェクトに対して行います。

詳しくは「グラフを描くには(grafica:GTitleの利用)」で触れたいと思います。

<出力例>

 

データを登録する

グラフを描くためには、対象となるデータが必要ですね(当たり前)。

データはGPointクラスのインスタンスとして作成して、GPlotに関連付けます。

GPointを作成するGPoint p = new GPoint( float x, float y );
GPoint p = new GPoint(PVector v);

p:GPointインスタンス
x、y:登録対象データ
v:登録対象データ

GPointインスタンス作成時に、対象データを与えます。データは直指定でもOKですし、PVector型のインスタンスとして与えてもOKです。
.

GPointを作成するvoid plot.addPoint( GPoint newPoint );
void plot.addPoint( int index, GPoint newPoint );

plot:GPlotインスタンス
newPoint :GPointインスタンス
index:0から始まるデータペアの位置

作成したGPointをGPlotに関連付けます。

関連付ける時に「番号(index)」を指定してデータの順番を指定する事が可能です。

indexは0から始まります。飛越しでの指定(例:データをGPlotに1つしか関連付けていないのに、indexに2(3番め)を指定する等)は例外エラーとなりますので注意してください。

上記でp3は、本来index=2番目になりますが、1を与えることでp2の前に挿入しています。

<出力例>

 

データを関連付けるvoid plot.addPoint( float x, float y );
void plot.addPoint( int index, float x, float y );

plot:GPlotインスタンス
x、y:登録対象データ
index:0から始まるデータペアの位置

わざわざGPointを作らなくても、GPlotに直接データを登録することも可能です。

先程の場合と同じように、indexでデータの順番を指定する事も可能です。

<出力例>

 

GPointsArrayを利用するGPointsArray data = new GPointsArray();
GPointsArray data = new GPointsArray( float[] xs, float[] ys );
void data.add( float x, float y );
void data.add( float[] xs, float[] ys );

data:GPointsArrayインスタンス
x、y:登録対象データ
xs、ys:登録対象データの配列

データが複数ある場合(通常は、ありますよね)は、GPointsArrayクラスのインスタンスを作成してデータをArrayに追加するのが便利です。

データは1つずつaddメソッドで追加する事も可能ですし、float型の配列にまとめておいて登録する事も可能です。

ただし配列を使う場合は、XとYの配列の要素数(データの数)は一致させておく必要があります。

<出力例>

 

グラフを描く

描画開始・終了void plot.beginDraw();
void plot.endDraw();

plot:GPlotインスタンス

グラフの描画命令はdraw()関数の中に記述します。

かならずGPlotクラスのbeginDrawメソッドとendDrawメソッドの間に、挟むようにして記述します。

beginDrawメソッドとendDrawメソッドだけでは、グラフは描画されません。

グラフを描画する代表的な命令は以下になります。すべてGPlotクラスのメソッドです。

メソッド 機能
1 void plot.drawBox() BOX領域を描画します
2 void plot.drawPoints() 点を描画します
3 void plot.drawLines() 線を描画します
4 void plot.drawXAxis() X軸を描画します
5 void plot.drawYAxis() Y軸を描画します
6 void plot.drawRightAxis() BOXの右側に軸を描画します
7 void plot.drawTopAxis() BOXの上側に軸を描画します
8 void plot.drawTitle() BOXのタイトルを描画します

これ以外にも、いくつかの描画命令があります。

グラフ(BOX領域)の右側と上側に軸を描く場合は、各軸に目盛りとなる値と目盛りの描画指示を行う必要があります。軸については「グラフを描くには(grafica:GAxisの利用)」で触れたいと思います。

 

【関連記事】

 


サンプルプログラム

ちょっとしたグラフ例:

ちょっとしたグラフを描くサンプルです。背景画像を入れて、少し見栄えが良いように調整しました。

まだ説明していない命令を使っていますが、詳しくは「グラフを描くには(grafica:GAxisの利用)」で触れたいと思います。

<出力サンプル>


(画像URL:illust-AC 様:そげさん)

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。