LoginSignup
1
1

More than 5 years have passed since last update.

iRuby Notebookでグラフをインラインで描画する方法の調査(chunky_png編)

Last updated at Posted at 2017-02-17

はじめに

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'

Unknown.png

できた!

もう少し調べてみる

もっと簡単な方法がありました(汗)

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"

Unknown.png

...それっぽい(汗)

このNotebookを別のパソコンにコピーして開いてみたら、実行結果をそのまま見ることができました(^-^)

ということは、これを利用してmatplotlibみたいなものを作ればいいのか...

さて、これからどうするかな〜(^_^;)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1