Python matplotlib несколько баров
Как построить несколько баров в matplotlib, когда я пытался вызвать функцию баров несколько раз, они перекрываются, и, как видно из рисунка ниже, видно только самое высокое значение красного. Как я могу построить несколько баров с датами на осях X?
Пока что я попробовал это:
import matplotlib.pyplot as plt
import datetime
x = [
datetime.datetime(2011, 1, 4, 0, 0),
datetime.datetime(2011, 1, 5, 0, 0),
datetime.datetime(2011, 1, 6, 0, 0)
]
y = [4, 9, 2]
z = [1, 2, 3]
k = [11, 12, 13]
ax = plt.subplot(111)
ax.bar(x, y, width=0.5, color='b', align='center')
ax.bar(x, z, width=0.5, color='g', align='center')
ax.bar(x, k, width=0.5, color='r', align='center')
ax.xaxis_date()
plt.show()
Я получил это:
![enter image description here]()
Результаты должны быть что-то вроде, но с датами на осях X и столбцы рядом друг с другом:
![enter image description here]()
Ответы
Ответ 1
import matplotlib.pyplot as plt
from matplotlib.dates import date2num
import datetime
x = [
datetime.datetime(2011, 1, 4, 0, 0),
datetime.datetime(2011, 1, 5, 0, 0),
datetime.datetime(2011, 1, 6, 0, 0)
]
x = date2num(x)
y = [4, 9, 2]
z = [1, 2, 3]
k = [11, 12, 13]
ax = plt.subplot(111)
ax.bar(x-0.2, y, width=0.2, color='b', align='center')
ax.bar(x, z, width=0.2, color='g', align='center')
ax.bar(x+0.2, k, width=0.2, color='r', align='center')
ax.xaxis_date()
plt.show()
![enter image description here]()
Я не знаю, что означает "значения y также перекрываются", решает ли следующий код вашу проблему?
ax = plt.subplot(111)
w = 0.3
ax.bar(x-w, y, width=w, color='b', align='center')
ax.bar(x, z, width=w, color='g', align='center')
ax.bar(x+w, k, width=w, color='r', align='center')
ax.xaxis_date()
ax.autoscale(tight=True)
plt.show()
![enter image description here]()
Ответ 2
Проблема с использованием дат как значений x заключается в том, что если вы хотите использовать гистограмму, как на втором снимке, они будут ошибочными. Вы должны либо использовать сложную гистограмму (цвета друг на друга), либо группу по дате ( "фальшивую" дату на оси х, в основном просто группируя точки данных).
import numpy as np
import matplotlib.pyplot as plt
N = 3
ind = np.arange(N) # the x locations for the groups
width = 0.27 # the width of the bars
fig = plt.figure()
ax = fig.add_subplot(111)
yvals = [4, 9, 2]
rects1 = ax.bar(ind, yvals, width, color='r')
zvals = [1,2,3]
rects2 = ax.bar(ind+width, zvals, width, color='g')
kvals = [11,12,13]
rects3 = ax.bar(ind+width*2, kvals, width, color='b')
ax.set_ylabel('Scores')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('2011-Jan-4', '2011-Jan-5', '2011-Jan-6') )
ax.legend( (rects1[0], rects2[0], rects3[0]), ('y', 'z', 'k') )
def autolabel(rects):
for rect in rects:
h = rect.get_height()
ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h),
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
autolabel(rects3)
plt.show()
![enter image description here]()
Ответ 3
Я знаю, что речь matplotlib
о matplotlib
, но использование pandas
и seaborn
может сэкономить вам много времени:
df = pd.DataFrame(zip(x*3, ["y"]*3+["z"]*3+["k"]*3, y+z+k), columns=["time", "kind", "data"])
plt.figure(figsize=(10, 6))
sns.barplot(x="time", hue="kind", y="data", data=df)
plt.show()
![enter image description here]()
Ответ 4
Если то, что вы на графике, является гистограммой, то вы можете использовать структуру 2D-данных и позволить matplotlib обрабатывать расстояние между столбцами:
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000, 3)
bins = np.arange(-4.5, 4.5, 1)
colors = ['red', 'tan', 'lime']
plt.hist(x, bins=bins, color=colors, label=colors)
plt.legend()
plt.xticks(bins + 0.5, ['bin ' + str(int(x)) for x in (bins + 0.5)])
plt.show()
rwidth = 1 аргумент в hist()
удалит любое пространство между столбцами.
![enter image description here]()
Источник
Ответ 5
Я сделал это решение: если вы хотите наложить более одного сюжета на одну фигуру, убедитесь, что перед построением следующих сюжетов вы установили правильный matplotlib.pyplot.hold(True)
чтобы добавить другие сюжеты.
О значениях datetime на X ax, решение, использующее выравнивание баров, работает для меня. Когда вы создаете другой график matplotlib.pyplot.bar()
с помощью matplotlib.pyplot.bar()
, просто используйте align='edge|center'
и установите width='+|-distance'
.
Когда вы установите все полосы (графики) вправо, вы увидите штрафы.