同时设置hue与scatter_kws的s参数时seaborn.lmplot报错ValueError如何解决
解决方案
问题原因
你遇到的报错原因和你的推测完全一致:
调用
sns.lmplot时传入hue='sex'参数后,seaborn会将完整的tips数据集按sex字段拆分为两个独立分组,分别绘制每组的散点。但scatter_kws内的参数会直接透传给底层matplotlib的scatter方法,不会随分组同步拆分,导致传入的全量tips['size']数组长度,和单分组的x、y数据长度不匹配,触发ValueError。
未加hue参数时数据不会拆分,全量size数组和x、y长度一致,所以可以正常运行。
修复方案1:使用seaborn原生size映射(推荐)
你当前代码设置了fit_reg=False仅绘制散点,直接改用支持size维度映射的sns.relplot即可,seaborn会自动处理hue分组下的点大小匹配,无需手动处理数据拆分:
import seaborn as sns from matplotlib import pyplot as plt tips = sns.load_dataset('tips') sns.relplot( x='total_bill', y='tip', data=tips, hue='sex', size='size', sizes=(10, 60) # 按size列数值比例映射点大小,等价原代码的size*10效果 ) plt.show()
修复方案2:保留lmplot用法
如果后续需要开启拟合线,要保留lmplot的写法,可以在绘图后手动为每个分组的散点设置大小:
import seaborn as sns from matplotlib import pyplot as plt tips = sns.load_dataset('tips') # 先绘制不带点大小设置的lmplot g = sns.lmplot( x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex' ) # 遍历每个分组,为对应散点设置匹配长度的大小值 for (_, group_data), scatter in zip(tips.groupby('sex'), g.ax.collections): scatter.set_sizes(group_data['size'] * 10) plt.show()
两种方案在你给出的运行环境版本下均可正常执行,实现原代码想要的按size列调整点大小、按sex区分颜色的效果。
内容的提问来源于stack exchange,提问作者noobar
相关产品推荐
相关产品推荐

