Matplotlib table 和图表覆盖下一张图表

Matplotlib table and chart overwrites next chart

我从这个问题 开始,解决方案确实将 table 放在了图表下方。

然而,问题的第二部分是将其与同一(打印)页面上的多个图表一起使用。从上一个问题中获取答案并添加另一个子图表明 ​​table 覆盖了以下图表。

tight_layout 没有帮助(实际上使情况变得更糟)。

我确实尝试保留一行(因此总行数为 3,首先从 0 开始,下一个从 2 开始)但是这留下了一个很大的难看的空白 space 因为 table 甚至没有接近填满一整行。

GridSpec 似乎也没有帮助,或者至少我不知道如何让它解决这个问题。

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 = plt.figure()
ax = plt.subplot2grid((2,1), (0,0))
ax2 = plt.subplot2grid((2,1), (1,0))

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

好吧,我解决了这个问题。解决方案分为两部分,都涉及使用获取和设置位置。

第一部分是在创建子图后添加以下内容

current_bbox = ax.get_position()
current_bbox.y0 = .45
ax.set_position(current_bbox)

该代码可以很好地将底部向上移动。原来的 y0 是 .3629,我不得不用数字来弄清楚。我无法以编程方式做到这一点(或者至少我不理解这些关系)。但通过观察和反复试验,该值有效。

该修复导致 table 现在变得皱巴巴的,因此 table 中的每一行都靠得太近了。 table 创建时的以下代码修复了(添加的 bbox)

tbl = ax.table(cellText=cell_text, 
   rowLabels=[x[0] for x in by_year], loc='bottom', 
   bbox[0, -0.2, 1, 0.175],
   colLabels=months)

数字再次被目测到位。我敢肯定,在某个时间点,有人可以添加如何计算这些数字,而无需进行眼球调整。

现在的结果是这样的