如何在Seaborn分组拆分小提琴图中偏移四分位数与中位数线?
解决拆分小提琴图内部线条偏移问题
你只调整了小提琴的多边形主体位置,但内部的四分位数和中位数线条还留在原坐标上,只需同步调整这些线条的x轴位置即可。
Seaborn用inner="quart"生成的内部线条都存储在ax.lines列表中,每个小提琴对应3条线(下四分位、中位数、上四分位),且顺序和ax.collections里的小提琴主体(PolyCollection)一一对应。我们可以在移动小提琴主体的同时,找到对应线条并偏移它们的x坐标:
import matplotlib import matplotlib.pyplot as plt import seaborn as sns sns.set_theme(style="whitegrid") tips = sns.load_dataset("tips") fig, ax = plt.subplots() sns.violinplot( data=tips, x="day", y="total_bill", hue="smoker", split=True, inner="quart", linewidth=1, palette={"Yes": "b", "No": ".85"}, ax=ax ) sns.despine(left=True) delta = 0.025 # 遍历小提琴主体,同时同步调整对应内部线条 for ii, item in enumerate(ax.collections): if isinstance(item, matplotlib.collections.PolyCollection): # 调整小提琴多边形位置 path, = item.get_paths() vertices = path.vertices if ii % 2: # 奇数索引对应右侧小提琴,向右偏移 vertices[:, 0] += delta else: # 偶数索引对应左侧小提琴,向左偏移 vertices[:, 0] -= delta # 调整当前小提琴对应的3条内部线条 for line_idx in range(ii * 3, ii * 3 + 3): line = ax.lines[line_idx] x_data = line.get_xdata() if ii % 2: line.set_xdata(x_data + delta) else: line.set_xdata(x_data - delta) plt.show()
关键说明:
- 每个小提琴主体(PolyCollection)对应
ax.lines里连续的3条线,所以用ii*3到ii*3+2的索引范围定位对应线条 - 按照小提琴的偏移方向(左/右),给线条的x数据加上或减去相同的
delta值,保证线条和小提琴主体对齐
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

