TikZ & PGFPlots でカラーマップを作図する.


はじめに.

TikZ と PGFPlots を用いて,データファイルを取り込み,下図のようなカラーマップを作成します.
使用するエンジンは Version 1.10.0 (TeX Live 2019) です.XeTeXなどでもできるかもしれません.しかしプロットするデータ数が大きい場合,XeTeXでは作図できない場合があります.

作図するデータの作成.

今回プロットするデータは,C言語を用いて,-1 以上かつ 0.5 以下の範囲の乱数を出力させることで用意しました.使用したコードは以下の通りです.

main.c
#include<stdio.h>
#include<stdlib.h>
int main(){
 FILE *fp;
 srand(0);
 int i,j;
 fp=fopen("out.dat","w");
 for(i=0;i<5;i++){
  for(j=0;j<5;j++)fprintf(fp,"%d\t%d\t%4.3f\n",i,j,(double)rand()/RAND_MAX*2*3/4-1);
  fprintf(fp,"\n");
 }
 fclose(fp);
 return 0;
}

このプログラムによって得られるデータファイルは,次のようなフォーマットです.

0   0   -0.636
0   1   -0.980
0   2   -0.425
0   3   -0.378
0   4   -0.898

1   0   0.490
1   1   -0.274
(中略)
4   3   -0.603
4   4   -0.434

TikZ & PGFPlots で作図.

次のコードファイルを用意します.

main.tex
\documentclass[crop,border=2pt,tikz]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{colorbrewer}
\usetikzlibrary{pgfplots.colormaps}
\pgfplotsset{compat=newest,compat/show suggested version=false}

\begin{document}
 \begin{tikzpicture}
 \begin{axis}[
  xmin=-0.5,xmax=4.5,ymin=-0.5,ymax=4.5,
  point meta min=-1, point meta max=1,
  enlargelimits=false,
  axis equal image=true,
  view={-90}{90}, %原点(0,0)を左下に設定したい.
  matrix plot,
  colormap/PiYG-11,
  colorbar,
  ]
 \addplot3[surf]table{out.dat};
 \end{axis}
 \end{tikzpicture}
\end{document}

このファイルをLuaTeXでコンパイルすると,本記事の最上部に挙げた図がPDFで出力されます.

ワンポイントアドバイス.

データを作成する際に,乱数を範囲 -1 以上かつ 0.5 以下で生成しました.PGFPlots のマニュアル(32頁)に,

PGFPLOTS computes the minimum and maximum value of all such numbers. Then, it maps every number into a colormap.

とある通り,PGFPlotsではデータの最大値と最小値を計算し,その間でカラーマップの色を割り当てます.したがってデフォルトの設定で -1 以上かつ0.5 以下のデータをプロットしようとすると,「+1を緑,-1を赤,0を白」に設定することができません.このプロットを可能にする設定が,[point meta min=-1, point meta max=1] なのです.

gnuplot との違い

TikZ & PGFPlots でなくとも,たとえばgnuplotでも作図することができます.私が試したところ,データ数が少ない場合はgnuplotでプロットしても問題ありませんでした.しかし,データ数が多い場合(カラーマップの一辺が100セル以上だと),gnuplotではひとつひとつのセルがくっきりと表せませんでした.解像度を上げる設定をしてプロットしてみても,やはり私の意図通りのプロットにはなりませんでした.ひとつひとつのセルが正方形ではなくぼやっとした円に見えます.
一方でgnuplotならではの良さもあります.データ数が多いカラーマップ(カラーマップの一辺が100セル程度)をプロットする場合は,TikZ & PGFPlots でプロットするために1,2分のコンパイル時間がかかります.gnuplot では3秒程度で作図できるのに.