5

txtファイルとして2dデータ(30K)のセットがあります。

  X       Y
2.50    135.89
2.50    135.06
2.50    110.85
2.50    140.92
2.50    157.53
2.50    114.61
2.50    119.53
2.50    154.14
2.50    136.48
2.51    176.85
2.51    147.19
2.51    115.59
2.51    144.57
2.51    148.34
2.51    136.73
2.51    118.89
2.51    145.73
2.51    131.43
2.51    118.17
2.51    149.68
2.51    132.33

gnuplot で散布図としてプロットしましたが、heatmap2d または密度分布として表現したいと思います。私は MatPlotLib または R の例を調べましたが、それらはすべて、画像を生成するためのランダム データから既に始まっているようです。

これらのコードを試してみたところ、このようなエラーが発生しました

hist、edges = histogramdd([x,y]、bins、range、normed、weights)

AttributeError: ビンの​​次元は、サンプル x の次元と等しくなければなりません。スクリプトが終了しました。

txtファイルを開いて、このデータをgnuplot、matplotlibにプロットする方法はありますか? 私の散布図は次のようになります ここに画像の説明を入力

この画像を等高線図または密度図としてカラー コード バー付きで表示したいと考えています。私のx軸は2.5-3.5の範囲で、y軸は110-180の範囲で、30kのデータポイントがあります

4

2 に答える 2

2

これは、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 スクリプトで) 改善すべき部分がいくつかあるかもしれませんが、動作するはずです。あなたが示したいくつかのデータポイントでは見栄えが悪いため、結果の画像は投稿しません;)

于 2013-08-30T09:00:35.597 に答える