大学の課題で一つのx軸に対して、4本ほどy軸が必要なグラフを書く必要が出てきました。今まで私の大学は課題は基本的に手書きで書く必要があったのですが、コロナ渦のこの現状で手書きレポートの受け渡しは危険があるとのことで、ついにデータでの提出のみになったのですが、その上で気になったのがグラフについてでした。手書きのものをスキャンしてもいいとのことですが、今後研究などを行うにあたってコンピュータ上でグラフ化するスキルは必須となるのは目に見えているので、頑張ってパソコンで作成しようということになりました。
ちなみ日本語を簡単に扱えるということを考えてExcelで行うことも考えたのですが、どうも第2軸までしか拡張できないようで、それよりも多い複数軸を持つものを作成するのは難しいとのことで諦めました。軸が第2軸だけで事足りるならExcelで作ったほうが間違いなく楽です。今回の私のように複数軸あったりするためにどうしてもGnuplotを使わざるを得ないケースだってあるはずです。
そのような経緯でグラフをPCを使って書くことにしたのですが、私が真っ先に思い浮かぶのがGnuplot。私の自作ツールでも使用されている優秀な無償で使えるグラフ作成ツールです。コマンドラインからの操作でグラフを書くのですがそれゆえ文字化けの弊害なども存在します。この文字化けをしない設定と思わぬ落とし穴について解説していきます。
目次
環境
私の環境は以下のようになっています。
- Raspberry Pi4 B 4GB
- Raspbian 32bit
Ubuntuや普通のDebianなどと違って日本語対応が甘いのではないかなどと色々試行錯誤している中で邪推していたのですが、今回はおもわぬ落とし穴にはまってしまっただけでわかっていればあっさり日本語で表示できます。
ちなみにGnuplotではpngで画像を出力しようとしていました。
文字化けの症例
まず私は以下のようなスクリプトを用意しました。外部のexperiment2.tsvというtab文字で区切られたデータファイルを読むようにしました。そのため区切り文字を"\t"としています。そして3行目を読んでの通りpng出力になっています。
reset
set datafile separator "\t"
set terminal png size 1280,720
set output 'test.png'
set multiplot
unset key
set xrange [0:1300]
set xlabel "出力P_o_u_t[W]"
set lmargin screen 0.15
set yrange [0:10.0]
set ytics 1
set ylabel "一次電流I_1[A]" offset 2,0 textcolor rgb 'black'
plot 'experiment2.tsv' using 7:1 with points lt rgb 'red'
set ytics 0.1
set yrange [0:1.0]
set ytics offset -5,0
set ylabel "効率η , 力率cosθ" offset -3,0 textcolor rgb "black"
plot 'experiment2.tsv' using 7:9 with points lt rgb 'blue'
plot 'experiment2.tsv' using 7:10 with points lt rgb 'green'
unset terminal
unset multiplot
exit
さてこれを以下のコマンドで実行し結果を見てみます。
$ gnuplot
gnuplot> load 'test.txt'
結果は以下のようになりました。
なんとなく文字化けしそうだなとは思っていたのですが、やっぱりしました。
検索して対処法を見てみると、UTF-8であることを明記してフォントを設定すればいいらしいとのこと。実際にやってみることにします。先ほどのスクリプトを以下のように変更しました。
reset
set datafile separator "\t"
set font "NotoSerifCJK-SemiBold.ttc,14"
set terminal png size 1280,720 font "NotoSerifCJK-SemiBold.ttc,14" enhanced
set output 'test.png'
set multiplot
unset key
set xrange [0:1300]
set xlabel "出力P_o_u_t[W]"
set lmargin screen 0.15
set yrange [0:10.0]
set ytics 1
set ylabel "一次電流I_1[A]" offset 2,0 textcolor rgb 'black'
plot 'experiment2.tsv' using 7:1 with points lt rgb 'red'
set ytics 0.1
set yrange [0:1.0]
set ytics offset -5,0
set ylabel "効率η , 力率cosθ" offset -3,0 textcolor rgb "black"
plot 'experiment2.tsv' using 7:9 with points lt rgb 'blue'
plot 'experiment2.tsv' using 7:10 with points lt rgb 'green'
unset terminal
unset multiplot
exit
これでフォントを指定したし大丈夫だろうと思っていたのですが、実行結果は以下の画像のようになりました。
なんと日本語だけ表示ができて半角に該当する文字が文字化けするという本末転倒な状態に。
色々調べているとさらっと読み流していましたがあるterminalでは日本語が扱えないとかがあるそうな。pngは一つしかないと思っていましたが何があるのか気になったので以下のコマンドをgnuplot上で入れてterminalのオプションを見てみます。
gnuplot> set terminal
するといかのようにたくさんオプションが表示されます。
Available terminal types:
cairolatex LaTeX picture environment using graphicx package and Cairo backend
canvas HTML Canvas object
cgm Computer Graphics Metafile
context ConTeXt with MetaFun (for PDF documents)
domterm DomTerm terminal emulator with embedded SVG
dumb ascii art for anything that prints text
dxf dxf-file for AutoCad (default size 120x80)
eepic EEPIC -- extended LaTeX picture environment
emf Enhanced Metafile format
emtex LaTeX picture environment with emTeX specials
epscairo eps terminal based on cairo
epslatex LaTeX picture environment using graphicx package
fig FIG graphics language for XFIG graphics editor
gif GIF images using libgd and TrueType fonts
hpgl HP7475 and relatives [number of pens] [eject]
jpeg JPEG images using libgd and TrueType fonts
latex LaTeX picture environment
lua Lua generic terminal driver
mf Metafont plotting standard
mp MetaPost plotting standard
pcl5 HP Designjet 750C, HP Laserjet III/IV, etc. (many options)
Press return for more:
pdfcairo pdf terminal based on cairo
png PNG images using libgd and TrueType fonts
pngcairo png terminal based on cairo
postscript PostScript graphics, including EPSF embedded files (*.eps)
pslatex LaTeX picture environment with PostScript \specials
pstex plain TeX with PostScript \specials
pstricks LaTeX picture environment with PSTricks macros
qms QMS/QUIC Laser printer (also Talaris 1200 and others)
qt Qt cross-platform interactive terminal
sixelgd sixel using libgd and TrueType fonts
svg W3C Scalable Vector Graphics
tek40xx Tektronix 4010 and others; most TEK emulators
tek410x Tektronix 4106, 4107, 4109 and 420X terminals
texdraw LaTeX texdraw environment
tgif TGIF X11 [mode] [x,y] [dashed] ["font" [fontsize]]
tikz TeX TikZ graphics macros via the lua script driver
tkcanvas Tk canvas widget
tpic TPIC -- LaTeX picture environment with tpic \specials
unknown Unknown terminal type - not a plotting device
vttek VT-like tek40xx terminal emulator
wxt wxWidgets cross-platform interactive terminal
x11 X11 Window System interactive terminal
Press return for more:
xlib X11 Window System (dump of gnuplot_x11 command stream)
xterm Xterm Tektronix 4014 Mod
よくみるとpngcairoなるterminalが存在することが判明します。よくよく調べるとcairo系のターミナルなら日本語を扱えるとのこと。「cairo系のターミナル"なら"」ということはpngのterminalではそもそも日本語が使えないのでは?と思いました。
日本語表示をするための解決方法
色々変更を加えていましたが、最初のスクリプトの3行目だけを変更して以下のようなファイルにしてみます。
reset
set datafile separator "\t"
set terminal pngcairo size 1280,720
set output 'test.png'
set multiplot
unset key
set xrange [0:1300]
set xlabel "出力P_o_u_t[W]"
set lmargin screen 0.15
set yrange [0:10.0]
set ytics 1
set ylabel "一次電流I_1[A]" offset 2,0 textcolor rgb 'black'
plot 'experiment2.tsv' using 7:1 with points lt rgb 'red'
set ytics 0.1
set yrange [0:1.0]
set ytics offset -5,0
set ylabel "効率η , 力率cosθ" offset -3,0 textcolor rgb "black"
plot 'experiment2.tsv' using 7:9 with points lt rgb 'blue'
plot 'experiment2.tsv' using 7:10 with points lt rgb 'green'
unset terminal
unset multiplot
exit
3行目のpngをpngcairoに変えただけです。これを実行すると以下のようなグラフが出力されました。
これで日本語表示ができるようになりました。gnuplotはバージョンや環境によって動作や、記述の方法が少し違っているためRaspberry Piのような日本語が貧弱なOSだからこそかと思っていたのですが、たった1行を変えるだけで良かったというオチです。もともとpngcairoを設定していれば何も特別なことをしなくても日本語で表示できたはずだったのですが、運悪く?私はpngを選択してしまったためにこんな沼にはまっていました。
まとめるとこの掲載しているスクリプトのキモは3行目の、
set terminal pngcairo
であり、pngcairoとしていれば何の不自由もなく日本語で非表示が可能です。Raspberry Piならではの先入観がもたらした悲劇だったのですが、他の方も解決できていない方もいらっしゃったのでいつかこの記事が役に立つ日がきたらうれしいですね。
まじで助かりました
ありがとうございます
大学の課題で全く説明が無いままこれをやれと言われたので行き詰まっていました
これからも頑張ってください
コメントありがとうございます。
私が大学生だったときに書いた内容で、誰かの役に立ったらいいなと思って書いた記事ですね。
本当に誰かの役に立てるとは思っていなったので、こんな声を頂けるとは嬉しい限りです。
大学の課題、頑張ってください!