表中的Matplotlib文本对齐

时间:2017-06-28 09:15:55

标签: python matplotlib

我正在努力左右对齐文本而不会浪费列中的空间。中心/左/右使用相同的col宽度:

  1. Center aligned:正确居中,确定
  2. Left aligned:左侧浪费的空间
  3. 即使将colWidths省略为表格参数并使用我最喜欢的解决方案the_table._autoColumns = range(-1,len(colLabels))也不会改善这种情况
  4. 我做错了什么?这是matplotlib中的错误吗?

    最诚挚的问候, 勒

    import pandas as pd 
    import matplotlib.pyplot as plt
    
    size_x, size_y = 12, 4
    fig = plt.figure (figsize=(size_x, size_y))
    ax  = fig.add_subplot(111)
    
    col_ID    = pd.Series ([ "R001", "R002", "R003", "R005", "R006", "R007" ])
    col_Title = pd.Series ([ 50*"*", 10*"-", 70*"x", "R005", "R006", "R007" ])
    col_x     = pd.Series ([  3,      1,      3,      4,      2,      3 ])
    col_y     = pd.Series ([  4,      2,      3,      2,      4,      3 ])
    
    legend_df = pd.DataFrame ({ "ID"    : col_ID,
                                "Title" : col_Title,
                                "X-Pos" : col_x,
                                "Y-Pos" : col_y,
                                "Value" : col_x * col_y })
    rowLabels = legend_df.index
    colLabels = legend_df.columns
    cellText  = legend_df.values
    
    # Center-Aligned text looks ok
    the_table = plt.table (cellText=cellText, rowLabels=rowLabels, colLabels=colLabels, loc='upper center', cellLoc="center", colWidths=[0.05, 0.52, 0.05, 0.05, 0.05, 0.05])
    
    # Bogus: Same colWidths, but left OR right aligned -> unwanted space in title column
    # the_table = ax.table (cellText=cellText, rowLabels=rowLabels, colLabels=colLabels, loc='upper center', cellLoc="left", colWidths=[0.05, 0.52, 0.05, 0.05, 0.05, 0.05])
    
    the_table.auto_set_font_size(False)
    the_table.set_fontsize (8)
    
    # Set col width automatically
    # the_table._autoColumns = range (-1,len (colLabels))
    
    ax.xaxis.set_visible (False)                                            # Grafik-Achsen ausschalten, wir wollen nur Plot
    ax.yaxis.set_visible (False)
    # the_table.scale(2, 2) 
    
    plt.show()
    

2 个答案:

答案 0 :(得分:2)

默认情况下,单元格的两边都有10%的填充,这有助于让文本在表格单元格边框旁边稍微开始。对于非常大的电池,10%则太多并且导致不希望的大空间。

enter image description here

为了克服这一点,需要将所讨论的列的填充设置为较低的值,因为对于所有其他列,实际上需要10%。没有内置选项来设置填充,但可以通过循环遍历列的单元格并更改相应的PAD属性来操作它。

def set_pad_for_column(col, pad=0.1):
    cells = [key for key in the_table._cells if key[1] == col]
    for cell in cells:
        the_table._cells[cell].PAD = pad

set_pad_for_column(col=1, pad=0.01)

这仅为第二列(col=1)生成1%的填充。

enter image description here

答案 1 :(得分:0)

等效于ImportanceOfBeingErnest的回答,但语法较短(不作为函数):

 for key,cell in the_table.get_celld().items():
    if key[1]==1:                   
        cell.PAD = 0.01

代码获取the_table的第二列并更改填充。