はじめに
Jupyter Notebookはインタラクティブにスクリプトの開発ができる素晴らしい開発環境なのですが、iRubyとして動作させると少し機能に見劣りするところが無きにしも非ず。
とりわけ、グラフを描画する部分について、幾つかライブラリがあるもののエクスポートを行う場合には、受け取り側でも同じライブラリがないと閲覧することができないという状況で、少し不便。
[参考ライブラリ]
https://github.com/domitry/nyaplot
https://github.com/rdp/ruby_gnuplot
ということで、Pythonでmatplotlibを使った時のようにNotebookに保存できるグラフ環境が準備できないか調査してみましたので、その結果をまとめます。
Pythonはどうなっているの?
Pythonでグラフを描画したNotebookをHTMLでエクスポートして、ソースを確認してみると、グラフの部分は以下のようになっていました。
<img src='data:image/png;base64,iVBORw0KGgoAA...中略...ErkJggg==' />
pngの画像データをbase64で変換し、テキストデータで保存しているようです。
では、Rubyで同じようにできるライブラリが無いか探してみます。
chunky_png
ピュアRubyのライブラリがあったので、インストールしてみます。
$ gem install chunky_png
適当に線を描画して出力してみる
require 'chunky_png'
width = 500
height = 200
png = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
png.line(0, 0, width, height, ChunkyPNG::Color.from_hex('#aa007f'))
png.to_blob
実行結果は...
"\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00...中略...\x00\x00IEND\xAEB`\x82"
見れません(汗)
少し調べてみると、IRuby.displayというのが使えそうだったので、以下のように追記してみます。
require "base64"
src = 'data:image/png;base64,' + Base64.strict_encode64(png.to_blob)
IRuby.display "<img src='#{src}' />", mime: 'text/html'
できた!
もう少し調べてみる
もっと簡単な方法がありました(汗)
IRuby.display png.to_blob, mime: "image/png"
グラフっぽいものを描画してみる
require 'chunky_png'
width = 500
height = 200
png = ChunkyPNG::Image.new(width, height, ChunkyPNG::Color::TRANSPARENT)
png.line(0, 0, 0, height, ChunkyPNG::Color.from_hex('#aa007f'))
png.line(0, 0, width, 0, ChunkyPNG::Color.from_hex('#aa007f'))
y = [10, 20, 5, 30, 15, 50]
y_max = y.max()
y_min = y.min()
y_size = y.size
y_buff = y[0]
y_rate = height / (y_max - y_min)
(1..y.size-1).each do |val|
x0 = width / y_size * (val - 1)
x1 = width / y_size * val
png.line(x0, (y_buff - y_min) * y_rate, x1, (y[val] - y_min) * y_rate, ChunkyPNG::Color.from_hex('#aa007f'))
y_buff = y[val]
end
IRuby.display png.to_blob, mime: "image/png"
...それっぽい(汗)
このNotebookを別のパソコンにコピーして開いてみたら、実行結果をそのまま見ることができました(^-^)
ということは、これを利用してmatplotlibみたいなものを作ればいいのか...
さて、これからどうするかな〜(^_^;)