本ページでは拙作のjavascriptライブラリ「SVGGraph.js」の紹介,及び使い方について説明します.
手っ取り早く試してみたい方はこちら.
はじめに
これは何?
本スクリプトSVGGraph.jsはwebブラウザ上に2次元グラフを描画するためのものです.jQueryと言ったライブラリと同様に,html文書に組み込むことで簡単にグラフ出力が得られます.
具体的に例を見てみましょう.ここではサインカーブを描いています.これをjavascriptで出力するとなると見た目と裏腹に非常に面倒なのですが…
横のテキストボックスの内容がこのグラフを描くために記述したスクリプトで,たった4つのコマンドだけで完了しています.また,javascriptよりも柔軟な関数記述ができるため,内容がより判りやすくなっています.
このように本スクリプトは関数グラフの描画支援ツールと言った色合いが濃く,主に数学の学習・教育目的での利用を想定しています.gnuplot等の専門のグラフ作成ツールに比べれば機能的に劣りますが,html文書に埋め込み可能なグラフであり手軽に試すことが出来ると言ったメリットがあります.
特徴と機能
以下に本スクリプトの特徴について示します.
- 完全にクライアントサイドでの動作
本スクリプトはクライアント(ブラウザ)サイドで動作するjavascriptで記述されているため,特別な環境がなくともブラウザだけで試せます.従ってデスクトップツールとしても利用可能です. - svgによるグラフ出力
グラフの描画処理にsvg(Scalable Vector Graphics)を利用しているので,画面表示時のみならず,印刷出力時にも優れた品質が得られます. - 優れた可読性
グラフの描画位置に直接スクリプトを記述することが出来ます.文脈中にどのようなグラフが挿入されているかが一目瞭然であるため,内容の管理が容易です.また,グラフの描画に必要となる記述はごく僅かで,どのような処理を行っているか理解が容易です. - コードの再利用性
頻繁に使うコードをマクロとして別ファイルにまとめることが出来ます.これにより,複数の文書に横断的に同じコードを挿入すると言ったことが出来ます. - 他のモジュールと連携可能
本スクリプトは既存の環境をほとんど汚さないため,他のjavascriptモジュールと組み合わせても安全に利用できます. - グラフ操作のためのUIの自動生成
少ない作業でグラフを操作するためのインターフェースを自動生成します.必要な機能はひと通り揃っているため,インタラクティブなwebグラフを導入するのに最適です. - 出力結果の再利用性
出来上がったグラフをsvg画像ファイルとして出力し,他のアプリケーションで再利用する事が出来ます.
とにかく一度作ってしまえば様々な用途に繰り返し再利用できる事を念頭に置いています.
以下に本スクリプトの主な機能について列挙します.
- グラフ用に定義したsvg要素に直接スクリプトを記述可能.
- マクロとしてコードの再利用が可能.
- グラフの数軸・格子の出力.
- 基本図形(円,楕円,円弧,折れ線,矩形),文字列の出力.マーカーの出力.
- 関数グラフ(y=f(x)形式,媒介変数形式)の出力が可能.
- 利用可能な数学関数の拡張(sinh,cosh等).
- スクリプトのパラメータ化が可能.
- グラフのアニメーション化が可能.
- マウスカーソルの位置の取得機能.
- 簡易GUI生成機能.
- グラフ画像の外部出力機能.
- 既存のsvg要素との連携が可能
- ライセンスを気にせずカスタマイズが可能
逆に棒グラフや円グラフなどの入力ソースが統計量といったもののグラフ化・可視化を行うのは苦手です.このような用途にはd3.jsを選択したほうが良いでしょう.
動作環境
本スクリプトはHTML5をサポートしているwebブラウザ上で動作します.従って現行ブラウザ(firefox, chrome, opera, safari, ie9+…)であれば概ね動作することでしょう.
※動作検証はfirefox及びchromeでのみ行っています.
HTML5をサポートしていないie8以前の環境,及び古いandroidブラウザでは動作しません.
スクリプトのダウンロードとライセンス等
スクリプトファイルはこちらからダウンロードしてください.
本スクリプトはMITライセンスの元に無償での利用・配布が許諾されます.
本スクリプトの内容は告知なく変更・改変される事があります.予めご了承ください.
本スクリプトを作成するにあたり,同様の機能を提供しているPeter Jipsen氏のASCIIsvg.jsよりアイディアを得ていますが,ソースコードそのものは1から作りなおしています.従って機能的にはほぼASCIIsvg.jsの内容を網羅しているはずですが,完全な互換性を持っているわけではありません.
なお,氏のスクリプトではie+adobe svg viewerでの動作が行えるため,環境によって使い分けると良いでしょう.(軽く触った限り現行ブラウザにおいてもある程度動作しているようです.)
動作サンプル
本スクリプトの動作デモページを作りました.どのような機能を持っているかについてはこちらを参考としてください.
実際に使ってみる
動作までの流れ
html文書からSVGGraph.jsを利用するには下記の手順を踏みます.
- SVGGraph.jsを配置する
- SVGGraph.jsを読み込む
- グラフを出力したい位置にsvg要素を配置する
- svg要素のscript属性にスクリプトを記述する
この作業を全て終えたhtml文書をwebブラウザで開くとSVGGraph.jsが自動的にsvg要素の部分にグラフを描画します.
(1)SVGGraph.jsを配置する
まず最初に行うこととしてスクリプト本体をダウンロードし,グラフを挿入したいhtml文書と同じ場所(フォルダ)に保存します.
(2)SVGGraph.jsを読み込む
グラフを挿入したいhtml文書をテキストエディタ等で開き,下記のようにhead要素の配下にscript要素を配置します.
※詳しくはhtml専門の説明サイトをご覧ください.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>関数グラフ描画スクリプト・SVGGraph.js</title>
<script src="SVGGraph.js"></script>
</head>
<body>
・・・以下文書が続く
(3)グラフを出力したい位置にsvg要素を配置する
html文書の中身を編集し,グラフを挿入したい位置にsvg要素を追加します.例えば次のように記述します.
<p>具体的に例を見てみましょう.ここではサインカーブを描いています.
これをjavascriptで出力するとなると見た目と裏腹に非常に面倒なのですが…</p>
<svg width="200" height="200"/>
<p>横のテキストボックスの内容がこのグラフを描くために記述したスクリプトで,
たった4つのコマンドだけで完了していることがわかります.
また,javascriptよりも柔軟な関数記述を可能としているため,
グラフに表示している関数の内容が非常に判りやすくなっています.</p>
ここでwidth="200" height="200"
はグラフの描画領域のサイズが幅200ピクセル,高さ200ピクセルであることを示します.記述しなかった場合,グラフが正しい大きさとなりません.
(4)svg要素のscript属性にスクリプトを記述する
上で記述したsvg要素に更にscript属性を追加します.例えば次のように記述します.
<svg width="200" height="200" script="
setRange(-6,6,-6,6);
axis('full',2,2,0,0);
style.stroke = 'blue';
plot('3cos(x)');"/>
この状態でhtmlファイルを保存し,改めてwebブラウザでこのhtmlファイルを開いてみましょう.次のようなグラフが表示されたら成功です.
※何も起こらない場合は,webブラウザでのjavascriptの実行が拒否されていないか確認してください.
記述にエラーがあった場合
script属性の内容に問題があった場合は,次のようにエラーメッセージが表示されますので,その内容に従い適宜スクリプトを修正しましょう.
これで基本的な利用方法についての説明は終わりです.以下,利用可能なコマンドについて例を踏まえて解説しますので,実際に試してみてください.
補足)事前にsvgグラフィックを用意しておく
svgの知識が有る方は,このグラフに相当するsvg要素に直接図形を描画するためのコードを記述することも出来ます.この例では予め背景に格子画像を挿入しておき,その上にグラフを描いています.
<svg width="200" height="200" script="setRange(-6,6,-6,6);
plot('3cos(x)');" mode="xs">
<image xlink:href="background.svg" x="0" y="0" width="100%" height="100%"/>
<text x="0" y="195">このテキストはsvg要素に直接記述しています.</text>
</svg>
また,svg要素を入れ子にすることも出来ます.既存のsvg画像にグラフを挿入する際に便利です.
<svg>
<svg x="5" y="5" width="95" height="95" script="
setRange(-6,6,-6,6);
axis('full', 1, 1);
plot('3sin(x)');"/>
<rect x="5" y="5" width="95" height="95" fill="none" stroke="black" stroke-width="1"/>
<svg x="100" y="100" width="95" height="95" script="
setRange(-6,6,-6,6);
axis('full', 1, 1);
plot('3cos(x)');" mode="sli"/>
<rect x="100" y="100" width="95" height="95" fill="none" stroke="black" stroke-width="1"/>
</svg>
<svg>
<svg x="5" y="5" width="95" height="95" script="
setRange(-6,6,-6,6);
axis('full', 1, 1);
plot('3sin(x)');"></svg>
<rect x="5" y="5" width="95" height="95" fill="none" stroke="black" stroke-width="1"/>
<svg x="100" y="100" width="95" height="95" script="
setRange(-6,6,-6,6);
axis('full', 1, 1);
plot('3cos(x)');" mode="sli"></svg>
<rect x="100" y="100" width="95" height="95" fill="none" stroke="black" stroke-width="1"/>
</svg>
基本コマンド
本セクションではグラフを描画する上で基本となる機能について解説します.何れもスクリプトコード内部で呼び出すことが出来,様々なグラフを描くことが可能となります.
グラフ設定に関わるコマンド
これらのコマンドはグラフを描く上で最初に実行すべきもので,非常に大切なものです.
setRangeコマンド
setRangeコマンドはグラフの描画範囲を定義します.
- setRange(minX, maxX, minY, maxY)
- minX:x軸の最小値(グラフ左端の値)を指定します.
- maxX:x軸の最大値(グラフ右端の値)を指定します.
- minY:y軸の最小値(グラフ下端の値)を指定します.
- maxY:y軸の最大値(グラフ上端の値)を指定します.
例を示します.
setRangeAsRectコマンド
setRangeAsRectコマンドはグラフの描画領域を起点と幅,高さで定義します.setRangeか本コマンドの内,使いやすい方を使いましょう.
- setRangeAsRect(x, y, width, height)
- x:グラフの左下点のx座標を指定します.
- y:グラフの左下点のy座標を指定します.
- width:グラフの(内部的な)幅を指定します.
- height:グラフの(内部的な)高さを指定します.
先ほどの例をsetRangeAsRectコマンドで書き換えると次のようになります.
axisコマンド
axisコマンドはグラフのx軸,y軸を出力します.また,軸ごとに格子を引くことができます.スクリプト記述内部で一度だけ有効です.
- axis(gridType, dx, dy, skipX, skipY)
- gridType:格子の種類[short(短く),full(長く),dashed(点線)]の何れかを指定します.(省略可)
- dx:x軸方向の格子目盛の幅を指定します.(省略可)
- dy:y軸方向の格子目盛の幅を指定します.(省略可)
- skipX:x軸方向の数値インデックスを何本毎に出力するかを指定します.(省略可)
- skipY:y軸方向の数値インデックスを何本毎に出力するかを指定します.(省略可)
distanceコマンド
distanceコマンドは原点からの距離に相当する同心円を描画します.スクリプト記述内部で一度だけ有効です.
- distance(gridType, d, max, skip)
- gridType:格子の種類[full(長く),dashed(点線)]の何れかを指定します.(省略可)
- d:同心円の単位半径
- max:同心円を引く最大値
- skip:インデックスを何本毎に出力するかを指定します.
titleコマンド
titleコマンドは作成したsvgグラフにタイトルを付けます.
- title(str)
- str:タイトルに設定したい文字列を指定します.
descコマンド
descコマンドは作成したsvgグラフに注釈を付けます.
- desc(str)
- str:注釈に設定したい文字列を指定します.
基本図形の描画に関わるコマンド
以下のコマンドはグラフを装飾するための図形を描画するもので,図形の座標位置を直接指定することが出来ます.
lineコマンド,ilineコマンド,hlineコマンド
lineコマンドは始点から終点への線分を引きます.
- line(x1, y1, x2, y2, markerStart, markerEnd)
- x1:始点のx座標を指定します.
- y1:始点のy座標を指定します.
- x2:終点のx座標を指定します.
- y2:終点のy座標を指定します.
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
iline(infinite line)コマンドは始点と終点を通る(無限)直線を引きます.
- iline(x1, y1, x2, y2)
- x1:始点のx座標を指定します.
- y1:始点のy座標を指定します.
- x2:終点のx座標を指定します.
- y2:終点のy座標を指定します.
hline(harf line)コマンドは始点から終点方向への半直線を引きます.
- hline(x1, y1, x2, y2, markerStart)
- x1:始点のx座標を指定します.
- y1:始点のy座標を指定します.
- x2:終点のx座標を指定します.
- y2:終点のy座標を指定します.
- markerStart:始点に対するマーカーを指定します.(省略可)
slopeコマンド,islopeコマンド,hslopeコマンド
slopeコマンドは始点から指定した角度,距離までの線分を引きます.
- slope(x, y, rad, length, markerStart, markerEnd)
- x:始点のx座標を指定します.
- y:始点のy座標を指定します.
- deg:線分の傾きをラジアンで指定します.
- length:線分の長さを指定します.
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
islopeコマンドは始点を通り,x軸と指定した角を為す直線を引きます.
- islope(x, y, deg)
- x:始点のx座標を指定します.
- y:始点のy座標を指定します.
- rad:直線の傾きをラジアンで指定します.
hslopeコマンドは始点から指定した角度に向かった半直線を引きます.
- slope(x, y, deg, length, markerStart)
- x:始点のx座標を指定します.
- y:始点のy座標を指定します.
- rad:半直線の向きをラジアンで指定します.
- markerStart:始点に対するマーカーを指定します.(省略可)
horizonコマンド,verticalコマンド
horizonコマンドは水平線を,verticalコマンドは垂直線を描画します.
- horizon(y)
- y:水平線を引くy座標.
- vertical(x)
- x:垂直線を引くx座標.
pathコマンド
pathコマンドは指定した座標のリストを元に折れ線を引きます.
- path(points, isClosed, markerStart, markerEnd)
- points:折れ線の頂点座標をリストとして渡します.
例)[[-8,-8],[8,-8],[-2,0]] - isClosed:折れ線を自動的に閉じるかどうか指定します.[true(閉じる),false(何もしない)]
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
turtleコマンド
turtleコマンドはタートルグラフィックを描画します.タートルグラフィックでは,始点からの方向(の増分)と距離のペアのリストを与えることでパスを表現します.
- turtle(x, y, commands, isClosed, markerStart, markerEnd)
- x:パスの始点
- y:パスの終点
- commands:方向の増分値と距離のペアのリスト.
例)[[m.PI/3,2],[m.PI/6,3],[m.PI/8,4]] - isClosed:折れ線を自動的に閉じるかどうか指定します.[true(閉じる),false(何もしない)]
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
commandの書式を[角度,距離,繰り返す回数,距離の増減値]
とすることで,同じコマンドを繰り返すことが出来ます.
circleコマンド
circleコマンドは指定した座標を中心に円を描画します.
- circle(cx, cy, r)
- cx:円の中心x座標を指定します.
- cy:円の中心y座標を指定します.
- r:円の半径を指定します.(x軸方向のサイズで解釈されます)
ellipseコマンド
ellipseコマンドは指定した座標を中心に楕円を描画します.circleコマンドと異なり,x軸方向とy軸方向の2つの半径を指定します.
- ellipse(cx, cy, rx, ry)
- cx:楕円の中心x座標を指定します.
- cy:楕円の中心y座標を指定します.
- rx:楕円のx軸方向の半径を指定します.
- ry:楕円のy軸方向の半径を指定します.
arcコマンド,pieコマンド
arcコマンドは(楕)円弧を描画します.始点と終点は中心からの角度(ラジアン)で指定します.
- arc(cx, cy, rx, ry, from, to, markerStart, markerEnd)
- cx:円弧の中心x座標を指定します.
- cy:円弧の中心y座標を指定します.
- rx:円弧のx軸方向の半径を指定します.
- ry:円弧のy軸方向の半径を指定します.
- from:円弧の開始座標を中心からの角度で指定します.
- to:円弧の終了座標を中心からの角度で指定します.
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
pieコマンドは扇型を描画します.パラメータの指定はarcコマンドと同様です.
- arc(cx, cy, rx, ry, from, to, markerStart, markerEnd)
- cx:円弧の中心x座標を指定します.
- cy:円弧の中心y座標を指定します.
- rx:円弧のx軸方向の半径を指定します.
- ry:円弧のy軸方向の半径を指定します.
- from:円弧の開始座標を中心からの角度で指定します.
- to:円弧の終了座標を中心からの角度で指定します.
rectコマンド
rectコマンドは矩形(四角形)を描画します.左下の位置を基準とし,幅と高さで四角形を指定します.また角を丸めることも出来ます.width及びheight値にはマイナスの値を指定することが出来ます.
- rect(x, y, width, height, rx, ry)
- x:矩形の左下頂点のx座標を指定します.
- y:矩形の左下頂点のy座標を指定します.
- width:矩形の幅を指定します.
- height:矩形の高さを指定します.
- rx:x軸方向の角の丸め半径を指定します.(省略可)
- ry:y軸方向の角の丸め半径を指定します.(省略可)
width,heightに負の値が指定された場合の例を示します.
shapeコマンド
shapeコマンドは図形を直接定義します.svgのパス文字列を渡すことで自由な図形を描く事が出来ます.
- shape(d)
- d:パス文字列.
座標指定のコマンド
グラフの特定の座標に目印とラベルを挿入することが出来ます.
dotコマンド
dotコマンドは座標の位置を指し示すための印を描画します.その際の座標も自動的に出力します.
- dot(x, y, markerStyle, format)
- x:マーカーを表示したいx座標を指定します.
- y:マーカーを表示したいy座標を指定します.
- markerStyle:座標に表示するマーカー図形を指定します.省略した場合自動的にdotが選ばれます.
- format:座標に対するラベルの書式を設定します.
文字列内部の{{x}}
の部分がx座標の値で,{{y}}
の部分がy座標の値で,{{sx}}
の部分がxに指定した式で,{{sy}}
の部分がyに指定した式で置き換えられます.
省略した場合何も表示しません.
座標を数値で表示する例を示します.
x,yに数式を指定した場合,この内容を座標に出力することも出来ます.
dotsコマンド
dotsコマンドでは複数の座標に印を一括で描画します.dotコマンドを繰り返す場合はdotsコマンドが利用できるかも知れません.
- dots(ds, markerStyle, format)
- ds:タイトルに設定したい文字列を指定します.
- markerStyle:タイトルに設定したい文字列を指定します.
- format:座標に対するラベルの書式を設定します.内容はdotコマンドと同じです.
マーカーの描画
直線や曲線を描画するコマンド(line,arc,path,plot)及び座標を指定するコマンド(dot,dots)では,始点や終点等の座標を装飾するためのマーカー図形を指定することが出来ます.
利用可能なマーカー図形の種類は次の通りです.
- none
- 出力しません.
- dot
- 黒丸を出力します.
- circle
- 白丸を出力します.
- arrow
- 矢尻を出力します.(終点の装飾に利用します)
- warrow
- 白抜き矢尻を出力します.(終点の装飾に利用します)
- dia
- 菱型を出力します.
- wdia
- 白抜き菱型を出力します.
テキストの描画に関わるコマンド
グラフに文字列を挿入することでグラフの可読性が向上します.
textコマンド
textコマンドではグラフに文字列を挿入します.
- texts(x, y, str, pos)
- x:テキストを挿入する位置のx座標を指定します.
- y:テキストを挿入する位置のy座標を指定します.
- str:グラフに挿入する文字列を指定します.改行したい位置に
\n
を挿入します. - pos:文字列を描画する基準を指定します.[topLeft(左上), top(上), topRight(右上), left(左), center(中央), right(右), bottomLeft(左下), bottom(下), bottomRight(右下)]もしくは短縮記法[tl(左上), t(上), tr(右上), l(左), c(中央), r(右), bl(左下), b(下), br(右下)]の何れかを指定します.
関数の描画に関わるコマンド
本スクリプトを利用する上で最も重要となるコマンド群で,簡単な記述で関数グラフを描くことが出来ます.
plotコマンド
plotコマンドでは関数文字列を指定することでグラフを描画することが出来ます.
使い方には(1)「y=f(x)型の関数」(2)「x=f(t),y=g(t)の媒介変数型」の二種類が選べます.
- plot(func, from, to, pCount, markerStart, markerEnd)
- func:元となる関数文字列.文字列単体か,文字列のリストを渡します.
- from:パラメータの初期値.(省略可)
- to:パラメータの終了値.(省略可)
- pCount:座標を計算する回数.この値を多く取るほど得られる結果は滑らかになりますが,処理時間・ファイルサイズが肥大します.(省略可)
- markerStart:始点に対するマーカーを指定します.(省略可)
- markerEnd:終点に対するマーカーを指定します.(省略可)
(1)y=f(x)型の場合
最も直感的な使い方で,必ず変数として「x
」としてください.fromとtoを省略した場合,自動的にグラフにおけるxの最小値と最大値が設定されます.
(2)x=f(t),y=g(t)の媒介変数型
funcにx座標に対する関数とy座標に対する関数の二つをリストとして渡します.必ず変数として「t
」を与えてください.
注意・不連続となる部分が連結されてしまう
このコマンドで得られるグラフは必ず連続した図形となります.従って次の反比例グラフのように不連続となる箇所があった場合,実際のグラフとは異なる図形となるケースがあります.
従って,不連続となるパラメータ値が判っている場合は,その値でグラフ描画を分割するとより良い結果が得られるでしょう.
areaコマンド
areaコマンドはグラフとx軸で囲まれた領域を描画します.fillスタイルと組み合わせることで,範囲を塗りつぶすことが出来ます.「y=f(x)型の関数」のみ指定できます.
- area(func, from, to, pCount)
- func:元となる関数文字列.
- from:パラメータの初期値.(省略可)
- to:パラメータの終了値.(省略可)
- pCount:座標を計算する回数.この値を多く取るほど得られる結果は滑らかになりますが,処理時間・ファイルサイズが肥大します.(省略可)
surfaceコマンド
surfaceコマンドは2変数からなる関数によるグラフを描画します.
- surface(fxSource, fySource, sFrom, sTo, tFrom, tTo, freq, pCount)
- fxSource:x座標に対する関数文字列を指定します.
- fySource:y座標に対する関数文字列を指定します.
- sFrom:第一変数の初期値を指定します.
- sTo:第一変数の終了値を指定します.
- tFrom:第二変数の初期値を指定します.
- tTo:第二変数の終了値を指定します.
- freq:計算の頻度を与えます.
- pCount:座標を計算する回数.この値を多く取るほど得られる結果は滑らかになりますが,処理時間・ファイルサイズが肥大します..(省略可)
関数の変数には必ず「s
」と「t
」を指定してください.
関数文字列で許されている記述
plotコマンドに渡す関数文字列は通常javascript形式で指定しますが,SVGGraph.jsではより数学での数式記述に近い方法で関数を記述することが出来ます.そのためjavascript形式での記述に比べてより直感的な記述が可能となっています.以下に許されている記法について列挙します.
ルール | 記述例 | 変換例 |
---|---|---|
Mathオブジェクトの関数・定数を呼び出す場合,Math. の記述を省くことが出来ます. | pi | Math.PI |
三角関数・双曲線関数の逆関数をsin^-1 (sin-1(x)形式)で記述することが出来る.※サポートしている一覧については後述します. | cos^-1(x) | acos(x) |
累乗として^ を記述できる.※javascriptでは累乗としてpow関数を利用します. | 2^5+3x^2 | pow(2,5)+3*pow(x,2) |
階乗として! を記述できる. | 4! | factorial(4) |
変数や関数の前の数値との間の掛け算部においては* の記述を省くことが出来る.※変数と変数の掛け算では明示的に a*b と記述して下さい.さもないと変数「ab」として解釈されてしまいます. | 2x^2+5x+3 | 2*pow(x,2)+5*x+3 |
()で囲んだ式においては掛け算部の* の記述を省くことが出来る. | (x+1)(x+2) | (x+1)*(x+2) |
角度として° を記述できる. | sin(60°) | sin(rad(60)) |
平方根を関数に似た√(x) と記述できる.関数としては存在しません. | √(2) | rt(2) |
SVGGraph.jsで利用可能な関数/定数
SVGGraph.jsではjavascriptの標準的なMath関数の他にも,様々な関数が定義されています.
これらの関数は通常Math.(関数名)
として利用しますが,svg要素のscript属性内部ではショートカットとしてm.(関数名)
と記述できます.更にplotコマンドに渡す関数文字列内部では更に直接(関数名)
として記述します.
関数
以下に利用可能な関数をリストアップします.
関数名 | 内容 | 備考 |
---|---|---|
not | 論理否定 | !演算子が階乗に展開されてしまったための代替. |
ln | 対数関数 | logのエイリアス. |
rt | n乗根 | rt(x,n)…n√x.n省略で平方根 |
cbrt | 立方根 | |
log | 対数関数 | log(x,a)…loga(x). |
rad | 角度をラジアンに変換する | |
deg | ラジアンを角度に変換する | |
arcsin | sinの逆関数 | 関数文字列において「sin^-1」と記述可. |
arccos | cosの逆関数 | 関数文字列において「cos^-1」と記述可. |
arctan | tanの逆関数 | 関数文字列において「tan^-1」と記述可. |
sec | 正割(セカント) | 1/cos(x) |
csc | 余割(コセカント) | 1/sin(x) |
cot | 余接(コタンジェント) | 1/tan(x) |
asec | secの逆関数 | 関数文字列において「sec^-1」と記述可. |
acec | cecの逆関数 | 関数文字列において「cec^-1」と記述可. |
acot | cotの逆関数 | 関数文字列において「cot^-1」と記述可. |
arcsec | secの逆関数 | 関数文字列において「sec^-1」と記述可. |
arccec | cecの逆関数 | 関数文字列において「cec^-1」と記述可. |
arccot | cotの逆関数 | 関数文字列において「cot^-1」と記述可. |
sinh | 双曲線正弦 | (ex-e-x)/2 |
cosh | 双曲線余弦 | (ex+e-x)/2 |
tanh | 双曲線正接 | sinh(x)/cosh(x) |
sech | 双曲線正割 | 1/cosh(x) |
csch | 双曲線余割 | 1/sinh(x) |
coth | 双曲線余接 | 1/tanh(x) |
asinh | sinhの逆関数 | 関数文字列において「sinh^-1」と記述可. |
acosh | coshの逆関数 | 関数文字列において「cosh^-1」と記述可. |
atanh | tanhの逆関数 | 関数文字列において「tanh^-1」と記述可. |
asech | sechの逆関数 | 関数文字列において「sech^-1」と記述可. |
acsch | cschの逆関数 | 関数文字列において「csch^-1」と記述可. |
acoth | cothの逆関数 | 関数文字列において「coth^-1」と記述可. |
arcsinh | sinhの逆関数 | 関数文字列において「sinh^-1」と記述可. |
arccosh | coshの逆関数 | 関数文字列において「cosh^-1」と記述可. |
arctanh | tanhの逆関数 | 関数文字列において「tanh^-1」と記述可. |
arcsech | sechの逆関数 | 関数文字列において「sech^-1」と記述可. |
arccsch | cschの逆関数 | 関数文字列において「csch^-1」と記述可. |
arccoth | cothの逆関数 | 関数文字列において「coth^-1」と記述可. |
sign | 符号 | 0/1/-1の何れかが返される. |
factorial | 階乗 | 関数文字列「x!」と記述可. |
P | 順列数 | P(n,r)…nPr |
C | 組み合わせ数 | C(n,r)…nCr |
floor | 切り上げ | floor(x,n):n…四捨五入する桁の位置 |
round | 四捨五入 | round(x,n):n…四捨五入する桁の位置 |
ceil | 切り捨て | ceil(x,n):n…四捨五入する桁の位置 |
定数
記述を簡略化するため幾つかの定数については別名がつけられています.
円周率…PI,pi,πの何れか
自然対数の底…E,eの何れか
コマンドの引数に式を渡す
コマンドの引数において数値を要求するものには数式文字列を指定することが出来ます.例えば次のコードは正しく動作します.
描画スタイルに関わるコマンド
グラフや図形を描画する際に,その色や形状(スタイル)を指定することが出来ます.各オブジェクトのプロパティに値を設定する(style.stroke='red'
)と,以降のコマンドはこの設定内容を元にグラフを描画します.
styleオブジェクト
styleオブジェクトには図形を描画する際のスタイルを設定します.以下に主なものを示します.
- stroke
- 線の色を指定します.指定可能な色については「htmlの色」を参照して下さい.
- strokeWidth
- 線の幅を指定します.これはグラフ上の見た目の太さです.
- fill
- 塗り潰しの色を指定します.noneを指定すると塗り潰しが無視されます.
- strokeDasharray
- 点線の間隔を指定します.
tStyleオブジェクト
tStyleオブジェクトには文字列を描画する際のスタイルを設定します.
- fill
- 文字の色を指定します.
- fontFamily
- フォントの種類を指定します.serif/sans-serif/monoscope等
- fontWeight
- 文字の太さを指定します.normal/bold
- fontStyle
- フォントの形状を指定します.normal/italic
- fontSize
- 文字の大きさを指定します.これはグラフ上の見た目の大きさです.
aStyleオブジェクト
aStyleオブジェクトには座標軸及び格子のスタイルを指定します.
- axisStroke
- 座標軸の色を指定します.
- axisWidth
- 座標軸の太さを指定します.
- gridStroke
- 格子の色を指定します.
- gridWidth
- 格子の太さを指定します.
- indexSize
- 目盛見出しの大きさを指定します.
mStyleオブジェクト
mStyleオブジェクトにはマーカーのスタイルを指定します.通常マーカーの色はstyleオブジェクトのstrokeの値を参照します.
- size
- マーカーの大きさを指定します.
- color
- マーカーの色を指定します.inheritでstyle.strokeの値を参照します.
- fill
- マーカーの塗り潰し色を指定します.
スタイル設定のやり方はこの他にも幾つか方法があります.適切に使い分けることでスクリプト記述を大幅に減らすことが出来ます.
図形のスタイルを直接操作する
コマンドの実行結果に直接スタイルを設定することが出来ます.全体での設定をstyleオブジェクトで行い,一つだけスタイルを変更したい場合に便利です.
グローバルスタイル設定の追加
複数のグラフに横断的なスタイルについては,style要素内で一括して行うことが出来ます.例えば本ページでは次のようなスタイル要素の記述がなされており,グラフに表示する文字の種類を共通化しています.
<style class="SVGGraph">
svg[graph] text{
font-family:serif;
}
</style>
実装手順
- html文書内にstyle要素を追加します.
- style要素のclass属性として
SVGGraph
を設定します. - 内部に共通のスタイル設定を記述していきます.
定義用svg要素の追加
svgでは図形描画を行う際に様々な装飾が行えます.このような装飾に関わる設定を次のように専用のsvg要素内部に記述しておくことで,svgファイル出力時に設定情報を引き継ぐ事が可能となります.なお,記述には深いsvgの知識が必要となるため,慣れない間は無理に使わない方が良いかも知れません.例を示します.
<svg class="SVGGraph" width="0" height="0"
style="visibility:hidden;position:absolute;right:0;">
<!--グラデーションを定義しています-->
<defs>
<linearGradient id="grad1" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="red"/>
<stop offset="100%" stop-color="pink"/>
</linearGradient>
</defs>
</svg>
実装手順
- html文書内にsvg要素を追加します.
- svg要素のclass属性として
SVGGraph
を設定します. - このsvg要素は表示上必要のないものなので
visibility:hidden
等のスタイルを指定し非表示とします.
サイズを0とするなり,表示領域外に位置をずらすなりレイアウトに影響が及ばないように工夫してください. - このsvg要素の内部に各種設定を施します.
図形の配置に関わるコマンド
各種コマンドで生成した図形はコマンドの実行順に下から上に重ねられていきます.そのため場合によっては座標軸の後ろに図形を配置したほうが見た目が良くなる場合があります.ここではこの図形の配置順の制御を行うコマンドについて説明します.
bgコマンド
bgコマンドはコマンドで生成した図形を背景(座標軸の後ろ)に配置します.グラフ領域の塗り潰しなど,座標軸を隠さないように図形を配置したい場合に利用します.
- bg(elem)
- elem…コマンドの実行結果(図形オブジェクト)
javascriptの構文とDOMを使った高度なグラフ生成
scriptの内容はjavascriptの構文を使って記述することが出来ます.従ってjavascriptの知識があればより高度な操作を行わせることが可能です.
ユーティリティーコマンド
直接グラフを描画するわけではありませんが,スクリプト記述を簡易化するための仕組みが提供されいます.
valコマンド
valコマンドは式の記述を数値もしくは数値の配列に変換します.数式を配列形式で並べたものを渡すと,配列オブジェクトに変換して返します.
- val(expression)
- 引数の内容を分析し,数値もしくは数値の配列に変換して返します.
strコマンド
strコマンドは式の記述を文字列もしくは文字列の配列に変換します.数式を配列形式で並べたものを渡すと,配列オブジェクトに変換して返します.
- str(expression)
- 引数の内容を分析し,数値の配列.
制御構文を使ったグラフ記述
変数定義や制御構文を利用すると,複雑なグラフや図形を効率的に描くことが可能となります.例を示します.ここでは配列を用意し,五角形の頂点を求めたあとでコマンドを実行しています.
コマンドの実行結果を利用したスクリプトの記述
各コマンドは実行結果としてSVG要素オブジェクト(SVGElement)を返します.そのため,この実行結果の内容を操作することでグラフの表示内容を編集することが出来ます.
スクリプトのパラメータ化と簡易UIの自動生成
本スクリプトでは作成したグラフ生成記述の一部を外部の値で置き換える仕組みを提供しています.この仕組みを使うと,いちいちスクリプトを書き換える必要がなくなるため,文書の管理が容易になります.またこのページで表示しているようなユーザーインターフェースを簡単にhtml文書に挿入する事ができます.
スクリプトのパラメータ化
svg要素の記述を行う際,文字列{{0}}
〜{{9}}
を挿入した箇所はパラメータとして扱われます.例えば次の例ではplotコマンドの部分を{{0}}
と{{1}}
という二つのパラメータで表しています.
このパラメータに値を渡すにはsvg要素にparam0
〜param9
属性(パラメータ属性)を定義します.上の例で{{0}}
に2を,{{1}}
に3を与えるのであれば,次のようにsvg要素に属性を記述します.
<svg width="200" height="200" script="
setRange(-5,5,-5,5);
axis('full',1,1);
plot('{{0}}sin({{1}}x)');
" param0="2" param1="3" />
パラメータに文字列を与える
またパラメータとして文字列を与える場合は属性に設定する値を'
もしくは"
で囲んでください.
<svg script="setRange(-5,5,-5,5);
text(0,0,{{0}});
text(0,-1,{{1}});
" param0="'文字列は引用符で囲みます'" param1='"もしくは二重引用符で囲みます"' mode="r"/>
グラフの動作モードと簡易UIの挿入
本スクリプトで描いたグラフには動作モードが定義されています.svg要素のmode
属性から動作モードを変更することが出来ます.
<svg width="200" height="200" script="
setRange(-5,5,-5,5);
axis('full',1,1);
plot('{{0}}sin({{1}}x)');
" param0="2" param1="3" mode="wl"/>
- 未設定
- グラフの描画以外何もしません.
- s(script)
- グラフを描画したスクリプトを表示します.
- p(parameter)
- パラメータの内容を表示します.
- w(write)
- グラフの内容を編集可能とします.単体では意味はなくpモードもしくはsモードと組み合わせることで効果を発揮します.
- l(link)
- 生成したsvg画像を保存するためのリンクを挿入します.グラフの内容をブラウザの「右クリック」からsvgファイルとして保存可能となります.
- i(image)
- 生成したグラフをpng形式の画像ファイルとして出力します.
グラフ画像がポップアップするため,環境によっては正しく動作しません.また画像の変換処理中にエラーが発生するケースがあります. - a(animation)
- アニメーションを実行するボタンを表示します.詳しくは次のセクションで説明します.
- m(movable)
- グラフをドラッグ操作で移動することが出来ます.
先ほどの例でモードごとの動作の違いを見てみましょう.
モード未指定
sモード
pモード
s+pモード…mode="sp"
と設定します.
w+sモード…mode="ws"
と設定します.
w+pモード…mode="wp"
と設定します.
w+s+pモード…mode="wsp"
と設定します.
lモード
iモード
aモード
mモード
mモードではsvg上でカーソルが変化し,描画範囲を動かせるようになります.グラフをダブルクリックすると元の位置に戻ります.
ラベルの挿入
pモードにおいては自動的に入力フィールドが生成されますが,この内容に説明文を挿入することが出来ます.
svg要素にlabel0
〜label9
属性(ラベル属性)を定義するとその内容がラベルとして挿入されます.その際,{{p}}
が記述されていた場合,この部分が入力フィールドに置き換えられます.例を示します.
<svg width="200" height="200" script="
setRange(-5,5,-5,5);
axis('full',1,1);
plot('{{0}}sin({{1}}x)');
" param0="2" param1="3" mode="wl"
label0="y軸方向の倍率" label1="x軸方向の倍率({{p}})"/>
グラフをアニメーション化する
グラフ出力をaモードで動作させた場合,グラフに開始ボタンが追加されグラフの内容をアニメーション化することが出来ます.
アニメーション開始値と終了値の指定
アニメーション化したいパラメータ値に対応するparam0
〜param9
属性には書式[初期値];[終了値]
としてアニメーション開始時の値と終了時の値を記述します.一方で,文字列などの固定値に対応するパラメータ属性には単一の値を指定します.例を示します.
<svg script="setRange(-5,5,-5,5);
axis('full',1,1);
style.stroke='green';
style.strokeWidth=2;
plot('{{0}}sin({{1}}x+{{2}})', -5, 5, 200);
text(0,2,{{3}})"
param0="1;4" param1="1/4;3" param2="0;4" param3="'アニメサンプル'" mode="a"/>
w+pモードと組み合わせることで開始値及び終了値を書き換えてアニメーションを実行することも出来ます.
アニメーション時間とアニメーションの固定
アニメーションのカスタマイズを行うためにdur属性とfreeze属性を設定できます.
- dur属性
- アニメーションの実行時間を秒数で指定します.初期値は5秒.
- freeze属性
- アニメーション終了時の内容をそのままにするかを設定します.true…そのままにする.false…元の内容に戻す.初期値false.
<svg script="setRange(-5,5,-5,5);
axis('full',1,1);
style.stroke='green';
style.strokeWidth=2;
plot('{{0}}sin({{1}}x+{{2}})', -5, 5, 200);"
param0="1;4" param1="1/4;3" param2="0;4" dur="10" freeze="true" mode="a"/>
マクロを登録する
多量のグラフを用意する場合,特定の記述を繰り返し利用することはよくあります.SVGGraph.jsではこのような共通処理をマクロ登録機能として提供しています.なお,マクロを登録するにはjavascriptの知識が必要です.
マクロ登録の準備
マクロを定義する場合はSVGGraph.jsを読み込んだ後で自作のスクリプトを実行します.例えば次の例では「macro.js」としたjavascriptファイルを実行するように設定しています.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>関数グラフ描画スクリプト・SVGGraph.js</title>
<script src="SVGGraph.js"></script>
<script src="macro.js"></script>
</head>
<body>
・・・以下文書が続く
マクロの登録
上で用意したファイル(もしくはscript要素)にスクリプトを記述していきます.マクロからはグラフを描くための各種コマンドが全て利用可能です.マクロを登録するにはSVGGraph.registerMacro
メソッドを利用します.
- SVGGraph.registerMacro(name, f)
- name…マクロを呼び出す際の識別子.svg要素のscript属性から呼び出す際は
Macro.[name]
と記述します. - f…マクロとして登録したい関数.
registerMacroメソッドで登録した関数はsvg要素のscript属性から呼び出す事が出来る他,他のマクロメソッドから呼び出すことも出来ます.但し,scriptファイル内部で定義したローカル関数は呼び出すことが出来ません.
例を示します.下記はこのページで利用しているマクロの中身です.マクロで登録した内容をsvg要素のscript要素から呼び出せていることがわかります.
//※マクロを登録するにはSVGGraph.registerMacroメソッドを利用します.
//
(function(){
//マクロを登録します.
SVGGraph.registerMacro("macro", function(){
setRange(-5, 5, -5, 5);
});
SVGGraph.registerMacro("drawAxis", function(){
axis('full', 1, 1, 0, 0);
});
//マクロ内部からマクロを呼び出すことも出来ます.
SVGGraph.registerMacro("callDrawAxis", function(){
Macro.drawAxis();
});
//但しスコープ外部の関数は呼び出すことが出来ません.
})();
マクロ記述をサポートする関数
マクロを登録する際,コマンドの引数を変換するためのメソッドが提供されています.入力内容のチェック等に利用可能です.
- fix(expression, defaultValue)
- 引数の内容を式として判定し,数値に変換します.
expression:数値,もしくは数式文字列
defaultValue:expressionが未入力時に返す値 - fixStr(str, defaultValue)
- strの内容を判定し,文字列を返します
str:判定したい文字列.
defaultValue:未入力時に返す値.
例を示します.fixメソッドを利用することで数式文字列を数値に変換しています.
(function(){
SVGGraph.registerMacro("myCommand", function(x, y){
var vx = fix(x, 0);
var vy = fix(y, 0);
dot(m.round(vx,2), m.round(vy,2), "dot", "("+x+","+y+")");
});
})();
事前処理・事後処理の登録
マクロに似た機能として事前処理・事後処理の登録機能があります.これは一つのhtmlページに複数のグラフを描画する際に共通に実行するコマンドを記述できます.マクロと異なり,明示的に呼び出さずとも自動的に実行されます.
- SVGGraph.registerPresetting(f)
- f:事前処理として実行したい関数
- SVGGraph.registerPostsetting(f)
- f:事後処理として実行したい関数
例を示します.共通処理が一箇所にまとまったため,グラフ個別の記述が1行で済んでいます.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<script type="text/javascript" src="SVGGraph.js"></script>
<style type="text/css">svg{border:2px black outset;}</style>
<script type="text/javascript">
//ここで事前処理と事後処理を設定しています
SVGGraph.registerPresetting(function(){
setRangeAsRect(-6,-6,12,12);
axis("full", 1, 1, 1, 1);
style.stroke="red";
style.strokeWidth=2;
});
SVGGraph.registerPostsetting(function(){
tStyle.fill="blue";
text(0,5,"Drawn by SVGGraph.js");
});
</script>
</head>
<body>
<svg width="200" height="200" script="plot('sin(x)');"
/><svg width="200" height="200" script="plot('cos(x)');"/>
</body>
</html>
これを実行した結果が下です.iframeで表示しています.
数学関数の登録
マクロと同様に数学関数を登録することもできます.数学関数を登録するにはSVGGraph.registerMath
メソッドを利用します.
- SVGGraph.registerMath(name, f)
- name…自作関数を呼び出す際の識別子.svg要素のscript属性から呼び出す際は
m.[name]
と記述します.また関数文字列の中であれば他の関数と同様にm.
を省略することが出来ます. - f…自作関数として登録したい関数もしくは定数.
registerMathメソッドで登録した関数は他の関数内部でMath.[name]
として呼び出すことが出来ます.
例を示します.plotコマンドの関数文字列の内部で正しく呼び出されている事がわかります.
//※関数を登録するにはSVGGraph.registerMathメソッドを利用します.
//
(function(){
//関数を登録します.
SVGGraph.registerMath("myFunction", function(x){
return Math.sin(x * 2) * 3;
});
})();
マーカーの登録
プログラムの他にもグラフで用いるマーカーを登録することが出来ます.マーカーを登録するにはSVGGraph.registerMarker
メソッドを利用します.なお,図形の定義はsvgのパス定義書式にて行います.
- SVGGraph.registerMarker(source, blackCaseName, whiteCaseName)
- source…マーカー図形を表すパス文字列.
- blackCaseName…マーカーを利用する際の名称(塗り潰し時).
- whiteCaseName…マーカーを利用する際の名称(中抜き時).
例を示します.lineコマンドから自作のマーカーが読み込まれていることがわかります.
//※マーカー図形を登録するにはSVGGraph.registerMarkerメソッドを利用します.
//
(function(){
//マーカー図形を登録します.
SVGGraph.registerMarker("M5,1 9,8 1,8z"//これをsvgで描画すると→のようになります.
, "triangle", "wtriangle");
})();
自作のスクリプトと連携する
ここまではSVGGraph.js単体で利用可能な仕組みについて解説しましたが,これらの仕組みを自作のjavascriptプログラムから呼び出すことも出来ます.グラフが描かれたsvg要素(SVGSVGElementオブジェクト)にはグラフ操作のためのapiが追加されます.これらをボタンのクリック時の処理などから呼び出すことで自由にグラフを描く事が可能となります.
グラフの描画処理を制御するapi
グラフの描画設定をsvg要素で行った場合,その制御を外部javascriptから行うことが出来ます.
param/paramsメソッド
paramメソッドではパラメータの値の取得・設定が可能です.
- param(i, value)
- i:パラメータのid(0〜9)を指定します.
- value:設定する値を指定します.存在しなかった場合,パラメータidに対応する値を取得します.
paramsメソッドでは値を一括で設定することが出来ます.
- params(value0,value1,…)
- value0:パラメータ0に設定する値
scriptメソッド
scriptメソッドでは現在svg要素に設定されているグラフ記述スクリプトの内容を操作することが出来ます.
- script(src)
- src:設定したいスクリプト文字列.存在しなかった場合,現在のスクリプト文字列を取得します.
getSourceメソッド
getSourceメソッドでは現在のsvg要素の状態をsvgのソースコードとして取得します.このメソッドで得られた文字列を保存することで,他のツールとの画像連携が可能となります.
- getSource(type)
- type:svgのソースコードの状態を指定します.
string
(テキスト)/encoded
(urlエンコード済み)/dataScheme
(データスキーム形式→img要素等に直接設定可能な形式)/url
(url形式→img要素等に直接設定可能/window.openで開ける形式)の何れかで指定します.
update/resetメソッド
updateメソッドではsvg要素の現在の設定内容によってグラフを描画します.paramsメソッド,scriptメソッドと組み合わせて利用することとなるでしょう.
- update()
- グラフの内容を更新します.
resetではパラメータ設定を元に戻してグラフの描画内容を初期状態に戻します.
- reset()
- グラフの内容を元に戻します.
- clear()
- グラフの内容を削除します.
setCallbackメソッド
setCallbackメソッドではupdateメソッドが実行された後に呼び出されるコールバック関数を設定します.コールバック関数には引数としてupdateを実行したsvg要素が渡されます.
- setCallback(f)
- コールバック関数を登録します.
f…登録したい関数
getGraphX/getGraphYメソッド
getGraphX/getGraphYメソッドではマウスカーソルが指し示す座標を取得します.マウスの位置から自動的にグラフの座標を算出します.主にmouseイベントと組み合わせて利用することとなるでしょう.
- getGraphX()
- グラフ上のカーソルのx座標を取得します.
- getGraphY()
- グラフ上のカーソルのy座標を取得します.
例を示します.ここではグラフをクリックした位置と原点とを結ぶ比例直線を表示しています.予めパラメータを二つ定義しておき,getGraphX,getGraphYメソッドで取得したカーソル座標をグラフのパラメータに設定します.最後にupdateメソッドを実行するとグラフが書き換わります.
<svg
onclick="this.params(this.getGraphX(),this.getGraphY());
this.update();"
script="setRange(-5,5,-5,5);
axis('full',1,1);
plot('{{1}}/{{0}}*x').style.stroke='red';
dot({{0}},{{1}}, 'dot', '({{x}},{{y}})');" mode="s" param0="1" param1="0"/>
グラフ上のカーソル座標を画面に表示する
SVGGraph.jsではこの座標を自動で画面に表示させる機能を提供しています.以下にその手順を示します.
- svg要素にid属性を定義します
- 座標を自動表示させたい位置にある要素の
graph
属性に上で定義したidを設定します.
指定可能な要素はdiv,span,text,tspan要素です.
例を示します.ここではグラフそのものに座標を表示していますが,div要素を使って文書中に座標を表示することも出来ます.
<svg script="setRange(0,5,0,5);
axis('full',1,1);" mode="wl" id="cursor">
<text x="0" y="195">現在の座標は<tspan graph="cursor"/>です</text>
</svg>
posX/posY/scaleX/scaleYメソッド
posX/posYメソッドでは指定したグラフ座標に対するsvgグラフィックの座標を求めます.また,scaleX/scaleYメソッドではグラフ座標における長さをsvgグラフィックにおける長さに変換します.このメソッドを利用すると,グラフ上に自作の要素を挿入することが出来ます.
- posX(graphX)
- グラフ上のx座標をsvgにおけるx座標に変換します.
- posY(graphY)
- グラフ上のy座標をsvgにおけるy座標に変換します.
- scaleX(w)
- グラフ上の幅をsvgにおける幅に変換します.
- scaleY(h)
- グラフ上の高さをsvgにおける高さに変換します.
graphX/graphYメソッド
graphX/graphYメソッドではsvg座標をグラフ座標に変換します.つまりposX/posYメソッドの逆を行います.
- graphX(posX)
- svg上のx座標をグラフにおけるx座標に変換します.
- graphY(posY)
- svg上のy座標をグラフにおけるy座標に変換します.
animメソッド
animメソッドではパラメータを時系列的に変化させることでグラフの内容をアニメーションさせます.グラフ描画のaモードの動作に相当する機能を提供します.
- function(params, dur, freeze)
- params:パラメータ値[開始値,終了値]のリストを渡します.
- dur:アニメーションの実行時間を指定します.
- freeze:アニメーション終了時に内容を元に戻すかを設定します.
例を示します.ここではグラフをクリックするとアニメーションが開始します.
<svg script="setRange(-5,5,-5,5);
axis('full',1,1);
style.stroke='green';
style.strokeWidth=2;
plot('{{0}}sin({{1}}x+{{2}})')" param0="1" param1="0.25" param2="0" mode="s"
onclick="
this.anim([[1,4],[1/4,3],[0,4]],5,true);
"/>
javascriptからグラフ描画コマンドを呼び出す
内部で利用しているコマンド及びマクロを外部のjavascriptから直接呼び出すことも出来ます.そのため非常に柔軟な設計が可能となりますが,一方で記述が複雑になりますのでご注意ください.
commandsメソッド/macrosメソッド/SVGGraph.Mathオブジェクト
commandsメソッドはグラフ描画コマンドに対応するファンクションオブジェクトを返します.この機能を用いることで,外部スクリプトからグラフを描くことが可能となります.同様にmacrosメソッドは事前に登録しておいたマクロに対応するファンクションオブジェクトを返します.
- commands(commandName)
- グラフ描画コマンドをfunctionオブジェクトとして取得します.
commandName…取得したいコマンドの名称 - macros(macroName)
- グラフ描画マクロをfunctionオブジェクトとして取得します.
macroName…取得したいマクロの名称
またSVGGraph内部で利用している数学関数はSVGGraph.Mathオブジェクトから参照することが可能です.この中にはSVGGraph.registerMathメソッドで登録したものも含まれています.
- SVGGraph.Math
- SVGGraph内部で利用している数学関数オブジェクトです.
例を示します.id=graphTargetのsvg要素に対してscript要素内部のスクリプトからグラフを描画しています.
<svg script="" id="graphTarget" mode="li"/><!--←グラフの描画対象-->
<!--↓グラフを描画しているscript要素-->
<script>
window.addEventListener("load", function(e){
var svg = document.getElementById("graphTarget");
svg.macros("macro")();
svg.macros("callDrawAxis")();
svg.commands("plot")("myFunction(x)");
svg.commands("text")(0,-4,"acosh(2)=" + SVGGraph.Math.acosh(2));
}, false);
</script>
参考)棒グラフの表示マクロ
ここではSVGGraph.jsを使って棒グラフを表示するサンプルを示します.下記のコードをマクロとして予めSVGGraph.jsに登録しておきます.
(function(){
SVGGraph.registerMacro("bar", function(values, labels, colores, width, skip){
width = fix(width, 0.5);
skip = fix(skip, 1);
if(!colores){
colores = ["black"];
}else if(typeof colores=="string"){
colores=[colores];
}
var colorLen = colores.length;
var g = getElem("g");
for(var i=0, len=values.length; i<len; i++){
var elem = rect(skip*(i+0.5)-0.5*width, 0, width, values[i]);
var style = elem.style;
style.fill = colores[i%colorLen];
style.stroke = "none";
g.appendChild(elem);
var t = text(skip*(i+0.5),values[i]+0.5, labels[i]?labels[i]:"");
g.appendChild(t);
}
return append(g);
});
})();>
これをsvg要素から呼び出します.その際,パラメータとしてリストを渡すことが出来ます.