如何修改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()
关键细节解释
- 关闭自动图例:在
sns.barplot里加legend=False,避免Seaborn自动生成和需求不符的图例,也不会和咱们手动创建的图例叠加。 - 获取颜色:通过
bar1.patches[0].get_facecolor()直接获取Seaborn自动分配的颜色,这样能保证图例颜色和图表里的柱子颜色完全一致,不用手动指定颜色值。 - 填充样式补丁:对于填充样式的图例,我们用灰色作为底色(因为颜色不是重点,填充才是),分别设置带斜线和无斜线的样式,对应两个motif。
这样修改后,你的图例就会显示成:
- 蓝色块 → raw
- 橙色块 → spike
- 带斜线的灰色块 → CATTCCA
- 空白灰色块 → CATTCCT
完全符合你的需求啦!
备注:内容来源于stack exchange,提问作者Whitehot
相关产品推荐
相关产品推荐

