如何在Seaborn FacetGrid散点图中调整点的尺寸?
问题原因
用FacetGrid.map()调用sns.scatterplot时,s="size"会被当作字符串字面量,而不是自动关联数据中的size列——map方法的关键字参数不会从分面后的子数据集中提取对应列数据,导致传入的s不符合要求,触发报错。
解决办法
方法1:用lambda函数手动传递列数据
通过lambda把size列作为参数传入,让每个分面都能拿到对应子集的size数据:
import seaborn as sns tips = sns.load_dataset("tips") g = sns.FacetGrid(tips, col="time", row="sex") g.map(lambda x, y, s, **kwargs: sns.scatterplot(x=x, y=y, s=s*20, **kwargs), "total_bill", "tip", "size")
这里s*20是为了放大点的尺寸(原size是1-6的小整数,直接用的话点太小),可以根据需求调整倍数。
方法2:用map_dataframe方法(推荐)
map_dataframe专门适配数据框列名传参,会自动把分面后的子数据框传给绘图函数,直接用列名字符串即可:
import seaborn as sns tips = sns.load_dataset("tips") g = sns.FacetGrid(tips, col="time", row="sex") g.map_dataframe(sns.scatterplot, x="total_bill", y="tip", size="size", sizes=(20, 200))
sizes=(20, 200)用来控制点的最小/最大尺寸,也可以省略用默认值。
方法3:用relplot简化代码(最便捷)
relplot是Seaborn封装好的关系图分面接口,底层基于FacetGrid,代码更简洁:
import seaborn as sns tips = sns.load_dataset("tips") sns.relplot(data=tips, x="total_bill", y="tip", size="size", col="time", row="sex", kind="scatter")
内容的提问来源于stack exchange,提问作者David Kaufman
相关产品推荐
相关产品推荐

