求助:统一三类河口Depth profile visual的Salinity图例刻度
河口盐度深度剖面:统一刻度与全局图例实现方案
核心解决思路
- 提取数据集Salinity字段的全局极值,确定统一的颜色刻度区间
- 创建子图布局时共享深度轴,并为所有子图指定相同的盐度颜色映射范围
- 仅添加一个全局颜色条作为盐度图例,避免子图重复显示
代码实现(Matplotlib版)
假设你的数据集已加载为Pandas DataFrame,命名为df:
import matplotlib.pyplot as plt import pandas as pd # 1. 计算全局盐度范围,微调后让刻度更美观 sal_min = round(df['Salinity'].min() - 0.5, 1) sal_max = round(df['Salinity'].max() + 0.5, 1) # 2. 创建子图,共享y轴(深度轴) fig, axes = plt.subplots(1, 3, figsize=(16, 7), sharey=True) cmap = plt.cm.viridis # 选择颜色映射 # 3. 绘制Closed河口剖面 closed_data = df[df['State'] == 'Closed'] scatter_closed = axes[0].scatter(closed_data['Salinity'], closed_data['Depth'], c=closed_data['Salinity'], cmap=cmap, vmin=sal_min, vmax=sal_max) axes[0].set_title('Closed Estuary') axes[0].set_xlabel('Salinity') axes[0].set_ylabel('Depth') axes[0].invert_yaxis() # 反转y轴,符合深度可视化常规(上浅下深) # 4. 绘制Open河口剖面 open_data = df[df['State'] == 'Open'] axes[1].scatter(open_data['Salinity'], open_data['Depth'], c=open_data['Salinity'], cmap=cmap, vmin=sal_min, vmax=sal_max) axes[1].set_title('Open Estuary') axes[1].set_xlabel('Salinity') # 5. 绘制Semi-closed河口剖面 semi_closed_data = df[df['State'] == 'Semi-closed'] axes[2].scatter(semi_closed_data['Salinity'], semi_closed_data['Depth'], c=semi_closed_data['Salinity'], cmap=cmap, vmin=sal_min, vmax=sal_max) axes[2].set_title('Semi-closed Estuary') axes[2].set_xlabel('Salinity') # 6. 添加全局盐度图例(颜色条) fig.colorbar(scatter_closed, ax=axes, orientation='vertical', pad=0.06, label='Salinity') plt.tight_layout() plt.show()
简化实现(Seaborn版)
用Seaborn的FacetGrid可以快速实现分组可视化:
import seaborn as sns # 计算全局盐度范围 sal_min = round(df['Salinity'].min() - 0.5, 1) sal_max = round(df['Salinity'].max() + 0.5, 1) # 创建分面子图,共享y轴 g = sns.FacetGrid(df, col='State', col_wrap=3, sharey=True, height=6) # 映射散点图,指定统一颜色范围 g.map(sns.scatterplot, 'Salinity', 'Depth', hue='Salinity', palette='viridis', vmin=sal_min, vmax=sal_max) # 添加全局图例,反转y轴 g.add_legend(title='Salinity') g.set(ylim=(df['Depth'].max(), df['Depth'].min())) g.set_axis_labels('Salinity', 'Depth') plt.tight_layout() plt.show()
关键细节说明
- 通过
vmin和vmax强制所有子图使用相同的盐度刻度区间,保证颜色映射一致 sharey=True让三个子图共享深度轴刻度,提升可视化统一性- 反转y轴符合海洋/水文可视化的常规习惯(上方为水体表层,下方为深层)
内容的提问来源于stack exchange,提问作者Daniel Buttner
相关产品推荐
相关产品推荐

