如何让Seaborn图例自动适配并设置自定义数值格式?
自动调整Seaborn散点图图例的数值格式
我需要调整Seaborn散点图的图例,将图例中的数值设置为自定义格式,比如[5,000,000 | 10,000,000]、[5m | 10m]或[0.5 | 1.0 | 1.5](对应十亿单位)。目前用手动设置图例标签的方法太繁琐,希望实现自动调整。
当前使用的代码:
plt.figure(figsize=(8,4), dpi=200) # set styling on a single chart with sns.axes_style('darkgrid'): ax = sns.scatterplot(data=data_clean, x='USD_Production_Budget', y='USD_Worldwide_Gross', hue='USD_Worldwide_Gross', size='USD_Worldwide_Gross') ax.set(ylim=(0, 3000000000), xlim=(0, 450000000), ylabel='Revenue in $ billions', xlabel='Budget in $100 millions') plt.show()
手动设置的方法(希望避免):
plt.figure(figsize=(8,4), dpi=200) # set styling on a single chart with sns.axes_style('darkgrid'): ax = sns.scatterplot(data=data_clean, x='USD_Production_Budget', y='USD_Worldwide_Gross', hue='USD_Worldwide_Gross', size='USD_Worldwide_Gross') ax.set(ylim=(0, 3000000000), xlim=(0, 450000000), ylabel='Revenue in $ billions', xlabel='Budget in $100 millions') plt.legend(title='World_Wide_Gross',loc='upper left',labels=[0,0.5,1.0,1.5,2.0,2.5]) plt.show()
解决方案
核心思路是:获取自动生成的图例标签,提取原始数值后用自定义规则格式化,再重新赋值给图例,无需手动硬编码标签列表。以下是三种常见格式的实现代码:
1. 格式化为千分位(如5,000,000)
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8,4), dpi=200) with sns.axes_style('darkgrid'): ax = sns.scatterplot(data=data_clean, x='USD_Production_Budget', y='USD_Worldwide_Gross', hue='USD_Worldwide_Gross', size='USD_Worldwide_Gross') ax.set(ylim=(0, 3000000000), xlim=(0, 450000000), ylabel='Revenue in $ billions', xlabel='Budget in $100 millions') # 自定义千分位格式化函数 def format_thousands(num): return f"{int(num):,}" # 获取图例并更新标签 leg = ax.get_legend() # 跳过第一个标题条目,遍历数值标签 for text in leg.texts[1:]: original_val = float(text.get_text()) text.set_text(format_thousands(original_val)) plt.show()
2. 格式化为百万简写(如5m)
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8,4), dpi=200) with sns.axes_style('darkgrid'): ax = sns.scatterplot(data=data_clean, x='USD_Production_Budget', y='USD_Worldwide_Gross', hue='USD_Worldwide_Gross', size='USD_Worldwide_Gross') ax.set(ylim=(0, 3000000000), xlim=(0, 450000000), ylabel='Revenue in $ billions', xlabel='Budget in $100 millions') # 自定义百万单位格式化函数 def format_millions(num): val_in_m = num / 1_000_000 return f"{val_in_m:.0f}m" if val_in_m.is_integer() else f"{val_in_m:.1f}m" # 更新图例标签 leg = ax.get_legend() for text in leg.texts[1:]: original_val = float(text.get_text()) text.set_text(format_millions(original_val)) plt.show()
3. 格式化为十亿单位(如0.5、1.0)
对应手动设置的需求,将原始数值转换为十亿单位并保留一位小数:
import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(8,4), dpi=200) with sns.axes_style('darkgrid'): ax = sns.scatterplot(data=data_clean, x='USD_Production_Budget', y='USD_Worldwide_Gross', hue='USD_Worldwide_Gross', size='USD_Worldwide_Gross') ax.set(ylim=(0, 3000000000), xlim=(0, 450000000), ylabel='Revenue in $ billions', xlabel='Budget in $100 millions') # 自定义十亿单位格式化函数 def format_billions(num): val_in_b = num / 1_000_000_000 return f"{val_in_b:.1f}" # 更新图例标签 leg = ax.get_legend() for text in leg.texts[1:]: original_val = float(text.get_text()) text.set_text(format_billions(original_val)) plt.show()
补充说明
- 如果图例同时包含
hue和size的双重标签,可根据标签内容判断是否为数值,再进行格式化 - 格式化函数可灵活修改,比如添加货币符号
$、调整小数位数或增减单位标识
内容的提问来源于stack exchange,提问作者Alight
相关产品推荐
相关产品推荐

