Matplotlib表 - 为不同的列指定不同的文本对齐方式

时间:2018-01-11 15:38:10

标签: python matplotlib

我正在创建一个两列表,并希望文本尽可能接近。如何指定第一列是右对齐而第二列是左对齐?

我试过将普通cellloc设置为一边(cellloc设置文本对齐)

from matplotlib import pyplot as plt

data = [['x','x'] for x in range(10)]
bbox = [0,0,1,1]

tb = plt.table(cellText = data, cellLoc='right', bbox = bbox)
plt.axis('off') # get rid of chart axis to only show table

然后循环遍历第二列中的单元格以将它们设置为左对齐:

for key, cell in tb.get_celld().items():
    if key[1] == 1: # if the y value is equal to 1, meaning the second column
        cell._text.set_horizontalalignment('left') # then change the alignment

上面的这个循环无效,文字保持右对齐。

我错过了什么吗?或者这不可能吗?

修改

一种解决方法是让我将数据分成两个不同的列表,每列一个。这产生了我正在寻找的结果,但我想知道是否有人知道另一种方式。

data_col1 = [xy[0] for xy in data]
data_col2 = [xy[1] for xy in data] 

tb = plt.table(cellText = data_col2, rowLabels=data_col1, cellLoc='left', rowLoc='right', bbox = bbox)

2 个答案:

答案 0 :(得分:4)

您需要在表格单元格内设置文本的位置,而不是设置文本本身的对齐方式。这由单元格的._loc属性决定。

def set_align_for_column(table, col, align="left"):
    cells = [key for key in table._cells if key[1] == col]
    for cell in cells:
        table._cells[cell]._loc = align

一些完整的例子:

from matplotlib import pyplot as plt

data = [['x','x'] for x in range(10)]
bbox = [0,0,1,1]

tb = plt.table(cellText = data, cellLoc='right', bbox = bbox)
plt.axis('off') # get rid of chart axis to only show table

def set_align_for_column(table, col, align="left"):
    cells = [key for key in table._cells if key[1] == col]
    for cell in cells:
        table._cells[cell]._loc = align

set_align_for_column(tb, col=0, align="right")
set_align_for_column(tb, col=1, align="left")

plt.show()

enter image description here

(此处使用的方法类似于更改此问题中的单元格填充:Matplotlib Text Alignment in Table

答案 1 :(得分:0)

另一种可能的解决方案是使用表格的get_celld()方法,它返回matplotlib.table.CustomCell个对象的字典,然后你可以循环并以与@ImpancendOfBeingErnest的答案相同的方式进行更改:< / p>

from matplotlib import pyplot as plt

data = [['x','x'] for x in range(10)]
bbox = [0,0,1,1]

tb = plt.table(cellText = data, cellLoc='right', bbox = bbox)
plt.axis('off')

cells = tb.get_celld()

for i in range(0, len(data)):
    cells[i, 1]._loc = 'left'   # 0 is first column, 1 is second column

plt.show()

哪个会得到相同的结果。