我需要可视化一些数据。它是基本的2D网格,其中每个单元格都有浮点值。我知道怎么做在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
答案 0 :(得分:45)
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()
这就是它的样子:
颜色条设置的详细信息来自matplotlib示例:colorbar_only.py.它解释了boundaries
的数量需要比颜色数量大一个。
编辑
您应该note,imshow
接受origin
关键字,该关键字设置第一个点的分配位置。默认为“左上角”,这就是为什么在我的贴图中,y轴左上角为0,左下角为99(未显示)。另一种方法是设置origin="lower"
,以便在左下角绘制第一个点。
编辑2
如果您想要渐变而不是离散的颜色贴图,请通过linearly interpolating通过一系列颜色制作颜色贴图:
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")
这会产生:
编辑3
要添加网格(如example所示),请使用grid
方法。将网格颜色设置为“白色”与色彩图使用的颜色配合得很好(即默认黑色不能很好地显示)。
pyplot.grid(True,color='white')
在savefig
调用之前包含此内容会产生此图(为清晰起见,使用11x11网格制作):
grid
有很多选项,matplotlib documentation中对此进行了描述。您可能感兴趣的是linewidth
。
答案 1 :(得分:8)
使用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()
这表明: