我正试图从Excel模仿此图表 python和matplotlib中的。
数据框(by_year)在下面看多指数 编辑 - 更改表以反映行不同
Month 1 2 3 4 5 6 7 8 9 10 11 12
Year
2012 8 6 8 9 1 2 8 9 4 3 2 6
2013 5 6 2 9 6 2 8 9 4 3 2 6
2014 7 6 3 9 4 2 8 9 4 3 2 6
# create multiple plots on the page (i'm going to print this rather
# than display live
ax1 = plt.subplot2grid((3, 2), (0,0), colspan=2)
ax2 = plt.subplot2grid((3, 2), (1,0))
# loop through the years (each row) and add to chart
for idx, row in by_year.iterrows():
row_values = row.values.astype(int).tolist()
ax1.bar(month_list, row_values)
ax1.legend(str(idx))
问题1 - 这没有错误运行,但是我只得到一组条。不明白如何解决这个问题。图表看起来像这样:
编辑 - 问题出在ax1.bar(month_list ...行。它对每行使用相同的起点,因此条形图在彼此之上。@GWW下面的解决方案使用@GWW计算起始位置idx。我真的将其命名为bar_start。
问题2 - 我无法在任何地方找到如何使用表格下的数据添加该图例。我可以通过简单地显示数据框(我认为:)来尝试创建,但是Matplotlib是否已经具备了这些功能?
答案 0 :(得分:1)
这应该让你开始。您仍然需要摆弄表格属性以使其看起来更好。
months = [1,2,3,4,5,6,7,8,9,10,11,12]
by_year = [
(2012, (8,6,8,9,1,2,8,9,4,3,2,6)),
(2013, (5,6,2,9,6,2,8,9,4,3,2,6)),
(2014, (7,6,3,9,4,2,8,9,4,3,2,6)),
]
colors = ['r','g','b','y']
import pylab as plt
fig, ax = plt.subplots(1,1, figsize=(8, 4))
#0.9 to leave a small space between groups of bars
import numpy as NP
N = 0.95 / (len(by_year))
cell_text = []
for i, (year, row) in enumerate(by_year):
print i, year, row
idx = NP.arange(0, len(months)) + N * i
# * 0.8 to put a small gap between bars
ax.bar(idx, row, color=colors[i], width=N * 0.8, label=year)
cell_text.append(row)
tbl = ax.table(cellText=cell_text, rowLabels=[x[0] for x in by_year], loc='bottom', colLabels=months)
prop = tbl.properties()
ax.set_xticks([])
lgd = ax.legend(loc='upper left', bbox_to_anchor=(1, 1.0))
fig.show()