如何修改Python中Seaborn散点图的图例仅显示指定刻度?
解决方法
要让seaborn.relplot的大小图例只显示80、160、240这类指定刻度,你可以在绘制图表后手动过滤图例条目,步骤如下:
- 保存
relplot返回的FacetGrid对象,方便后续操作图例; - 定义你想要保留的刻度值;
- 分离并过滤图例中的大小(size)条目,保留指定刻度,同时保留分类(hue)的所有条目;
- 移除原有图例,添加过滤后的新图例。
完整代码示例
import seaborn as sns import matplotlib.pyplot as plt # 定义想要显示的刻度值(根据你的数据范围调整) desired_sizes = [80, 160, 240, 320] # 绘制散点图并保存FacetGrid对象 g = sns.relplot( x='Average_Temperature_Celsius', y='Average_Precipitation_mm', hue='City_Name', size='Elevation_Meters', data=finalData, palette='colorblind', legend='full', sizes=(20, 200) # 控制标记的最小/最大尺寸,可按需调整 ) # 获取当前图例 legend = g.legend # 分离分类(hue)和大小(size)的图例条目 # 先获取分类的数量,确定大小条目的起始索引 hue_category_count = len(finalData['City_Name'].unique()) size_entry_start_idx = hue_category_count # 构建新的图例条目:保留所有分类条目,只保留指定刻度的大小条目 new_handles = legend.handles[:size_entry_start_idx] new_labels = [text.get_text() for text in legend.texts[:size_entry_start_idx]] for handle, label_text in zip(legend.handles[size_entry_start_idx:], legend.texts[size_entry_start_idx:]): try: # 尝试将标签转为数值,判断是否在指定刻度列表中 value = int(float(label_text.get_text())) if value in desired_sizes: new_handles.append(handle) new_labels.append(label_text.get_text()) except ValueError: # 非数值标签(如大小图例的标题)直接保留 new_handles.append(handle) new_labels.append(label_text.get_text()) # 移除原有图例并添加新图例 g._legend.remove() g.add_legend(handles=new_handles, labels=new_labels, title=legend.get_title().get_text()) plt.show()
说明
- 如果你的
Elevation_Meters是连续数值,图例默认会生成自动刻度,这段代码会过滤掉不在desired_sizes中的刻度条目; sizes参数用于控制标记的最小和最大尺寸,你可以根据图表视觉效果调整;- 若需要调整指定刻度的范围,直接修改
desired_sizes列表即可。
内容的提问来源于stack exchange,提问作者griffinc00
相关产品推荐
相关产品推荐

