これは、Python の前処理と gnuplot を使用したプロットで行う方法です。
バリアント 1
最初のバリアントは、gnuplot のpm3d
プロット スタイルで動作します。これにより、ヒストグラム データの適切な補間が可能になり、画像がより滑らかに見えます。ただし、出力画像形式によっては、大きなデータセットで問題が発生する場合があります (バリアント 2 を参照)。
Python スクリプトprocess.py
を使用numpy.histogram2d
してヒストグラムを生成し、出力は gnuplot のnonuniform matrix
形式で保存されます。
# process.py
from __future__ import print_function
import numpy as np
import sys
M = np.loadtxt('datafile.dat', skiprows=1)
bins_x = 100
bins_y = 100
H, xedges, yedges = np.histogram2d(M[:,0], M[:,1], [bins_x, bins_y])
# output as 'nonuniform matrix' format, see gnuplot doc.
print(bins_x, end=' ')
np.savetxt(sys.stdout, xedges, newline=' ')
print()
for i in range(0, bins_y):
print(yedges[i], end=' ')
np.savetxt(sys.stdout, H[:,i], newline=' ')
print(H[-1,i])
# print the last line twice, then 'pm3d corners2color' works correctly
print(yedges[-1], end=' ')
np.savetxt(sys.stdout, H[:,-1], newline=' ')
print(H[-1,-1])
プロットするには、次の gnuplot スクリプトを実行するだけです:
reset
set terminal pngcairo
set output 'test.png'
set autoscale xfix
set autoscale yfix
set xtics out
set ytics out
set pm3d map interpolate 2,2 corners2color c1
splot '< python process.py' nonuniform matrix t ''
バリアント 2
2 番目のバリアントは、大規模なデータ セット (大規模なヒストグラム サイズ) に適している可能性があるプロット スタイルで動作しますが、たとえばマトリックスの場合image
は見栄えがよくありません。100x100
# process2.py
from __future__ import print_function
import numpy as np
import sys
M = np.loadtxt('datafile.dat', skiprows=1)
bins_x = 100
bins_y = 200
H, xedges, yedges = np.histogram2d(M[:,0], M[:,1], [bins_x, bins_y])
# remap xedges and yedges to contain the bin center coordinates
xedges = xedges[:-1] + 0.5*(xedges[1] - xedges[0])
yedges = yedges[:-1] + 0.5*(yedges[1] - yedges[0])
# output as 'nonuniform matrix' format, see gnuplot doc.
print(bins_x, end=' ')
np.savetxt(sys.stdout, xedges, newline=' ')
print()
for i in range(0, bins_y):
print(yedges[i], end=' ')
np.savetxt(sys.stdout, H[:,i], newline=' ')
print()
プロットするには、次の gnuplot スクリプトを実行するだけです:
reset
set terminal pngcairo
set output 'test2.png'
set autoscale xfix
set autoscale yfix
set xtics out
set ytics out
plot '< python process2.py' nonuniform matrix with image t ''
(特に Python スクリプトで) 改善すべき部分がいくつかあるかもしれませんが、動作するはずです。あなたが示したいくつかのデータポイントでは見栄えが悪いため、結果の画像は投稿しません;)
。