You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python中Seaborn散点图的图例仅显示指定刻度?

解决方法

要让seaborn.relplot的大小图例只显示80、160、240这类指定刻度,你可以在绘制图表后手动过滤图例条目,步骤如下:

  1. 保存relplot返回的FacetGrid对象,方便后续操作图例;
  2. 定义你想要保留的刻度值;
  3. 分离并过滤图例中的大小(size)条目,保留指定刻度,同时保留分类(hue)的所有条目;
  4. 移除原有图例,添加过滤后的新图例。

完整代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:05:03