web-dev-qa-db-ja.com

Pythonでの2Dグリッドデータの視覚化

データを視覚化する必要があります。これは基本的な2Dグリッドで、各セルにはfloat値があります。私は例えばOpenCVで値とペイントグリッドに色を割り当てます。しかし、ここでのポイントは、非常に多くの値があるので、それを行うことはほぼ不可能です。勾配を使用できる方法を探しています。たとえば、値-5.0は青、0-黒、+ 5.0は赤で表されます。 Pythonでそれを行う方法はありますか?

ここに私が話しているサンプルデータがあります

        A       B       C        D
A    -1.045    2.0     3.5    -4.890
B    -5.678    3.2     2.89    5.78
26

Matplotlib には、配列をプロットするためのimshowメソッドがあります。

import matplotlib as mpl
from matplotlib import pyplot
import numpy as np

# make values from -5 to 5, for this example
zvals = np.random.Rand(100,100)*10-5

# make a color map of fixed colors
cmap = mpl.colors.ListedColormap(['blue','black','red'])
bounds=[-6,-2,2,6]
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

# tell imshow about color map so that only set colors are used
img = pyplot.imshow(zvals,interpolation='nearest',
                    cmap = cmap,norm=norm)

# make a color bar
pyplot.colorbar(img,cmap=cmap,
                norm=norm,boundaries=bounds,ticks=[-5,0,5])

pyplot.show()

これは次のようになります。

enter image description here

カラーバーのセットアップの詳細は、matplotlibの例から取られました: colorbar_only.py. これは、boundariesの数が色の数よりも1つ大きい必要があることを説明しています。

[〜#〜] edit [〜#〜]

imshowOriginキーワードを受け入れ、最初のポイントが割り当てられる場所を設定することに注意してください note 。デフォルトは「左上」です。このため、投稿したプロットでは、y軸の左上に0が、左下に99(図示せず)があります。別の方法は、Origin="lower"を設定して、最初のポイントが左下隅にプロットされるようにすることです。

EDIT 2

個別のカラーマップではなくグラデーションが必要な場合は、一連の色を linearlypolpolating して、カラーマップを作成します。

fig = pyplot.figure(2)

cmap2 = mpl.colors.LinearSegmentedColormap.from_list('my_colormap',
                                           ['blue','black','red'],
                                           256)

img2 = pyplot.imshow(zvals,interpolation='nearest',
                    cmap = cmap2,
                    Origin='lower')

pyplot.colorbar(img2,cmap=cmap2)

fig.savefig("image2.png")

これにより、以下が生成されます。 enter image description here

EDIT 3

この example に示すように、グリッドを追加するには、gridメソッドを使用します。グリッドの色を「白」に設定すると、カラーマップで使用される色でうまく機能します(つまり、デフォルトの黒はうまく表示されません)。

pyplot.grid(True,color='white')

savefig呼び出しの前にこれを含めると、次のプロットが生成されます(わかりやすくするために11x11グリッドを使用して作成)。 enter image description here gridには多くのオプションがあり、matplotlib documentation で説明されています。興味のある方はlinewidthです。

48
Yann

Matplotlibを使用してはどうですか?

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = Axes3D(fig)

Z = np.array([[-1.045, 2.0, 3.5, -4.890],
              [-5.678, 3.2, 2.89, 5.78]])

X = np.zeros_like(Z)
X[1,:] = 1
Y = np.zeros_like(Z)
Y[:,1] = 1
Y[:,2] = 2
Y[:,3] = 3

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
ax.set_zlim3d(-10.0, 10.0)

ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))

m = cm.ScalarMappable(cmap=cm.jet)
m.set_array(Z)
fig.colorbar(m)

plt.show()

これは示しています:

enter image description here

9
jterrace