matplotlib pcolormesh 离散色彩

1 投票
1 回答
5093 浏览
提问于 2025-04-29 14:21
from matplotlib.pyplot import *
import numpy as np

x      = np.linspace( 1., 4., 2 )
y      = np.linspace( 1., 2., 2 )
x,y    = np.meshgrid( x, y )
z      = np.array( [ [ 0.5, 1.5 ], [ 2.5, 3.5 ] ] )
cmap   = matplotlib.colors.ListedColormap( [ 'r', 'y', 'g', 'b' ] )
bounds = [ 0.,  1.,  2.,  3.,  4. ]
ticks  = [ 0.5, 1.5, 2.5, 3.5 ]
norm   = matplotlib.colors.BoundaryNorm( bounds, cmap.N )
fig    = figure( figsize = ( 20, 10 ) )
ax     = fig.add_subplot( 111 )
ax.pcolormesh( x, y, z, cmap = cmap, norm = norm )
ax.axis( [ x.min(), x.max(), y.min(), y.max() ] )
ax.set_xlabel( 'x' )
ax.set_ylabel( 'y' )
m      = cm.ScalarMappable( cmap = cmap )
m.set_array( z )
cbar   = fig.colorbar( m, norm = norm, boundaries = bounds, aspect = 20, ticks = ticks )
cbar.set_ticklabels( [ 'A', 'B', 'C', 'D' ] )
show()

根据z的值,我想要一个有4种颜色的网格。因为第一个z的值是0.5,正好在[0., 1.]这个区间内,所以我希望它显示为红色,第二个则是黄色,依此类推。

颜色条已经完美地显示了我想要的效果,但图表本身却不对。

我可能在使用BoundaryNorm的时候搞错了什么?

暂无标签

1 个回答

1

这样做就可以了:

from matplotlib.pyplot import *
import numpy as np

x = np.linspace(1.,4.,3)
y = np.linspace(1.,2.,3)
x,y = np.meshgrid(x,y)
z = np.array([[0.5,1.5],[2.5,3.5]])
cmap = matplotlib.colors.ListedColormap(['r', 'y', 'g', 'b'])
bounds = [0.,1.,2.,3.,4.]
ticks = [0.5,1.5,2.5,3.5]
norm = matplotlib.colors.BoundaryNorm(bounds, cmap.N)
fig = figure(figsize = (20,10))
ax = fig.add_subplot(111)
p = ax.pcolormesh(x,y,z, cmap=cmap, norm = norm, vmin=0, vmax=4)
ax.axis([x.min(),x.max(),y.min(),y.max()])
ax.set_xlabel('x')
ax.set_ylabel('y')
cbar = fig.colorbar(p, norm = norm, boundaries = bounds, 
           aspect = 20, ticks = ticks)
cbar.set_ticklabels(['A','B','C','D'])
show()

x和y定义了方块的角落,所以它们应该是3x3的。而且你需要定义pcolormesh的vmin/vmax参数。

我还注意到,如果你使用vmin/vmax(至少在这个简单的例子中),就不需要明确指定边界和规范,这样整个代码会简短很多:

from matplotlib.pyplot import *
import numpy as np

x = np.linspace(1.,4.,3)
y = np.linspace(1.,2.,3)
x,y = np.meshgrid(x,y)
z = np.array([[0.5,1.5],[2.5,3.5]])
cmap = matplotlib.colors.ListedColormap(['r', 'y', 'g', 'b'])
ticks = [0.5,1.5,2.5,3.5]
fig = figure(figsize = (20,10))
ax = fig.add_subplot(111)
p = ax.pcolormesh(x,y,z, cmap=cmap, vmin=0, vmax=4)
ax.axis([x.min(),x.max(),y.min(),y.max()])
ax.set_xlabel('x')
ax.set_ylabel('y')
cbar = fig.colorbar(p, aspect = 20, ticks=ticks)
cbar.set_ticklabels(['A','B','C','D'])
show()

撰写回答