Как построить столбчатый график с множеством столбцов, назначенных одним тикам на оси x? - PullRequest
0 голосов
/ 20 июня 2020

У меня проблема с построением гистограммы с множеством полосок, назначенных одной отметке на оси x.

Мне нужно иметь что-то подобное, но с 6 полосами. Изображение

Это мой код:

df_USA = df[df['Country'] == 'United States']
df_China = df[df['Country'] == 'China']
df_Germany = df[df['Country'] == 'Germany']
df_Italy = df[df['Country'] == 'Italy']
df_Spain = df[df['Country'] == 'Spain']

df_USA_Year = pd.DataFrame(df_USA.groupby(['Year', 'City']).Medal.count())
df_USA_Year.sort_values(by=['Year'], inplace = True)
df_USA_Year.reset_index(inplace = True)

df_China_Year = pd.DataFrame(df_China.groupby(['Year', 'City']).Medal.count())
df_China_Year.sort_values(by=['Year'], inplace = True)
df_China_Year.reset_index(inplace = True)

df_Germany_Year = pd.DataFrame(df_Germany.groupby(['Year', 'City']).Medal.count())
df_Germany_Year.sort_values(by=['Year'], inplace = True)
df_Germany_Year.reset_index(inplace = True)

df_Italy_Year = pd.DataFrame(df_Italy.groupby(['Year', 'City']).Medal.count())
df_Italy_Year.sort_values(by=['Year'], inplace = True)
df_Italy_Year.reset_index(inplace = True)

df_Spain_Year = pd.DataFrame(df_Spain.groupby(['Year', 'City']).Medal.count())
df_Spain_Year.sort_values(by=['Year'], inplace = True)
df_Spain_Year.reset_index(inplace = True)

ind = np.arange(8)  # the x locations for the groups
width = 0.10  # the width of the bars

# wielkość wykresu
plt.rcParams["figure.figsize"] = (30, 8) 

# wykres

fig, ax = plt.subplots()
rects1 = ax.bar(ind - 3.5*width, df_Poland_Year['Medal'], color = "red", label = "Polska")
rects2 = ax.bar(ind - 2.5*width, df_USA_Year['Medal'], color = "blue", label = "Stany Zjednoczone")
rects3 = ax.bar(ind - 1.5*width, df_China_Year['Medal'], color = "green", label = "Chiny")
rects4 = ax.bar(ind - 0.5*width, df_Germany_Year['Medal'], color = "orange", label = "Niemcy")
rects5 = ax.bar(ind + 0.5*width, df_Italy_Year['Medal'], color = "purple", label = "Włochy")
rects6 = ax.bar(ind + 1.5*width, df_Spain_Year['Medal'], color = "magenta", label = "Hiszpania")

x = np.arange(9)
xlabels = ('Montreal - 1976', 'Moskwa - 1980', 'Los Angeles - 1984' 'Seul - 1988', 'Barcelona - 1992', 'Atlanta - 1996', 'Sydney - 2000', 'Ateny - 2004', 'Beijing - 2008')
plt.xticks(x, xlabels)
ax.tick_params(axis='both', which='major', labelsize=14)

# Dodanie tytułu wykresu i tytułu osiom
plt.title('Porównanie liczby zdobytych medali na Olimpiadach przez Polskę i inne wybrane kraje', fontsize = 16)
plt.xlabel("Rok Olimpiady", fontsize = 13)
plt.ylabel("Liczba zdobytych medali", fontsize = 13)

# Dodanie legendy
ax.legend()
ax.legend(loc='lower center', bbox_to_anchor=(0.5, -.15), ncol = 6, shadow = True, fontsize = 13)

Это ошибка.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-425-49001c3adda1> in <module>()
     36 rects1 = ax.bar(ind - 3.5*width, df_Poland_Year['Medal'], color = "red", label = "Polska")
     37 rects2 = ax.bar(ind - 2.5*width, df_USA_Year['Medal'], color = "blue", label = "Stany Zjednoczone")
---> 38 rects3 = ax.bar(ind - 1.5*width, df_China_Year['Medal'], color = "green", label = "Chiny")
     39 rects4 = ax.bar(ind - 0.5*width, df_Germany_Year['Medal'], color = "orange", label = "Niemcy")
     40 rects5 = ax.bar(ind + 0.5*width, df_Italy_Year['Medal'], color = "purple", label = "Włochy")

3 frames
<__array_function__ internals> in broadcast_arrays(*args, **kwargs)

/usr/local/lib/python3.6/dist-packages/numpy/lib/stride_tricks.py in _broadcast_shape(*args)
    189     # use the old-iterator because np.nditer does not handle size 0 arrays
    190     # consistently
--> 191     b = np.broadcast(*args[:32])
    192     # unfortunately, it cannot handle 32 or more arguments directly
    193     for pos in range(32, len(args), 31):

ValueError: shape mismatch: objects cannot be broadcast to a single shape

Я изменил ширину полос, но это совсем не изменилось. Не понимаю почему. Раньше я делал график с 4 барами, привязанными к одному тику, и он работал

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