如何在pyplot.table中旋转列标题?

时间:2016-01-25 22:25:34

标签: python matplotlib

我在matplotlib中创建了一个表,但表头是长字符串,表值是只有几位数的数字。这给我留下了两个不好的选择:要么我的表比必要的要广泛,要么我的标题重叠。为了解决这个问题,我想旋转表格标题(可能达到90度)。换句话说,我想在python

中做this

现在我的简化代码:

import matplotlib, numpy
import matplotlib.pyplot as plt

data=numpy.array([[1, 2],[3,4]])
headings=['long heading 1', 'long heading 2']
fig=plt.figure(figsize=(5,2))
ax=fig.add_subplot(111, frameon=False, xticks=[], yticks=[])

the_table = plt.table(cellText=data, rowLabels=headings, colLabels=headings, colWidths=[0.3]*data.shape[1], loc='center') #0.3 for second image, 0.03 for first
#the_table.auto_set_font_size(False) #comment out for second image
#the_table.set_fontsize(10) #comment out for second image
the_table.scale(1, 1.6)
plt.show()

这会产生压扁图像或超宽图像(均显示如下)。在我的实际代码中,表格大约为30 x 30,因此单元格不能很宽。有人知道如何旋转列标题来解决这个间距问题吗? enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

我明白了。它不漂亮,但它的工作原理。我为每一列添加了两个注释 - 文本和一行以将其与下一列标题分开。我必须定义一些适用于表格的参数和花式标签(宽度,高度,col_width)和一些参数,以使花式标签正确排列。这个解决方案在我的30x30桌面上运行良好。

import matplotlib, numpy
import matplotlib.pyplot as plt

width=5
height=3
col_width=.075

data=numpy.array([[1, 2,5],[3,4,7],[7,9,5]])
headings=['long heading 1', 'long heading 2', 'longish 3']
fig=plt.figure(figsize=(width,height))
ax=fig.add_subplot(111, frameon=False, xticks=[], yticks=[])

the_table = plt.table(cellText=data, rowLabels=headings, 
    colWidths=[col_width]*data.shape[1], loc='center') #remove colLabels
the_table.auto_set_font_size(False) 
the_table.set_fontsize(10) 
the_table.scale(1, 1.6)

#custom heading titles - new portion
hoffset=0.42 #find this number from trial and error
voffset=0.66 #find this number from trial and error
line_fac=0.98 #controls the length of the dividing line
count=0
for string in headings:
    ax.annotate('  '+string, xy=(hoffset+count*col_width,voffset),
        xycoords='axes fraction', ha='left', va='bottom', 
        rotation=45, size=10)

    #add a dividing line
    ax.annotate('', xy=(hoffset+(count+0.5)*col_width,voffset), 
        xytext=(hoffset+(count+0.5)*col_width+line_fac/width,voffset+line_fac/height),
        xycoords='axes fraction', arrowprops={'arrowstyle':'-'})

    count+=1

plt.show()

enter image description here

答案 1 :(得分:0)

我刚刚找到了另一种解决方案:

for cell in table._cells:
    if cell[0] ==0:
        table._cells[cell].get_text().set_rotation(90)

第一个循环用于遍历所有单元格,第二个循环用于选择第一行/标题。

if cell[1] =- -1 

这将选择第一列,您也可能要旋转它。

然后,您可以旋转单元格文本,例如90°。