You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Seaborn堆叠双柱状图的图例,同时展示颜色与填充样式的对应关系

如何修改Seaborn堆叠双柱状图的图例,同时展示颜色与填充样式的对应关系

嗨,我来帮你搞定这个图例自定义的问题!你想要把颜色(蓝/橙对应raw/spike)和填充样式(带斜线/空白对应CATTCCA/CATTCCT)分开展示,而不是把它们组合成四个选项对吧?咱们可以通过手动创建图例元素的方式来实现,完美解决原来图例叠加或者不符合需求的问题。

问题分析

你之前的代码里两次调用了sns.barplot,Seaborn会自动为每个hue生成图例,再加上你手动添加的图例,就会出现叠加的情况。而且你需要的是把颜色和填充的含义分开解释,而不是组合展示,所以咱们得关掉自动生成的图例,自己构建想要的图例项。

解决方案代码

下面是修改后的完整代码,我会标注关键改动的地方:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import seaborn as sns

workdir = "my/dir/"

data = pd.read_csv(workdir + "motifs_under_peaks.txt", sep=" ")

data_pct = data.copy()
data_pct["motif_CATTCCA"] = data_pct["motif_CATTCCA"] / data_pct["peaks"]
data_pct["motif_CATTCCT"] = data_pct["motif_CATTCCT"] / data_pct["peaks"]
data_pct = data_pct.drop("peaks", 1)
data_pct = data_pct.melt(id_vars=["Conds", "method"], var_name="motif")

total = data_pct.groupby(["Conds", "method"])["value"].sum().reset_index()
motif_A = data_pct[data_pct.motif =="motif_CATTCCA"]

fig1, ax1 = plt.subplots()

# 关键改动1:添加legend=False,关闭Seaborn自动生成的图例
bar1 = sns.barplot(x="value", y="Conds", hue="method", data=total, ax=ax1, legend=False)
bar2 = sns.barplot(x="value", y="Conds", hue="method", data=motif_A, hatch="xxxxx", ax=ax1, legend=False)

# 关键改动2:手动创建每个图例对应的补丁(Patch)
raw_patch = mpatches.Patch(color=bar1.patches[0].get_facecolor(), label='raw')
spike_patch = mpatches.Patch(color=bar1.patches[1].get_facecolor(), label='spike')
cattcca_patch = mpatches.Patch(facecolor='gray', hatch='xxxxx', label='CATTCCA')  # 颜色不影响,只看填充
cattcct_patch = mpatches.Patch(facecolor='gray', label='CATTCCT')

# 把补丁组合成图例,设置位置和标题
ax1.legend(handles=[raw_patch, spike_patch, cattcca_patch, cattcct_patch],
           title="图例说明", loc="upper right")

plt.show()

关键细节解释

  1. 关闭自动图例:在sns.barplot里加legend=False,避免Seaborn自动生成和需求不符的图例,也不会和咱们手动创建的图例叠加。
  2. 获取颜色:通过bar1.patches[0].get_facecolor()直接获取Seaborn自动分配的颜色,这样能保证图例颜色和图表里的柱子颜色完全一致,不用手动指定颜色值。
  3. 填充样式补丁:对于填充样式的图例,我们用灰色作为底色(因为颜色不是重点,填充才是),分别设置带斜线和无斜线的样式,对应两个motif。

这样修改后,你的图例就会显示成:

  • 蓝色块 → raw
  • 橙色块 → spike
  • 带斜线的灰色块 → CATTCCA
  • 空白灰色块 → CATTCCT

完全符合你的需求啦!

备注:内容来源于stack exchange,提问作者Whitehot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:09:32