我有一个如下所示的数据框:
import numpy as np
import pandas as pd
location = list(range(1, 34))
location += [102, 172]
stress = np.random.randint(1,1000, len(location))
group = np.random.choice(['A', 'B'], len(location))
df = pd.DataFrame({'location':location, 'stress':stress, 'group':group})
df[['location', 'group']] = df[['location', 'group']].astype(str)
注意:location
和group
都是字符串
我尝试创建一个条形图,以便location
(分类)位于x轴上,stress
是每个条形的高度。此外,我想为每个group
我尝试过以下方法:
f, axarr = plt.subplots(1, 1)
axarr.bar(df['location'], df['stress'])
plt.xticks(np.arange(df.shape[0]) + 1, df['location'])
plt.show()
但是,这会产生:
我不确定为什么两端之间有空格。由于102
中的172
和location
值,我猜测它,但是,该列是一个字符串,因此我希望将其视为分类变量,所有条形彼此相邻放置,而不管location
"值"。我试图通过手动指定xtick位置和标签来纠正这个问题,但它似乎无法正常工作
最后,是否可以通过group
快速为每个条形图着色,而无需手动迭代每个唯一group
值?
答案 0 :(得分:1)
如果您的location
是分类数据,请不要使用该数据创建条形图。使用np.arange(df.shape[0])
制作条形图并稍后设置勾选标签:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
location = list(range(1, 34))
location += [102, 172]
stress = np.random.randint(1,1000, len(location))
group = np.random.choice(['A', 'B'], len(location))
df = pd.DataFrame({'location':location, 'stress':stress, 'group':group})
df[['location', 'group']] = df[['location', 'group']].astype(str)
f, axarr = plt.subplots(1, 1)
bars = axarr.bar(np.arange(df.shape[0]), df['stress'])
for b, g in zip(bars.patches, df['group']):
if g == 'A':
b.set_color('b')
elif g == 'B':
b.set_color('r')
plt.xticks(np.arange(df.shape[0]) + bars.patches[0].get_width() / 2, df['location'])
plt.setp(axarr.xaxis.get_ticklabels(), rotation=90)
plt.show()