Ruby でグラフ描く GR.rb をつかってみた(がんばって日本語を表示する手順)
今まで Ruby で PyCall を呼んで matplotlib でグラフ描いてたんですが、GR.rb っていうのができたらしいので使ってみました。
インストール
$ brew install libgr $ export GRDIR=$(brew --prefix libgr)
または、https://github.com/sciapp/gr/releases からも落とせる。環境変数 GRDIR
の設定を忘れずやる。
サンプルを描画してみる
Wiki にいくつかサンプルが載っている。ためしに棒グラフを描画してみる。
require "gr/plot" continents = ["Africa", "America", "Asia", "Europe", "Oceania"] population_2010 = [1044, 944, 4170, 735, 36] GR.barplot(continents, population_2010, title: "Population 2010") gets
良さそう!
日本語のテキストを表示する
グラフに日本語を出したいことが多い、というかほとんどの場合日本語で出したいので、これもやってみます。
require "gr/plot" continents = ["アフリカ", "アメリカ", "アジア", "ヨーロッパ", "オセアニア"] population_2010 = [1044, 944, 4170, 735, 36] GR.barplot(continents, population_2010, title: "2010年の人口") gets
なんてすてきな豆腐!
手順① GR をいじる
GR.rb には任意のフォントを指定する機能がなさそうだったので、GR をいじりました。
# ソースを手元に用意する $ git clone git@github.com:sciapp/gr.git # まず、普通にビルドできるかどうか確認する $ make GRDIR=/tekitouna/tokoro/ $ make install
次に、lib/gks/fonts
に好きなフォントを置きます。pfg と ttf が使えるみたいです。今回は Ricty-Regular.ttf を置いてみます。
js/Makefile
にファイル名を追加します。
# 73行目付近 fonts: mkdir fonts - cp -p $(GKSDIR)/fonts/CMUSerif-Math.ttf $(GKSDIR)/fonts/DejaVuSans.ttf $(GKSDIR)/fonts/gksfont.dat fonts/ + cp -p $(GKSDIR)/fonts/CMUSerif-Math.ttf $(GKSDIR)/fonts/DejaVuSans.ttf $(GKSDIR)/fonts/Ricty-Regular.ttf $(GKSDIR)/fonts/gksfont.dat fonts/ ... # 97行目付近 libGR.js: $(OBJS) $(LIBS) library.js fonts $(CC) $(OPTS) $(DEFINES) \ - --embed-file fonts/gksfont.dat --embed-file fonts/CMUSerif-Math.ttf --embed-file fonts/DejaVuSans.ttf \ + --embed-file fonts/gksfont.dat --embed-file fonts/CMUSerif-Math.ttf --embed-file fonts/DejaVuSans.ttf --embed-file fonts/Ricty-Regular.ttf \
lib/gks/ft.c
にも追加します。
# 67行目付近 const static FT_String *gks_font_list_ttf[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "CMUSerif-Math", - "DejaVuSans"}; + "DejaVuSans", "Ricty-Regular"}; ... # 320行目付近 static int gks_ft_convert_textfont(int textfont) { textfont = abs(textfont); - if (textfont >= 201 && textfont <= 233) + if (textfont >= 201 && textfont <= 234)
これで make
して、GR.rb で使うために、環境変数も自分でビルドしたほうに設定しておきます。
$ make install $ export GRDIR=/tekitouna/tokoro/
手順② GR.rb にモンキーパッチを当てる
https://github.com/red-data-tools/GR.rb/blob/3667b2226b7390c14bceee93d453bd9de94ebdcb/lib/gr/plot.rb#L567 の GR.settextfontprec(232, 3)
を書き換えたいのでモンキーパッチを書きます。plot_data
メソッドは長いですが変えたいのは 1 行だけです。
module GRExtention def plot_data(_figure = true) ... # ここの数字を、さっき追加したフォントの番号に変える GR.settextfontprec(234, 3) ... end end module GR class Plot prepend GRExtention end end
パッチを呼んで実行すると……
require "gr/plot" require "./gr_extension.rb" continents = ["アフリカ", "アメリカ", "アジア", "ヨーロッパ", "オセアニア"] population_2010 = [1044, 944, 4170, 735, 36] GR.barplot(continents, population_2010, title: "2010年の人口") gets
やったー!
感想
前処理とか Ruby で書くほうが慣れてるので、データを用意してそのままグラフが書けるのはうれしい。あとはフォントサイズ変えるのとか軸ラベルを回転させるとか欲しいなぁと思っている。