如何为Matplotlib子图分别设置不同的Y轴格式?
问题解决:子图Y轴格式未按预期显示
你的代码核心问题出在循环中lambda函数对变量col的引用捕获——循环内定义的lambda不会保存每次循环时col的当前值,而是持有对col变量的引用。当循环结束后,col最终指向最后一列money_col,导致两个子图的Y轴都套用了货币格式。
修正后的完整代码
from matplotlib import pyplot as plt import seaborn as sns import pandas as pd import numpy as np from matplotlib.ticker import FuncFormatter # 补充你遗漏的导入 df = pd.DataFrame(data=[[0, 1], [1, 0]], columns=['prc_col', 'money_col']) fig, axs = plt.subplots(1, 2) fig.tight_layout(pad=5.0) formatting_dict = {'prc_col': lambda num: f'{round(num)}%', 'money_col': lambda num: f'${round(num)}'} for idx, col in enumerate(df.columns): ax = axs[idx] g = sns.boxplot(data=df, y=col, showfliers=False, ax=ax) # 通过默认参数固定当前循环的col值,避免引用滞后问题 g.yaxis.set_major_formatter(FuncFormatter(lambda x, pos, col=col: formatting_dict[col](x))) plt.show()
关键修复点
- lambda参数绑定:给lambda增加
col=col的默认参数,让每次循环时的col值被固定绑定到当前lambda中,不再引用循环变量的最终值。 - 补充缺失导入:你的代码漏导入了
matplotlib.ticker.FuncFormatter,这会导致运行报错,修正时已补上。
修复后,prc_col对应的子图Y轴会显示百分比格式,money_col对应的子图Y轴会显示货币格式,符合预期需求。
内容的提问来源于stack exchange,提问作者Sanjin Juric Fot
相关产品推荐
相关产品推荐

