每个子图中的matplotlib颜色条
我想在一个2x2的图中给每个小图添加一个单独的颜色条。
fig , ( (ax1,ax2) , (ax3,ax4)) = plt.subplots(2, 2,sharex = True,sharey=True)
z1_plot = ax1.scatter(x,y,c = z1,vmin=0.0,vmax=0.4)
plt.colorbar(z1_plot,cax=ax1)
z2_plot = ax2.scatter(x,y,c = z2,vmin=0.0,vmax=40)
plt.colorbar(z1_plot,cax=ax2)
z3_plot = ax3.scatter(x,y,c = z3,vmin=0.0,vmax=894)
plt.colorbar(z1_plot,cax=ax3)
z4_plot = ax4.scatter(x,y,c = z4,vmin=0.0,vmax=234324)
plt.colorbar(z1_plot,cax=ax4)
plt.show()
我以为这样做就可以了,但结果图看起来很糟糕;背景全是灰色,完全忽略了我设置的坐标范围(为了简单起见,这里没显示)。而且没有显示任何颜色条。这真的是正确的方法吗?
我还尝试去掉“cax = ...”,但这样颜色条就全都集中在右下角的小图上,而不是每个小图都有一个!
5 个回答
3
试着使用下面的函数来添加颜色条:
def add_colorbar(mappable):
from mpl_toolkits.axes_grid1 import make_axes_locatable
import matplotlib.pyplot as plt
last_axes = plt.gca()
ax = mappable.axes
fig = ax.figure
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
cbar = fig.colorbar(mappable, cax=cax)
plt.sca(last_axes)
return cbar
然后你的代码需要修改成:
fig , ( (ax1,ax2) , (ax3,ax4)) = plt.subplots(2, 2,sharex = True,sharey=True)
z1_plot = ax1.scatter(x,y,c = z1,vmin=0.0,vmax=0.4)
add_colorbar(z1_plot)
59
在plt.colorbar(z1_plot,cax=ax1)
这段代码中,应该用ax=
来代替cax=
,也就是说,正确的写法是plt.colorbar(z1_plot,ax=ax1)
71
这个问题可以很简单地通过一个工具 make_axes_locatable
来解决。我提供了一个简单的例子,展示了这个工具是怎么工作的,并且你可以很容易地根据自己的需要进行调整:
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
m1 = np.random.rand(3, 3)
m2 = np.arange(0, 3*3, 1).reshape((3, 3))
fig = plt.figure(figsize=(16, 12))
ax1 = fig.add_subplot(121)
im1 = ax1.imshow(m1, interpolation='None')
divider = make_axes_locatable(ax1)
cax = divider.append_axes('right', size='5%', pad=0.05)
fig.colorbar(im1, cax=cax, orientation='vertical')
ax2 = fig.add_subplot(122)
im2 = ax2.imshow(m2, interpolation='None')
divider = make_axes_locatable(ax2)
cax = divider.append_axes('right', size='5%', pad=0.05)
fig.colorbar(im2, cax=cax, orientation='vertical');
33
请看看这个 matplotlib 示例页面。在这里,你可以看到如何绘制出下面这个图,里面有四个不同的颜色条,分别对应每个子图:
希望这对你有帮助。
你还可以在 这里 查看更多内容,里面有很多关于 matplotlib
的使用示例。