基于月份列的多个条形图

时间:2019-03-08 19:55:04

标签: python python-3.x pandas matplotlib seaborn

我需要12个地块(fig, axes = plt.subplots(4,3)) 在每个图中,我需要一个小图,其中x轴是Airline,y轴是他们每个月绘制的计数。

即,对于第1个月-> x-axis='Airline'y-axis='counts',还要感谢每个小节的颜色是否不同。

类似地,我每个月都需要这样的地块(12个地块)。

                     Airline    counts
Month       
1                  Jet Airways   430
1                  Air France    197
1                  Emirates      184
2                  Jet Airways   674
2                  Air France    513
2                  Emirates      369
3                  Jet Airways   153
3                  Air France     76
4                  Emirates       63
....               .....         ....

我尝试过类似的事情

df.groupby(df.index)['Airline'].plot(kind='bar')

以下情节仅包含7个月。

enter image description here

但这只会返回一个包含所有值的图,这不是我的预期输出。

3 个答案:

答案 0 :(得分:1)

我没有得到您的原始数据集,但是这里是您如何绘制内容的方法:)

import matplotlib.pyplot as plt

# Make my own data set here
data1 = {
    'Southwest': 30,
    'American': 12
}
data2 = {
    'Southwest': 26,
    'American': 35
}

def plot_my_data(ax, dataset):
    names = list(dataset.keys())
    numbers = list(dataset.values())
    for index in range(len(names)):
        if names[index] == 'Southwest':
            ax.bar(names[index], numbers[index], label='Southwest', color='k')
        else:
            ax.bar(names[index], numbers[index])

fig, axs = plt.subplots(4, 3) #define our subplots

plot_my_data(axs[0, 0], data1) #for each subplot we give it data and an axs. The axs is defined as [row, column]
plot_my_data(axs[0, 1], data2)

plt.show() # show the result

如果您复制/粘贴此脚本,它将运行。然后,您只需要将其输入数据集即可。您可以根据类似我所显示的名称来指定颜色,也可以这样标记它们(这就是为什么这样做的功能很棒,因此您不必复制/粘贴12次)。

答案 1 :(得分:1)

我正在处理自己生成的数据集,因此可能并不完美。但是,它也应该可以处理您的数据。

我正在处理像这样的东西生成的数据:

#import all needed libraries 
airline_names = ['BRITISH AIRWAYS PLC','VIRGIN ATLANTIC AIRWAYS LTD','BRITANNIA AIRWAYS AND THOMSONFLY','BRITISH AIRWAYS (EURO OPS) LGW','MONARCH AIRLINES','AIR EUROPE','FIRST CHOICE AIRWAYS LTD','CALEDONIAN AIRWAYS','BMI BRITISH MIDLAND','KLM UK LTD','ANGLO CARGO','MY TRAVEL AIRWAYS UK','LEISURE INTERNATIONAL','EXCALIBUR AIRWAYS','HEAVYLIFT','GB AIRWAYS LTD','NOVAIR INTERNATIONAL','BERLIN EUROPEAN UK','HUNTING CARGO AIRLINES LTD','TRADEWINDS AIRWAYS','LOGANAIR','DUO AIRWAYS LTD','BRITISH WORLD AIRLINES LTD','RYANAIR-EUROPE','BRITISH AIRWAYS CITIEXPRESS LTD','AIR FOYLE'] 
months = np.random.choice(range(1,13), size=40, replace=True)
counts = np.random.choice(range(200,800), size=40, replace=True)
airlines = np.random.choice(airline_names, size=40, replace=True)

df = pd.DataFrame({"Airline":airlines,"month":months,"counts":counts}) 

我以为一个月有一家航空公司,所以我没有计算该月的总数。在我的数据集中,一个月内可能会出现相同的航空公司。所以,请记住这一点。

grouped = df.groupby('month')
fig = plt.figure(figsize=(18,15))
i=0
import random as rand
#create random rgb colors assigned to airline 
colors = {k: (rand.random(),rand.random(),rand.random()) for k in airline_names}
for month, values in grouped:
    i += 1
    ax = fig.add_subplot(4,3,i)
    colors_list = [colors[airline] for airline in values["Airline"]]
    values.plot.bar("Airline", "counts",ax=ax,color=colors_list,xticks=[],title=month)
    #As a xlabel I printed only 7 chars, otherwise it would be mess
    ax.set_xticklabels(values["Airline"].str[0:7])
plt.show()

输出结果如下:output

我希望这是您所期望的。

答案 2 :(得分:0)

这是您要寻找的:

# import matplotlib and seaborn for data visualization.
import matplotlib.pyplot as plt
import seaborn as sns

# Load dataframe.
df = pd.DataFrame(...)

# Plot one bar for each airline, grouped by month.
sns.barplot(x="month", y="counts", hue="Airline", data=df)
plt.show()

您最终将得到以下内容: enter image description here

签出seaborn's barplot page