Raspberry PiのGnuplotで日本語を使う。凡例の日本語表示と落とし穴

大学の課題で一つの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ならではの先入観がもたらした悲劇だったのですが、他の方も解決できていない方もいらっしゃったのでいつかこの記事が役に立つ日がきたらうれしいですね。

2件のコメント

  1. まじで助かりました
    ありがとうございます
    大学の課題で全く説明が無いままこれをやれと言われたので行き詰まっていました
    これからも頑張ってください

    1. コメントありがとうございます。

      私が大学生だったときに書いた内容で、誰かの役に立ったらいいなと思って書いた記事ですね。
      本当に誰かの役に立てるとは思っていなったので、こんな声を頂けるとは嬉しい限りです。
      大学の課題、頑張ってください!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です