ようじょのおえかきちょう

ふぇぇ お医者さんにペン持ったらダメっていわれた〜〜

Ruby でグラフ描く GR.rb をつかってみた(がんばって日本語を表示する手順)

今まで Ruby で PyCall を呼んで matplotlib でグラフ描いてたんですが、GR.rb っていうのができたらしいので使ってみました。

qiita.com

github.com

インストール

$ 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

f:id:yamasy1549:20200514174325p:plain

良さそう!

日本語のテキストを表示する

グラフに日本語を出したいことが多い、というかほとんどの場合日本語で出したいので、これもやってみます。

require "gr/plot"

continents = ["アフリカ", "アメリカ", "アジア", "ヨーロッパ", "オセアニア"]
population_2010 = [1044, 944, 4170, 735, 36]

GR.barplot(continents, population_2010, title: "2010年の人口")
gets

f:id:yamasy1549:20200514174624p:plain

なんてすてきな豆腐!

手順① GR をいじる

GR.rb には任意のフォントを指定する機能がなさそうだったので、GR をいじりました。

github.com

# ソースを手元に用意する
$ 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#L567GR.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

f:id:yamasy1549:20200514183447p:plain

やったー!

感想

前処理とか Ruby で書くほうが慣れてるので、データを用意してそのままグラフが書けるのはうれしい。あとはフォントサイズ変えるのとか軸ラベルを回転させるとか欲しいなぁと思っている。