年复一年的matplotlib与传奇

时间:2016-02-21 23:47:27

标签: python matplotlib bar-chart

我正试图从Excel模仿此图表 python和matplotlib中的enter image description here

数据框(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 - 这没有错误运行,但是我只得到一组条。不明白如何解决这个问题。图表看起来像这样: enter image description here

编辑 - 问题出在ax1.bar(month_list ...行。它对每行使用相同的起点,因此条形图在彼此之上。@GWW下面的解决方案使用@GWW计算起始位置idx。我真的将其命名为bar_start。

问题2 - 我无法在任何地方找到如何使用表格下的数据添加该图例。我可以通过简单地显示数据框(我认为:)来尝试创建,但是Matplotlib是否已经具备了这些功能?

1 个答案:

答案 0 :(得分:1)

这应该让你开始。您仍然需要摆弄表格属性以使其看起来更好。

Example Plot

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()