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분의 컴파일 시간이 필요하다.

좋은 웹페이지 즐겨찾기