如何用列表推导式为Matplotlib子图批量设置ylabel?
解决Matplotlib子图ylabel批量设置问题
问题场景
原本通过逐个赋值的方式给Matplotlib子图设置ylabel:
ax[0].set_ylabel("Valor") ax[1].set_ylabel("Máximos y Mínimos") ax[2].set_ylabel("Fear and Greed") ax[3].set_ylabel("Put Call Ratio") ax[4].set_ylabel("T10Y2Y") ax[5].set_ylabel("RASI") ax[6].set_ylabel("Oscilador Mcclellan")
尝试用嵌套列表推导式批量实现时失败,无法让子图索引与对应标签匹配:
[[ax[i].set_ylabel(x) for i in range(7)] for x in ['Valor', 'Máximos y Mínimos', 'Fear & Greed', 'Put Call Ratio', 'T10Y2Y', 'RASI', 'Oscilador Mcclellan']]
错误原因
你写的嵌套列表推导式逻辑有误:外层循环遍历每个标签x,内层循环遍历所有子图索引i,这会导致每个标签都被设置给所有7个子图,最终所有子图的ylabel会被列表最后一个标签覆盖,完全达不到一一对应的效果。
正确实现方式
方式1:普通循环(推荐,可读性最高)
用zip将子图对象列表和标签列表一一配对,遍历赋值:
labels = ['Valor', 'Máximos y Mínimos', 'Fear and Greed', 'Put Call Ratio', 'T10Y2Y', 'RASI', 'Oscilador Mcclellan'] for axes, label in zip(ax, labels): axes.set_ylabel(label)
方式2:单一层列表推导式(如果坚持用推导式)
用enumerate同时获取标签的索引和内容,对应到子图的索引:
labels = ['Valor', 'Máximos y Mínimos', 'Fear and Greed', 'Put Call Ratio', 'T10Y2Y', 'RASI', 'Oscilador Mcclellan'] [ax[i].set_ylabel(label) for i, label in enumerate(labels)]
或者直接用zip配对子图和标签的推导式:
labels = ['Valor', 'Máximos y Mínimos', 'Fear and Greed', 'Put Call Ratio', 'T10Y2Y', 'RASI', 'Oscilador Mcclellan'] [axes.set_ylabel(label) for axes, label in zip(ax, labels)]
内容的提问来源于stack exchange,提问作者Gerard
相关产品推荐
相关产品推荐

