matplotlib 仅向一个感兴趣的条添加图案填充的简单方法

6qfn3psc  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(127)

我正在寻找一种简单的方法来添加阴影到matplotlib中的情节。我只想在特定的酒吧舱口,而不是为我所有的酒吧在情节。我不想手动设置每个酒吧。

0)这是我的df的一部分:

target  withCR_RF   withCR_ET   withCR_LG   withCR_Ridge
0   partA   0.102   0.100   -0.3    -0.3
1   partB   0.081   0.085   -0.3    -0.3
2   part    -0.063  -0.050  -0.3    -0.3

1)这是我用于绘图的代码:

from matplotlib.colors import ListedColormap

cmap = ListedColormap(['#96C3EB', '#299438', '#B8B8B8', '#CCAC93'])
ax = df.plot.bar(x='target', colormap=cmap)

ax.set_xlabel(None)
ax.set_ylabel('prediction performance R²')
ax.set_title('comparing pipelines of prediction of executive function variables')
plt.xticks(rotation=45, ha='right')
plt.show()

2)现在,我想以与颜色相同的方式实现阴影。我不希望所有的酒吧都被孵化,但只需要第一个,所以我尝试了这个,这不起作用。

cmap = ListedColormap(['#96C3EB', '#299438', '#B8B8B8', '#CCAC93'])
hatches = ['++', '', '', '']
ax = df.plot.bar(x='target', colormap=cmap, hatch=hatches)

ax.set_xlabel(None)
ax.set_ylabel('prediction performance R²')
ax.set_title('comparing pipelines of prediction of executive function variables')
plt.xticks(rotation=45, ha='right')
plt.show()

我要么让所有的酒吧孵化要么一个都不孵化。我不想为所有的酒吧舱口,我不想适应每个酒吧手动。

3)@ Trambi,谢谢你的建议。这是现在的工作,但不是所有的浅蓝色酒吧。有六个浅蓝色的条带CR_RF(因为有6个目标),但其中只有一个条发生了变化。我怎么能改变这六个人呢?

cmap = ListedColormap(['#96C3EB', '#299438', '#B8B8B8', '#CCAC93'])
#hatches = ['++', '', '', '']
#hatches = ['', '++', '', '', '', '', 'xx', '', '', '']
ax = df.plot.bar(x='target', colormap=cmap, hatch=hatches)

ax.set_xlabel(None)
ax.set_ylabel('prediction performance R²')
ax.set_title('comparing pipelines of prediction of executive function variables')
plt.xticks(rotation=45, ha='right')

for lbl, patch in zip(ax.get_xticklabels() , ax.patches):
        if lbl.get_text() == 'withCR_RF':
            patch.set_hatch('*')
            patch.set_edgecolor(patch.get_facecolor())
            patch.set_facecolor('none')

plt.show()

4)@Mozway,谢谢你的回答。您的最后一个选项非常适合我的需要,但是否有可能索引多个酒吧?不幸的是,这行不通。我想把所有浅蓝色的条都画上阴影。

cmap = ListedColormap(['#96C3EB', '#299438', '#B8B8B8', '#CCAC93'])
hatches = ['++', '', '', '']
hatches = ['', '++', '', '', '', '', 'xx', '', '', '']
ax = df.plot.bar(x='target', colormap=cmap)
ax.patches[0,1,2,3].set_hatch('+') #see here please
ax.set_xlabel(None)
ax.set_ylabel('prediction performance R²')
ax.set_title('comparing pipelines of prediction of executive function variables')
plt.xticks(rotation=45, ha='right')
plt.show()
wtzytmuj

wtzytmuj1#

你想要什么不清楚。
根据您的数据,您可以用途:

hatches = ['++', '', '', '']
ax = df.plot.bar(x='target', colormap=cmap, hatch=hatches)

或者:

hatches = ['++', '', '', '']
df.set_index('target').T.plot.bar(colormap=cmap, hatch=hatches)

最后一个选项,如果要手动更改一个修补程序:

cmap = ListedColormap(['#96C3EB', '#299438', '#B8B8B8', '#CCAC93'])
ax = df.plot.bar(x='target', colormap=cmap)
ax.patches[0].set_hatch('+')

tzcvj98z

tzcvj98z2#

对我来说,下面的代码工作得最好,因为我不需要定义每个轴,但可以轻松地更改和编辑我想要更改的每一条。在我的例子中,我可以通过设置顺序来完美地指定目标的条件。这段代码仍然很简单,我可以很容易地修改它来创建很多类似的情节。

fig, ax = plt.subplots()
ax = df.plot.bar(rot=0,ax=ax)
# get all bars in the plot
bars = ax.patches
patterns = ['/', 'o', '', '',]  # set hatch patterns in the correct order
hatches = []  # list for hatches in the order of the bars
for h in patterns:  # loop over patterns to create bar-ordered hatches
    for i in range(int(len(bars) / len(patterns))):
        hatches.append(h)
for bar, hatch in zip(bars, hatches):  # loop over bars and hatches to set hatches in correct order
    bar.set_hatch(hatch)
# generate legend. this is important to set explicitly, otherwise no hatches will be shown!
ax.legend()
plt.show()

相关问题