我有一个如下所示的熊猫数据框:
df = pd.DataFrame({ 'a_wood' : np.random.randn(100),
'a_grassland' : np.random.randn(100),
'a_settlement' : np.random.randn(100),
'b_wood' : np.random.randn(100),
'b_grassland' : np.random.randn(100),
'b_settlement' : np.random.randn(100)})
我想用一个子图中的每个数据帧头创建此数据的直方图。
fig, ax = plt.subplots(2, 3, sharex='col', sharey='row')
m=0
for i in range(2):
for j in range(3):
df.hist(column = df.columns[m], bins = 12, ax=ax[i,j], figsize=(20, 18))
m+=1
为此,先前的代码可以完美运行,但是现在我想将带眼的a和b标头(例如“ a_woods”和“ b-woods”)组合到一个子图中,因此只有三个直方图。我尝试为df.columns[[m,m+3]]
分配两列,但这不起作用。我也有一个索引列,其中包含类似“ day_1”之类的字符串,我希望将其放在x轴上。有人可以帮我吗?
答案 0 :(得分:4)
您想要循环遍历每列并以直方图绘制其数据的内容,对吗? 我可以建议您进行一些修改,以备将来的代码中重复使用,在给出代码之前,有一些有用的技巧会有所帮助,
ax.ravel()
来启用此功能。 enumerate()
始终可用于遍历对象,同时使ith元素及其索引可用。这是我的代码建议:
fig, ax = plt.subplots(1, 3, sharex='col', sharey='row', figsize=(12,7))
ax = ax.ravel()
# this method helps you to go from a 2x3 array coordinates to
# 1x6 array, it will be helpful to use as below
for idx in range(3):
ax[idx].hist(df.iloc[:,idx], bins=12, alpha=0.5)
ax[idx].hist(df.iloc[:,idx+3], bins=12, alpha=0.5)
ax[idx].set_title(df.columns[idx]+' with '+df.columns[idx+3])
ax[idx].legend(loc='upper left')
我希望这会有所帮助,如果您需要更多详细信息,请随时问我:)
注意:重复使用亚历克斯的答案来编辑我的答案。另请检查此matplotlib documentation,以了解更多详细信息。在这种特定情况下,第3点不再重要。
答案 1 :(得分:3)
我不知道我是否正确理解了您的问题,但是类似这样的事情可以将情节结合起来。您可能想在Alpha上玩一些,然后更改标题。
#NOTE that you might want to specify your bins or they wont line up exactly
fig, ax = plt.subplots(1, 3, sharex='col', sharey='row', figsize=(20, 18))
n = 3
for j in range(n):
df.hist(column=df.columns[j], bins=12, ax=ax[j], alpha=0.5, color='red')
df.hist(column=df.columns[j+n], bins=12, ax=ax[j], alpha=0.5, color='blue')
ax[j].set_title(df.columns[j][2:])
要将它们彼此相邻绘制,请尝试以下操作:
#This example doesnt have the issue with different binsizes within one subplot
fig, ax = plt.subplots(1, 3, sharex='col', sharey='row', figsize=(20, 18))
n = 3
colors = ['red', 'blue']
axes = ax.flatten()
for i,j in zip(range(n), axes):
j.hist([df.iloc[:,i], df.iloc[:,i+n]], bins=12, color=colors)
j.set_title(df.columns[i][2:])