gnuplot でグラフ一例…

一応ね。

python curses でグラフ…」で言ったこと:

一連の COVID19 ネタは「良い見える化とそれの共有」の話で、「ほらね今やこういうのって簡単なのさぁ」みたいなことで pygal にも触れたわけなんだけれど

同じくレガシーな gnuplot の話も一応やっとこうかと。レガシーといっても、まぁ ffmpeg なんぞと同じで、今でも活発に進化してるし、別にプアなわけではない。というか、かなりリッチなグラフは書ける。

トータルで「手軽だ」と言えるかどうかは、狙い通りのグラフを自在に書きやすいかどうか、なので、gnuplot がそれに当たるかどうかは判断が難しいところなんだけれど、ただ、「最も簡単なタイプのグラフを手っ取り早く」の意味だと結構最速に近くて、たとえば:

gnuplot_example.py
 1 # -*- coding: utf-8 -*-
 2 import io
 3 import csv
 4 import datetime
 5 
 6 
 7 def _togp(fn):
 8     def _f(d):
 9         if not d or d == "-":
10             return float("nan")
11         return float(d)
12     print("""\
13 set terminal png size 1920,1080
14 set output 'effectiveReproductionNumber.png'
15 
16 set title '`effectiveReproductionNumber` from: Toyo Keizai Online "Coronavirus Disease (COVID-19) Situation Report in Japan"'
17 set timefmt "%Y-%m-%d"
18 set xdata time
19 set format x "%Y\\n%m/%d"
20 set ytics 0.1
21 set size square
22 set grid
23     plot '-' using 1:2 with lines lc 'blue' title 'Tokyo', '-' using 1:2 with lines lc 'red' title 'Osaka'""")
24     for target_pn in ("東京都", "大阪府"):
25         reader = csv.reader(io.open(fn, encoding="utf-8-sig"))
26         next(reader)
27         era = datetime.date(2020, 1, 16)
28         for line in reader:
29             if line[3] != target_pn:
30                 continue
31             date = datetime.date(*map(int, line[:3]))
32 
33             # testedPositive, peopleTested, hospitalized, serious, discharged, deaths, effectiveReproductionNumber
34             data = list(map(_f, line[5:]))
35             pd = [date] + [data[-1]]
36             print(("{} " * (len(pd))).format(*pd))
37         print("e")
38 
39 
40 if __name__ == '__main__':
41     fn = "prefectures.csv"  # https://toyokeizai.net/sp/visual/tko/covid19/
42     _togp(fn)
1 [me@host: ~]$ python gnuplot_example.py | gnuplot

effectiveReproductionNumber
凝ったことをしようと思い始めればやはり学習曲線は急カーブを描くことにはなるけれど、このように一番シンプルなケースでは、見ての通り結構簡単。データをほとんどそのまま流し込めるし、標準入力から gnuplot スクリプトを受け取ってくれるので、今の例の場合の python スクリプトをシンプルに保てる(つまり print で stdout に書き出すだけ)。

matplotlib ほどではないものの、gnuplot も「demos」から始めれば、まぁまぁすぐに手始められると思う。

2021-04-12追記:
すまん、ヘンだと思ってたのだ。意図してたのは、上のスクリプトの「set size square」を取り除いたもの。この行がなければ、図はこうなる:
effectiveReproductionNumber_
square が意図の場合もあるだろうけれど、ワタシの意図はそうではなかった。いつもながらだが、教訓:「理解して猿真似べよ」。

gnuplot を知っている人とそうでない人てのはきっと、「ソフトウェアエンジニアかどうか」とは全く無関係なんだろうなと思う。

かなり歴史があり、なおかつ(matplotlibなんかと同じく)自然科学系分野で良く使われるので、もしかすると理系の大学なんかでは「基礎知識」くらいの扱いになってるところも結構あるんじゃないかと思うのだが、逆に言えばそうしたところ以外では、名前すら聞いたことがない、という人のほうが多かろう。

matplotlib、gnuplot、統計解析パッケージの「R」、… などについて、さすがに「猿でもわかるほど簡単簡単」、とは言わない。けれどいずれも「フリーでなおかつ容易に入手可能で、あらゆるプラットフォームで動作する」点は共通なわけで、ゆえに「誰の手にも届く」ものである。何を使うんでもいいんだけれど、ただ、個人的には「可視化のための道具」に対しては、アンテナを高く張っておいたほうが色々自分のためにも周りの人のためにもいいんじゃないのかな、て思うんだ。今は COVID-19 の話を主題に「見える化ろうぜ」と言っているけれど、「見える化のためのスキル」って、いつでもどこででも役に立つのじゃないのかな、って思うわけ。

それと、ワタシがこうしたものを紹介してるからといって「excel で」みたいなアプローチを馬鹿にしないで欲しい。たまたまワタシが使わないだけであって、結構色んなグラフを描ける。Google Drive のワークシートでもグラフを描ける。それら、もっと取っつきやすいやつもそのうち見せてあげられたらいいかなとは思ってるんだけどね…。(これらって、「WYSWYG」が邪魔でちょっと精神披露しやすいてのがあって、ワタシは億劫に感じちゃうのよねぇ…。なかなか着手しないのはそれが理由。)


2021-06-14追記:
おそらく誰も気付いてなかったと思うけど、ここに「R」の例を書いていた。ここに書いてあったのは明らかにおかしかったけれど、大した内容でもなかったので最初はそれでも良かった。ただ、rpy2 について追記したくなって、そうなるとやっぱりここにいちゃいかんなと。てことで、独立させた