如何为多个等值线子图添加单个统一颜色条
如何为多个等值线子图添加单个统一颜色条
嗨,这个需求太常见啦!我给你分享两种实用的方案,既能实现统一颜色条,还能让整体布局更美观~
首先要提个关键前提:一定要让三个子图的颜色映射范围保持一致,不然颜色条对应不上不同子图的数值,就失去统一颜色条的意义啦。所以你需要先计算所有数据的最小和最大值,然后在每个contourf里指定vmin和vmax参数。
方案一:直接用fig.colorbar快速实现
这种方法最简单,直接通过fig.colorbar把颜色条绑定到所有子图上,还能灵活调整位置和方向:
import matplotlib.pyplot as plt import numpy as np # 模拟你的数据(假设lon、lat、A/B/C是已有的数据) lon = np.linspace(-180, 180, 100) lat = np.linspace(-90, 90, 50) A = np.random.randn(50,100)*10 B = np.random.randn(50,100)*10 C = np.random.randn(50,100)*10 # 统一颜色范围 vmin = np.min([A, B, C]) vmax = np.max([A, B, C]) fig, ax = plt.subplots(1,3,figsize=(12,4)) X,Y=np.meshgrid(lon,lat) # 绘制子图时统一vmin和vmax P1=ax[0].contourf(X,Y,A, vmin=vmin, vmax=vmax) ax[0].set_title('Plot A') P2=ax[1].contourf(X,Y,B, vmin=vmin, vmax=vmax) ax[1].set_title('Plot B') P3=ax[2].contourf(X,Y,C, vmin=vmin, vmax=vmax) ax[2].set_title('Plot C') # 添加统一颜色条 # ax=ax表示把颜色条放在所有子图的旁边;shrink调整颜色条的长度;orientation可选'horizontal'(水平)或'vertical'(垂直) fig.colorbar(P1, ax=ax, orientation='vertical', shrink=0.8, label='Value') plt.tight_layout() plt.show()
方案二:用make_axes_locator实现完美对齐
如果想让颜色条的高度和子图完全匹配,看起来更精致,可以用matplotlib的axes_grid1工具包:
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1 import make_axes_locator # 同样先统一颜色范围 vmin = np.min([A, B, C]) vmax = np.max([A, B, C]) fig, ax = plt.subplots(1,3,figsize=(12,4)) X,Y=np.meshgrid(lon,lat) P1=ax[0].contourf(X,Y,A, vmin=vmin, vmax=vmax) ax[0].set_title('Plot A') P2=ax[1].contourf(X,Y,B, vmin=vmin, vmax=vmax) ax[1].set_title('Plot B') P3=ax[2].contourf(X,Y,C, vmin=vmin, vmax=vmax) ax[2].set_title('Plot C') # 创建一个轴定位器,绑定到最后一个子图 divider = make_axes_locator(ax[-1]) # 在子图右侧添加一个新的轴,用于放置颜色条;size是颜色条宽度,pad是和子图的间距 cax = divider.append_axes("right", size="5%", pad=0.05) # 把颜色条放在这个新轴里 fig.colorbar(P3, cax=cax, label='Value') plt.tight_layout() plt.show()
两种方法都能实现你的需求,第一种快,第二种更美观,你可以根据自己的布局需求选择~
备注:内容来源于stack exchange,提问作者s28
相关产品推荐
相关产品推荐

