如何为Seaborn swarmplot添加基于Heat类别的独特标记维度
为Seaborn散点群图添加自定义标记区分Heat维度
Seaborn原生swarmplot不支持直接通过参数设置另一维度的标记样式,需要手动分组绘制来实现。以下是具体实现步骤:
- 为每个唯一的
Heat值分配专属标记,可使用matplotlib支持的标记类型(如'o','s','^','D','*'等) - 按
Heat分组遍历数据,分别绘制子散点群图,指定对应标记 - 统一处理
hue对应的颜色映射,保证粒度(Grain Size)的颜色一致性 - 最后合并图例,同时展示颜色(粒度)和标记(Heat)的对应关系
完整实现代码:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd # 初始化数据框 df = pd.DataFrame() c_data = [10,20,30,35, 8] time_data = [100, 1000, 10000, 4000, 16000] gs_data = [1.5, 2, 3, 4, 5] heat_data = [2412, 1421, 1445, 6366, 1131] df['charpy'] = c_data df['time'] = time_data df['Grain Size'] = gs_data df['Heat'] = heat_data # 创建Heat到标记的映射 heat_markers = { 2412: 'o', 1421: 's', 1445: '^', 6366: 'D', 1131: '*' } # 获取Grain Size的颜色映射(复用Seaborn默认hue颜色) palette = sns.color_palette(n_colors=len(df['Grain Size'].unique())) gs_color_map = dict(zip(df['Grain Size'].unique(), palette)) fig, a = plt.subplots(dpi=150) # 按Heat分组绘制swarmplot for heat_val, group in df.groupby('Heat'): sns.swarmplot( data=group, x='time', y='charpy', hue='Grain Size', ax=a, size=8, marker=heat_markers[heat_val], palette=gs_color_map, legend=False # 关闭自动图例,后续手动合并 ) # 手动构建复合图例 # 颜色对应Grain Size的图例元素 color_handles = [plt.Line2D([], [], marker='o', color=gs_color_map[gs], linestyle='', markersize=8) for gs in df['Grain Size'].unique()] color_labels = [f'Grain Size: {gs}' for gs in df['Grain Size'].unique()] # 标记对应Heat的图例元素 marker_handles = [plt.Line2D([], [], marker=heat_markers[heat], color='black', linestyle='', markersize=8) for heat in heat_markers.keys()] marker_labels = [f'Heat: {heat}' for heat in heat_markers.keys()] # 合并图例并调整位置 a.legend(handles=color_handles + marker_handles, labels=color_labels + marker_labels, bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
关键细节说明:
heat_markers字典可根据需求自由调整标记类型,支持所有matplotlib兼容的标记- 提前定义
gs_color_map确保同一粒度值在不同Heat分组中颜色一致 - 关闭自动图例后手动构建复合图例,避免重复元素干扰视觉
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

