несколько столбцов на основе столбца месяца - PullRequest
2 голосов
/ 08 марта 2019

Мне нужно 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 ]

1 голос
/ 09 марта 2019

Мне не дали ваш оригинальный набор данных, но вот как вы можете изобразить ваши вещи:)

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 голос
/ 09 марта 2019

Я работал над собственным сгенерированным набором данных, поэтому он не мог быть идеальным. Однако это также должно работать с вашими данными.

Я работал с данными, сгенерированными чем-то вроде этого:

#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

Я надеюсь, что это то, что вы ожидали.

0 голосов
/ 08 марта 2019

Это то, что вы ищете:

# 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

Проверьте страница барборда Морского Рога .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...