Mathematicaで論文用の図やグラフを作成するときのまとめ

Mathematicaで作る図やグラフは美しいんだ!ということを伝えたいので、 もう数年も前になるが、修士論文を書くときにMathematicaで作るグラフにこだわった点を思い出しながらまとめてみる。

論文を書くために使うソフトウェア

私はpLaTeXで論文を書いたが、研究室ではWordが推奨されていた。 図表の番号を管理する必要や図表の位置がずれて飛んでいってしまうといった事態も起きないし、目次や索引、参考文献リストの作成も自動でできる。 ただ、Wordだと添削をしやすいのは確か。

MathematicaでExportする画像の形式

Mathematicaでは多様な画像ファイル形式でExportできるが、論文用のグラフでは多分PNG、EPS、PDFから選択することになると思う。 各画像形式を比較すると、それぞれ以下の特徴がある。

  • PNG
    • ラスタ形式のため、印刷に耐えられるようにするには予め解像度を計算して作成する必要がある
    • 半透過色に対応
    • Word、pLaTeXどちらでも使える
  • EPS
    • ベクタ形式で保存できるため、印刷では自動的にプリンタの解像度で印刷してくれる
    • 半透過色には非対応
    • pLaTeXで使用可
    • あまりにEPS画像が多いと、dvipdfm(x)が重くなるので注意
  • PDF
    • ベクタ形式で保存できる
    • 半透過色に対応
    • pLaTeXで使用可
    • pLaTeXで使うには、予めebbやxbbで.bbファイルや.xbbファイルを作成して、pLaTeXに画像の大きさを知らせる必要がある

したがって、Wordでは基本的に画像をPNG形式で作ることになるが、pLaTeXではEPSやPDFといったベクタ形式の画像フォーマットが使えるのでおすすめ。

私は基本的にMathematicaからPDFでグラフを作成し、 すべての画像に対してpLaTeXについてくるebbを実行するPerlスクリプトを作って実行してからpLaTeXでコンパイルしていた。

もちろん写真はJPEG形式を使用したが、写真にいろいろ矢印や記号を書き加えるときはOpenOffice.orgのImpressでJPEG画像の上にいろいろ矢印などを書き込んでPDFにエクスポートしたものを使った。 当時はPowerPointではPDF出力できなかったためOpenOffice.orgを使ったが、今ではPowerPointでいいと思う。

図・グラフの論文におけるサイズを決め、ImageSizeオプションを指定

おそらくほとんどの論文はA4サイズ(210mm×297mm)で作成されると思う。

そこから左右の余白をそれぞれ30mmとすると、本文の幅は150mmとなる。 図やグラフの幅は本文より少し小さくしたいので、私は基本的に横幅140mmでグラフを作成した。

縦幅はMathematicaではデフォルトで黄金比(GoldenRatio)を使ってくれるので、そのままで良いと思う。 2段組のときは半分の70mmとか65mmとなる。

したがってMathematicaでは、PlotShowなどのオプションImageSize

ImageSize -> 140 * 72 / 25.4

と指定する。これは140mmの横幅で、72dpi(dots per inch)、1 inch = 25.4mmという意味である。

論文用のグラフでは絶対にFrame -> Trueを指定する

論文用のグラフでは流儀として

Frame -> True

を指定して枠のついたグラフにする。

これはExcelなどでグラフを作るときも同様。

枠についた目盛りを細かく調整したい場合は、FrameTicksオプションとFrameTickesStyleオプションを指定する。 また、FrameLabelで各軸のラベルと単位を書き入れるのも忘れずに。

テキストを指定する部分はすべてフォント名やフォントサイズを指定する

これは本文に使う本文のフォントとフォントサイズとの兼ね合いとなる。 私は本文にTimes New Roman、10.5ptを使用したが、グラフでもこれと同じようにするため、

Style["AbBbCc", 10.5, FontFamily -> "Times New Roman"]

とした。ちなみにデフォルトではCourierとなる。

研究室や教授の考え方によっては、本文と違うゴシック体を使うように言われるかもしれないが、 重要なのは、すべての箇所で統一することである(もちろん見にくい箇所は適切に修正する)。

よくある指定する箇所としては、FrameLabelFrameStyleなどである。 その他凡例などをEpilogInsetで入れる場合にもすべて忘れずに指定する。

すべての線の太さはAbsoluteThicknessで指定する

