如何在Matplotlib散点图中使用两种colormap呈现纬度与土地覆盖信息?
实现双色彩条的空间数据散点图(含纬度着色与土地覆盖区分)
要同时实现纬度渐变着色和二元土地覆盖区分,并添加第二个色条,你可以通过拆分数据图层、利用matplotlib的轴分割工具来实现。以下是修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from mpl_toolkits.axes_grid1 import make_axes_locatable from matplotlib.colors import ListedColormap # 生成示例数据 x = np.random.normal(size=192 * 50) y = np.random.normal(size=192 * 50) lat = np.tile(np.linspace(-90, 90, 192), 50) landcover = np.random.choice([0, 1], size=192 * 50, replace=True) # 定义纬度的渐变配色 lat_cmap = sns.dark_palette("#69d", reverse=True, as_cmap=True) # 定义土地覆盖的二元配色 landcover_colors = ["#e74c3c", "#2ecc71"] # 红色代表类型0,绿色代表类型1 plt.figure(figsize=(12, 8)) ax = plt.gca() # 按土地覆盖类型拆分数据并绘制散点 mask_land0 = landcover == 0 mask_land1 = landcover == 1 # 土地覆盖0:圆形标记 scatter_land0 = ax.scatter(x[mask_land0], y[mask_land0], c=lat[mask_land0], alpha=0.2, cmap=lat_cmap, marker='o', label='Landcover 0') # 土地覆盖1:方形标记 scatter_land1 = ax.scatter(x[mask_land1], y[mask_land1], c=lat[mask_land1], alpha=0.2, cmap=lat_cmap, marker='s', label='Landcover 1') # 添加第一个色条(纬度) cbar_lat = plt.colorbar(scatter_land0, ax=ax, pad=0.1) cbar_lat.solids.set(alpha=1) # 修复色条透明度问题 cbar_lat.set_label('Latitude', fontsize=12) # 分割轴,为土地覆盖色条创建独立空间 divider = make_axes_locatable(ax) cax_landcover = divider.append_axes("right", size="5%", pad=0.15) # 创建土地覆盖的离散色条 landcover_cmap = ListedColormap(landcover_colors) bounds = [-0.5, 0.5, 1.5] # 设置离散边界,确保分类准确 norm = plt.cm.colors.BoundaryNorm(bounds, landcover_cmap.N) cbar_landcover = plt.colorbar(plt.cm.ScalarMappable(norm=norm, cmap=landcover_cmap), cax=cax_landcover, ticks=[0, 1]) cbar_landcover.set_label('Landcover Type', fontsize=12) # 添加图例与网格 ax.legend() ax.grid(alpha=0.2) plt.tight_layout() plt.show()
关键逻辑说明:
- 土地覆盖区分:通过数据掩码拆分两类土地覆盖数据,用不同标记形状(圆形/方形)区分,同时保留每个点的纬度着色逻辑
- 双色彩条实现:用
make_axes_locatable工具在主图右侧生成独立轴,专门放置土地覆盖的离散色条,保证两个色条对齐且不重叠 - 色条细节调整:为纬度色条修复透明度差异,为土地覆盖色条设置离散边界,确保分类标签与颜色一一对应
内容的提问来源于stack exchange,提问作者danjdrennan
相关产品推荐
相关产品推荐

