matplotlib分类条形图创建不需要的空格

时间:2017-06-22 03:32:58

标签: python pandas matplotlib plot bar-chart

我有一个如下所示的数据框:

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)

注意:locationgroup都是字符串

我尝试创建一个条形图,以便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()

但是,这会产生:

enter image description here

我不确定为什么两端之间有空格。由于102中的172location值,我猜测它,但是,该列是一个字符串,因此我希望将其视为分类变量,所有条形彼此相邻放置,而不管location"值"。我试图通过手动指定xtick位置和标签来纠正这个问题,但它似乎无法正常工作

最后,是否可以通过group快速为每个条形图着色,而无需手动迭代每个唯一group值?

1 个答案:

答案 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()

不知道是否有简洁的方法来批量设置条形颜色。迭代也不错...... enter image description here