線の太さをThicknessで指定するとグラフ全体の大きさに対して線の太さが決まってしまう。 上では基本的に横幅140mmでグラフを作成すると書いたが、ふつう論文ではグラフだけ2段組にしたり、 情報量が多いグラフは見やすくするために大きくしたりするので、グラフの大きさはバラバラになってしまう。

そうなると線の太さが統一されないので、必ずAbsoluteThicknessを使ってポイント単位で指定する。

白黒印刷されても違いがわかるようにPlotStyleを指定する

1つのグラフに複数の線がある場合は、デフォルトでは色が変わっていくだけだが、 論文ではDashedDottedDotDashedなどを使って点線、破線などにする他、 それでも足りなければAbsoluteThicknessで太さを変えるなどして、白黒印刷されても違いを判別できるようにする。

もちろん論文内では使い方の順序を統一する。

ちなみに、デフォルトで使われる色は

ColorData[1, "ColorList"]

で取得できる。

凡例はPlotLegends`パッケージを使うか、Epilogオプションに自前で作って加える

論文で使うグラフに凡例は必須なので、PlotLegendsパッケージをロードして、PlotなどのPlotLegendオプションなどを指定する。

PlotLegendsパッケージには凡例のスタイルや位置を決めるためのオプションが色々あるものの、 思い通りの凡例を作るのは結構大変なので、 Epilogオプションに自前で凡例を作ったものを入れるほうが手っ取り早いかもしれない。

PNGを作成するときは一旦PDFにExportして、ImageMagickなどで変換する

グラフの余白部分やFrameTicksの目盛りの長さなどは、グラフ全体の大きさが変わった時に変化してしまう。 PNG画像にするときは、Mathematicaからは一旦PDFで出力しておき、ImageMagickなどを使って

convert -density 300 ***.pdf ***.png

と、印刷時の解像度(この例では300dpi)を指定してPNGに変換する。

Wordの場合、PNG画像を挿入した後、プロパティからサイズを上で決めた140mmなどと指定する。 どうしても直接PNGにExportするときはImageResolutionを指定する

ImageMagickでは日本語の文字が入っている時にきれいにPNGに変換できないことがあるので、 どうしてもMathematicaからPNGでExportせざるを得ないときは、 印刷するときの解像度をImageResolutionに指定する。

例えば300dpiで印刷しようとするときは、

ImageResolution -> 300

と指定してPNGファイルをExportする。

Sin[x]Cos[x]のグラフを凡例付きでグラフにする。

  • 横幅は140mmとし、縦横比は黄金比(デフォルト)
  • グラフの線の太さは1.5ポイント
  • 枠線や目盛りの太さは0.5ポイント
  • ラベルや凡例、枠目盛りのフォントはTimes New Roman、10.5ポイント
  • 凡例の作成にはPlotLegendsパッケージを使用
  • PDFでExportし、それをImageMagickでPNGに変換

としたときのサンプル。

<< PlotLegends`
g = Plot[{Sin[x], Cos[x]}, {x, 0, 2 Pi},
  Axes -> {True, False},
  AxesStyle -> Directive[Black, AbsoluteThickness[0.5]],
  Frame -> True,
  FrameStyle -> AbsoluteThickness[0.5],
  FrameTicksStyle -> Directive[
    AbsoluteThickness[0.5],
    FontFamily -> "Times New Roman",
    FontSize -> 10.5
    ],
  FrameLabel -> {
    Style["x label", 10.5, FontFamily -> "Times New Roman"],
    Style["y label", 10.5, FontFamily -> "Times New Roman"]
    },
  ImageSize -> 140*72/25.4,
  PlotRange -> {{0, 2 Pi}, Full},
  PlotStyle -> {AbsoluteThickness[1.5], 
    Directive[AbsoluteThickness[1.5], Dotted]},
  PlotLegend -> {
    Style["sine curve", 10.5, FontFamily -> "Times New Roman"],
    Style["cosine curve", 10.5, FontFamily -> "Times New Roman"]
    },
  LegendBorderSpace -> 0.2,
  LegendBorder -> Directive[Black, AbsoluteThickness[0.5]],
  LegendPosition -> {0.05, 0.25},
  LegendShadow -> None,
  LegendSize -> 0.5,
  LegendSpacing -> 0,
  LegendTextSpace -> 3
  ]
Export["graph001.pdf", g]‡
Run["convert -density 300 graph001.pdf graph001.webp"]