检测matplotlib表需要调整

时间:2016-03-06 20:51:57

标签: python pandas matplotlib

我有像this这样的表问题,显然使用为该答案提供的解决方案我可以调整单元格。我不明白的是,如果不进行眼球测试,如何检测一个太大而另一个太小

更新 代码创建下面的图表。请注意表格下的文本大小和列表中文本的大小。下面太大了,列表太小了。如何以编程方式检测这些条件而无需在视觉上查看图表。 enter image description here

import sys
import numpy as np
import pandas as pd
import random
import string
import matplotlib.pyplot as plt
import matplotlib.gridspec as grid_spec


def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choice(chars) for _ in range(size))

month_labels = "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
month_list = np.r_[1:13]
month_bar_width = .35


plt.ion()
with plt.style.context('fivethirtyeight'):
    fig = plt.figure(figsize=(8.5, 11))
    gs = grid_spec.GridSpec(3, 3)
    ax1 = plt.subplot(gs[0:2, 0:])
    ax2 = plt.subplot(gs[2:3, 0])

    names = [id_generator(10) for _ in range(20)]
    counts = [random.randint(0,50) for _ in range(12)]

    current_bbox = ax1.get_position()
    bottom_of_1 = current_bbox.y0
    current_bbox.y0 += (1 - current_bbox.y0) * .25
    ax1.set_position(current_bbox)

    cell_text = []
    row_labels = []
    row_colors = []
    bar_start = np.arange(len(month_list))
    bar_width = (bar_start[1] - bar_start[0]) * 0.7
    row_bottom = np.zeros(len(month_list))

    ax1.bar(bar_start, counts, width=bar_width)
    cell_text.append(counts)
    tbl = ax1.table(cellText=cell_text,loc='bottom')
    ax1.set_xticks([])

    rows = list(zip(names, counts))
    tbl = ax2.table(cellText=rows, loc='center')
    ax2.set_xticks([])
    ax2.set_yticks([])

更新2 我可以在上一个答案中添加以下代码:

table_props = tbl.properties()
table_cells = table_props['child_artists']
for cell in table_cells: cell.set_height(0.1)

但是通过观察图表并查看当前高度值来挑选0.1。我正在寻找的是如何在不看图的情况下计算0.1。如果当前高度为.5且高度太小,我需要将其放大,但如果我想让它变小,则必须为.4。了解你所处的情况的公式是什么。或者反过来知道高度是好的,但你需要改变字体大小。

2 个答案:

答案 0 :(得分:0)

在更新2中,您只更改第二个表。

无论如何,我想你正在寻找tight_layout()函数,只需尝试在最后添加:

plt.tight_layout(h_pad=2)

h_pad设置两个子图之间的高度空间,所以这里2是因为你有一个上面有一行的表。 (虽然经验确定);

AFAIK是matplotlib中唯一能够自动更改绘图属性以调整元素间距的函数plt.tight_layout()plt.savefig(..., bbox_inches="tight")

有关详细信息,请参阅此处:http://matplotlib.org/users/tight_layout_guide.html

HTH

答案 1 :(得分:0)

不要在家里试试这个,这是基本的答案。如果你只有一个图表和表格,那么tight_layout就可以了。如果你在一个图中有多个图表,那么它不起作用。

我的解决方案是为表条目创建一个单独的gridspec区域。将表放入轴,然后执行tight_layout。这有效。表定位可能很棘手,但我确实让它起作用。