如何在Seaborn分类轴柱状图上叠加显示单个数据点
实现Seaborn分组柱状图叠加散点的方法
你之前的代码生成两张独立图的核心原因是:sns.catplot()是图级(FacetGrid)接口,每次调用都会独立创建新的画布,要实现叠加需要在同一个FacetGrid对象上依次绘制不同的图表元素。
正确实现代码如下:
import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据 tips = sns.load_dataset("tips") # 第一步:先绘制分组柱状图,得到FacetGrid对象g,作为叠加的主画布 g = sns.catplot( x="sex", y="total_bill", hue="smoker", row="time", data=tips, kind="bar", ci = "sd", edgecolor="black", errcolor="black", errwidth=1.5, capsize = 0.1, height=4, aspect=.7, alpha=0.8 # 调低柱子透明度,避免完全遮挡散点 ) # 第二步:在已有画布的每个子图上叠加散点 g.map_dataframe( sns.stripplot, x="sex", y="total_bill", hue="smoker", dodge=True, # 必须设置,保证不同hue分组的散点和对应柱子位置对齐 alpha=0.6, size=4, jitter=0.2, # 控制点的横向分散程度,避免点完全重叠 color="black" # 也可以去掉这个参数,让点和柱子同色系,根据需求调整 ) # 处理重复图例(两次绘图会生成两套图例,只保留一套即可) handles, labels = g.axes[0][0].get_legend_handles_labels() g.legend.remove() g.add_legend(handles=handles[:2], labels=labels[:2]) plt.show()
关键参数说明
dodge=True:分组散点和分组柱状图的位置对齐核心参数,不设置的话不同吸烟属性的散点会挤在同一x轴位置,和柱子错位alpha:分别调整柱子和散点的透明度,避免元素之间完全遮挡jitter:控制散点的横向抖动幅度,平衡点的分散度和可读性
内容的提问来源于stack exchange,提问作者Alex Schubert
相关产品推荐
相关产品推荐

