Pyplot Barchart: столбцы не сгруппированы вокруг xticks должным образом - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь сгруппировать четыре бара вокруг гистограмм на гистограмме. Вот некоторые примеры данных (заметьте, я запускаю это в Python 2.7) и мой код.

import matplotlib.pyplot as plt
import numpy as np

xps_s1 = range(2008, 2019)
xps_s2 = range(2012, 2019)
xps_s3 = range(2013, 2019)
xps_s4 = range(2014, 2019)
yps_s1 = [94.6, 93.9, 93, 94.7, 94.6, 95.4, 95, 93.6, 93, 93.6, 92.2]
yps_s2 = [81.5, 90.2, 91.5, 94, 95, 94.3, 95.3]
yps_s3 = [83.9, 92.7, 93.3, 94.4, 94.4, 94.6]
yps_s4 = [90.6, 95, 94.8, 94, 93.9]

y_means = [94.6, 93.9, 93, 94.7, np.mean([81.5, 94.6]), 
           np.mean([83.9, 90.2, 95.4]), np.mean([92.7, 91.5, 95, 90.6]), 
           np.mean([93.3, 94, 93.6, 95]), np.mean([94.4, 95, 93, 94.8]), 
           np.mean([94.4, 94.3, 93.6, 94]), np.mean([91.4, 94.6, 95.3, 92.2, 93.9])]

fig = plt.subplots()
ax = plt.axes(xlim=(2007,2019), ylim=(75, 100))

w = 0.2
plt.xticks(np.arange(2008, 2019, step = 1))

rects1 = ax.bar([x-w for x in xps_s1], yps_s1, width=w, align="center",
                color='goldenrod', label='Sample1')

rects2 = ax.bar([x-w*2 for x in xps_s2], yps_s2, width=w, align="center",
                color='grey', label='Sample2')

rects3 = ax.bar([x+w for x in xps_s3], yps_s3, width=w, align="center",
                color='silver', label='Sample3')

rects4 = ax.bar([x+w*2 for x in xps_s4], yps_s4, width=w, align="center",
                color='thistle', label='Sample4')

mean_line =ax.plot(xps_s1,y_means, label='Overall', 
                       linestyle='-', color = "indianred")

legend = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()

Когда у меня было три бара, я установил w = 0.3, и столбцы были аккуратно сгруппированы вокруг тиков (у меня были тики 1, сидящие плотно на тике, два других прямо напротив флангов, оставшиеся 0,09 ширины отделяли годы друг от друга )

Теперь с приведенным выше кодом они, похоже, не связаны с каким-либо тиком, и они не группируются должным образом.

Что я делаю не так?

Заранее большое спасибо!

1 Ответ

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

Я думаю, вы хотите использовать align='edge' для упрощения расчетов. Это то, что вы пытаетесь получить?

import matplotlib.pyplot as plt
import numpy as np

xps_s1 = range(2008, 2019)
xps_s2 = range(2012, 2019)
xps_s3 = range(2013, 2019)
xps_s4 = range(2014, 2019)
yps_s1 = [94.6, 93.9, 93, 94.7, 94.6, 95.4, 95, 93.6, 93, 93.6, 92.2]
yps_s2 = [81.5, 90.2, 91.5, 94, 95, 94.3, 95.3]
yps_s3 = [83.9, 92.7, 93.3, 94.4, 94.4, 94.6]
yps_s4 = [90.6, 95, 94.8, 94, 93.9]

y_means = [94.6, 93.9, 93, 94.7, np.mean([81.5, 94.6]), 
           np.mean([83.9, 90.2, 95.4]), np.mean([92.7, 91.5, 95, 90.6]), 
           np.mean([93.3, 94, 93.6, 95]), np.mean([94.4, 95, 93, 94.8]), 
           np.mean([94.4, 94.3, 93.6, 94]), np.mean([91.4, 94.6, 95.3, 92.2, 93.9])]

fig = plt.subplots()
ax = plt.axes(xlim=(2007,2019), ylim=(75, 100))

w = 0.2
plt.xticks(np.arange(2008, 2019, step = 1))

rects1 = ax.bar([x-w for x in xps_s1], yps_s1, width=w, align="edge",
                color='goldenrod', label='Sample1')

rects2 = ax.bar([x-w*2 for x in xps_s2], yps_s2, width=w, align="edge",
                color='grey', label='Sample2')

rects3 = ax.bar([x for x in xps_s3], yps_s3, width=w, align="edge",
                color='silver', label='Sample3')

rects4 = ax.bar([x+w for x in xps_s4], yps_s4, width=w, align="edge",
                color='thistle', label='Sample4')

mean_line =ax.plot(xps_s1,y_means, label='Overall', 
                       linestyle='-', color = "indianred")

legend = ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()

enter image description here

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