2016-03-06 13 views
0

我有像this這樣的表問題,顯然使用爲該答案提供的解決方案,我可以調整單元格。我不明白的是,沒有做眼球測試,如何檢測,一個是太大,另一個是太小檢測matplotlib表需要調整

更新 的代碼創建如下圖。請注意表格下文字的大小和列表中文字的大小。在太大,名單太小。我如何以編程方式檢測這些條件,而不必直觀地查看圖表。 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。知道你處於什麼狀況的公式是什麼?或者相反知道高度是好的,但你需要改變字體大小。

+0

你的問題聽起來不清楚。請提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),以及您的期望。 – jrjc

+0

已更新,以說明該問題。 – cryptoref

+0

儘管你做了一些努力,但這不是一個最小的,完整的和可驗證的例子。請提供您期望的和您嘗試的。 – jrjc

回答

0

在家裏不要嘗試這個,是基本的答案。如果你只有一個圖表和表格,那麼tight_layout就可以實現。如果在一個圖中有多個圖表,則不起作用。

我的解決方案是爲表格條目創建一個單獨的gridspec區域。把表放入軸,然後做tight_layout。這工作。表定位可能會很棘手,但我確實得到它的工作。

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

+0

感謝您的期待,但tight_layout不起作用。你必須注意弄清楚要添加多少墊,這正是我想要避免的。如果你在下面的表格中添加一行,它確實會改變打擊墊,然後尺寸改變,這是不可行的。我的問題是,我不知道會有多少年的數據。它可能是1到10,所以我需要隨時修改。 – cryptoref