matplotlib Python -两个不同的条形图相邻

8e2ybdfx  于 2023-03-30  发布在  Python
关注(0)|答案(1)|浏览(127)

我正在使用matplotlib来分析我的数据。为此,我创建了一个具有以下结构的dataframe:

merge.set_index('index', inplace=True)
print(merge)
            username  mentioned_user
index       
matthiashauer   73    10
derya_tn        67    5
renatekuenast   36    9
ralf_stegner    35    73
mgrossebroemer  33    12
... ... ...
katrinhelling   1     1
gydej           1     2
martingassner   1     2
daniludwigmdb   1     3
philipphartewig 1     1

现在我想绘制两个条形图在一行。一个左边,应该有“用户名”列的条形图(升序,前10个最大值),右侧应该有一个带有“mentioned_user”列的条形图(升序,前10个最大值)。由于列的值不同,每个条形图的y轴标签必须不同。这是我到目前为止的图:

merges = merge[:30]

font_color = '#525252'
hfont = {'fontname':'Calibri'}
facecolor = '#eaeaf2'
color_red = '#fd625e'
color_blue = '#01b8aa'
index = merges.index
column0 = merges['username']
column1 = merges['mentioned_user']
title0 = 'Spreading Hate'
title1 = 'Receiving Hate'

fig, axes = plt.subplots(figsize=(10,5), facecolor=facecolor, ncols=2, sharey=True)
fig.tight_layout()

axes[0].barh(index, column0, align='center', color=color_red, zorder=10)
axes[0].set_title(title0, fontsize=18, pad=15, color=color_red, **hfont)
axes[1].barh(index, column1, align='center', color=color_blue, zorder=10)
axes[1].set_title(title1, fontsize=18, pad=15, color=color_blue, **hfont)

# To show data from highest to lowest
plt.gca().invert_yaxis()

axes[0].set(yticks=merges.index, yticklabels=merges.index)
axes[0].yaxis.tick_left()
axes[1].yaxis.tick_right()
axes[0].tick_params(axis='y', colors='black') # tick color

for label in (axes[0].get_xticklabels() + axes[0].get_yticklabels()):
    label.set(fontsize=13, color=font_color, **hfont)
for label in (axes[1].get_xticklabels() + axes[1].get_yticklabels()):
    label.set(fontsize=13, color=font_color, **hfont)

plt.subplots_adjust(wspace=0, top=0.85, bottom=0.1, left=0.18, right=0.95)

filename = 'politicians_spread_vs_receive_hate'
plt.savefig(filename+'.png', facecolor=facecolor)

对于左边的图,我得到了正确的顺序和y轴标签。但是对于右边的图,我还需要对数据进行排序,并且还需要在右边另一个y轴标签。
我该怎么做?
先谢谢你了!

igsr9ssn

igsr9ssn1#

然而,为了正确的绘图,我还需要对数据进行排序...
然后,在第二个轴上绘制条形图之前,您应该按mentioned_usermerges Dataframe 重新排序。
...并且还需要在右侧添加另一个y轴标签。
为此,您需要从plt.subplots()调用中删除sharey=True,并使用ax.yaxis.tick_right()将第二个轴的刻度向右移动
下面是一个使用假数据的最小示例

fig, (ax1, ax2) = plt.subplots(figsize=(10, 5), ncols=2)

merges = merges.sort_values("username")
ax1.barh(merges.index, merges["username"], align='center')
ax1.set_title("Spreading Hate")

merges = merges.sort_values("mentioned_user")
ax2.barh(merges.index, merges["mentioned_user"], align='center')
ax2.set_title("Receiving Hate")
ax2.yaxis.tick_right()

plt.subplots_adjust(wspace=0, top=0.85, bottom=0.1, left=0.18, right=0.95)

相关问题