最近のBLTはvectorなどtkウィジェットでないものだけをtclで使うBLTliteと、
tkウィジェットも含んだフルセットのBLTの二つがあって、最初にtkをロード
しておかないとpackage require BLTしたときにBLTliteの方がロードされて
しまうので注意。
あと後方互換性のためかnamespace import blt::*しとかないと動かないサンプル
などもありげな予感。でもなるべくnamespace importしたくない。
package require Tk package require BLT pack [blt::graph .g] .g element create e1 -xdata {1 2 3 4} -ydata {1 2 4 8}
グラフを作ってエレメントを追加。複数のエレメントを追加したら複数のグラフが表示される。エレメントのデータや見た目を変えるには.g element configure ~で色々変えられる。データの設定は-xdata -ydataの組み合わせか、-dataでxyの値のペアの平リストかのどっちか(どっちでもいい)でする。
見た目の改善はたくさんオプションがあるので適当にいじればいいと思う・・・。
一応自分がよく使いそうなオプションだけをリストアップ。
折れ線エレメントのオプション
.g element configure elemName options
-color | 線の色 |
-dashes | 線を点々にする。 |
-hide | 隠す |
-label | ラベル。legendに表示される。 |
-labelrelief | legendのレリーフ。 |
-linewidth | 折れ線の太さ。0にすると線は表示されない。 |
-symbol | none circle square diamond plus cross splus scross triangle arrow bitmap |
-pixels | symbolの大きさ。 |
-showvalues | 値の表示。 |
-smooth | linear step natural quadratic。 |
-valueanchor | 値の表示位置。n e w s c |
-valuecolor | 値の色。 |
-valuefont | 値のフォント。 |
-valueformat | 値の表示用フォーマット |
棒グラフエレメントのオプション
.g element configure elemName options
-background | 棒の色 |
-barwidth | 線の太さ0.0~1.0 |
-borderwidth | 枠線の太さ |
-foreground | 基本色 |
-background | stippleのビットマップの色 |
-label | legendに表示されるラベル |
-labelrelief | legendのレリーフ |
-relief | 棒のレリーフ |
-stipple | 棒の背景模様。引数のパターンはblt::bitmapで作ったり。 |
-showvalues | 値の表示。 |
-valueanchor | 値の表示位置。n e w s c |
-valuecolor | 値の色。 |
-valuefont | 値のフォント。 |
-valueformat | 値の表示用フォーマット |
グラフのオプション
.g configure options
-barwidth | 棒の太さ.0.0~1.0(棒グラフ) |
-barmode | infront stacked overlap aligned (棒グラフ) |
-invertxy | xy軸を逆にする |
-plotborderwidth | プロット領域のボーダー幅 |
-plotpadx | プロット領域のpadx |
-plotpady | プロット領域のpady |
-plotrelief | プロット領域のレリーフ |
-font | タイトルのフォント |
-title | タイトルのラベル文字 |
目盛りのオプション
.g axis configure axisName options
みたいな。x y とx2 y2がデフォで存在し、それぞれグラフの4辺に対応している。 x2 y2はデフォルトで非表示になっている。自分で追加することもできる。 目盛りは基本的に数値しか使えないが、limitsformatを使って細工することで 文字を入れることもできる。
-descending | 逆にする |
-hide | 隠す |
-limitsfont | 目盛りの数値のフォント |
-limitsformat | 目盛りのフォーマット |
-rotate | 目盛りの文字の回転 |
-logscale | 対数にする。true|false |
-loose | グラフの開始値と終了値の左右(上下)に幅を持たせる |
-max | 最大 |
-min | 最小 |
-majorticks | 大目盛りを打つ数値のリスト。 |
-minorticks | 小目盛りのリスト。0.0~1.0。グラフを拡大したときの描画がおかしい? |
-showticks | 目盛りを表示する |
-stepsize | 表示目盛りのステップ数。 |
-tickdivider | これも分割数? |
-subdivisions | 小目盛りの分割数 |
-ticklength | 目盛りの長さ。マイナスにすると向きが逆になる。 |
-title | タイトル |
-titlefont | タイトルのフォント |
.g configure -invertxy 1
これをするとbottom側がxの小さい値でtop側が大きい値になる。反対にするにはさらに
.g axis configure x -descending 1
する。 ついでに右寄せにするには
.g axis configure y -descending 1
する。
折れ線ではデフォルトでOFFになっている
.g grid on
ビットマップを作成するコマンド。棒グラフの背景に使ったりする。
blt::bitmap define bitmapName data ?option value?... blt::bitmap compose bitmapName text ?option value?... blt::bitmap exists bitmapName blt::bitmap source bitmapName blt::bitmap data bitmapName blt::bitmap height bitmapName blt::bitmap width bitmapName
ビットマップを作るには
blt::bitmap define pattern1 { {4 4} {0x01 0x02 0x04 0x08} }
みたいな。ここはx11 bitmapのデータをそのまま流し込んでもよいらしい。 ここで指定してるデータは省略形で最初のリストがwidth,heightで次のリストがデータ。 この例では斜め線を引く。
0x01 : 1000 0x02 : 0100 0x04 : 0010 0x08 : 0001
みたいな。あとこれに-rotateや-scaleオプションも付けられるらしい。
blt::bitmap define pattern1 { {4 4} {0x01 0x02 0x04 0x08} } -scale 5.0
いろいろなパターン
package require Tk package require BLT blt::bitmap define pt1 { {4 4} {0x01 0x02 0x04 0x08} } ;#斜め線1 blt::bitmap define pt2 { {4 4} {0x08 0x04 0x02 0x01} } ;#斜め線2 blt::bitmap define pt3 { {4 4} {0x0F 0x00 0x00 0x00} } ;#横線 blt::bitmap define pt4 { {4 4} {0x01 0x01 0x01 0x01} } ;#縦線 blt::bitmap define pt5 { {4 4} {0x0F 0x01 0x01 0x01} } ;#クロス pack .g [blt::barchart .g] .g element create e -xdata {1 2 3 4} -ydata {1 2 4 8} -background lightblue foreach n {pt1 pt2 pt3 pt4 pt5 error gray12 gray25 gray50 gray75 question questhead warning} { button .$n -text $n -command ".g element configure e -stipple $n" pack .$n -side left }
vectorは数値のシーケンスで、グラフのエレメントの-xdata -ydataに その名前を渡すと、動的にグラフを更新していくことができる。
package require Tk package require BLT blt::vector vecx vecy pack [blt::stripchart .g] .g axis configure x -autorange 10 -shiftby 1 .g element create e -xdata vecx -ydata vecy proc plot {} { vecx append [clock seconds] vecy append [expr rand()] after 1000 plot } plot
みたいな。
vectorはシーケンスを操作するための色々と便利なサブコマンドがある。
(めんどくさいので省略)。blt::vector v; v;すればコマンド一覧が見れる。
Blt_ActiveLegend .g ;#Legendのクリックでエレメントを選択 Blt_Crosshairs .g ;#カーソルの十字線を表示 Blt_ResetCrosshairs .g status ;#statusはon off toggle configureとか Blt_PrintKey .g ;#Shift-右クリックでPostscript出力。日本語フォントが変。 ;#namespace import blt::*しないと動かない。要改造。 Blt_ClosestPoint .g ;#Ctrl-中クリックで一番近いポイントを表示する。バグ有。 Blt_ZoomStack .g ;#右クリックで範囲を選択してズームインする
Blt_ActiveLegendとBlt_ZoomStackはよく使う。 こまかく挙動を制御したいときは自分で実装することもできる。