Matplotlib表格式-更改行标签单元格的宽度 [英] Matplotlib table formatting - change width of row label cells

查看:171
本文介绍了Matplotlib表格式-更改行标签单元格的宽度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对这张表有一个明显的问题,因为行标签在图外,我不知道如何解决.我知道我可以进入儿童艺术家并在那里更改高度和宽度等内容,但我已经尝试过了,但没有奏效,所以也许你现在可以帮助我.

I have an obvious problem with this table, because the row labels are outside of the figure and I don't know how to fix it. I know I can go into child artists and change things like height and width there, but I already tried it and it didn't work, so maybe you can help me now.

这是我正在使用的代码,希望它不太难读....:

Here is the code I'm using for this, hope it isn't too hard to read.... :

ind1=np.arange(5)


figure()
axes([0.2, 0.45, 0.7, 0.45])

## define different bars
l1=bar((ind1-0.45),mean_morphing_cc[0:5],width=0.2,bottom=0,color='darkblue',yerr=[min_dif_morphing_cc[0:5],max_dif_morphing_cc[0:5]],error_kw=dict(elinewidth=2, ecolor='darkkhaki'))

l2=bar((ind1-0.25),mean_persistence_cc[0:5],width=0.2,bottom=0,color='darkred',yerr=[min_dif_persistence_cc[0:5],max_dif_persistence_cc[0:5]],error_kw=dict(elinewidth=2, ecolor='darkkhaki'))

l3=bar((ind1+0.05),mean_m_vs_p_cc[0:5],width=0.2,bottom=0,color='purple',yerr=[min_dif_m_vs_p_cc[0:5],max_dif_m_vs_p_cc[0:5]],error_kw=dict(elinewidth=2, ecolor='darkkhaki'))

## print grid and a horizontal line at "0"
grid(True, linestyle='-', which='major', color='lightgrey',alpha=0.5)

hlines(0, -0.5,(max(ind1)+0.5), colors='k', linestyles='solid')


ylabel('mean((cloud cover_forecast/cloud cover_observation)-1),\n mean("morphing" - "persistence")',horizontalalignment='right',multialignment='center',size='xx-small')

xlim(-0.5,(max(ind1)+0.5))

xticks(ind1,[])

## print a legend
legend((l1[0],l2[0],l3[0]),('mean morphing cloud cover','mean persistence cloud cover','mean morphing vs persistence error'),'lower center',ncol=2,bbox_to_anchor=(0.5,-0.92),borderpad=0.2,labelspacing=0.2,handlelength=1,handletextpad=0.2)

leg = plt.gca().get_legend()

ltext  = leg.get_texts()  # all the text.Text instance in the legend

llines = leg.get_lines()  # all the lines.Line2D instance in the legend

frame  = leg.get_frame()  # the patch.Rectangle instance surrounding the legend

frame.set_facecolor('0.90')      # set the frame face color to light gray

plt.setp(ltext, fontsize='x-small')    # the legend text fontsize

## print the title
title('cloud cover over- or underestimation\n morphing forecast compared to persistence',size='small')

## print the table
the_table=plt.table(cellText=[[str(i)[:4] for i in mean_morphing_cc[0:5]],max_morphing_cc[0:5],min_morphing_cc[0:5],mean_persistence_cc[0:5],max_persistence_cc[0:5],min_persistence_cc[0:5],mean_m_vs_p_cc[0:5],max_m_vs_p_cc[0:5],min_m_vs_p_cc[0:5]],
                    rowLabels=['morphing: mean','morphing: max','morphing: min','persistence: mean','persistence: max','persistence: min','morph vs per: mean','morph vs per: max','morph vs per: min'],
                    rowColours=['darkblue','darkblue','darkblue','darkred','darkred','darkred','purple','purple','purple'],colLabels=['t+1','t+2','t+3','t+4','t+5'],loc='bottom')

## change cell properties
table_props=the_table.properties()
table_cells=table_props['child_artists']
for cell in table_cells:
    cell.set_width(0.2)
    cell.set_height(0.065)
    cell.set_fontsize(12)

show()

推荐答案

我还没有想出完美的答案,但我找到了一个对我自己有用的解决方案.

I haven't figured out the perfect answer to this, but I've found a solution that has been useful for my own purposes.

同时调整 colWidth 和 table 宽度可以缩小 rowLabel-column 的宽度.在源代码中,它们实际上是一个变量使用rowLabelWidth,但不允许用户进行设置.无论如何,首先我只是要重写您现有的代码,以便您可以看到进行了更改的位置.这是可变格式的原始文件:

Adjusting both the colWidth and the table width can shrink the rowLabel-column width. In the source code, there's actually a variable they use, rowLabelWidth, but they do not let the user set it. Anyways, first I'm just going to rewrite your existing code so you can see where changes are made. This is the original in a variable format:

## setting properties to variables to make table function easier to read
data = [[str(i)[:4] for i in mean_morphing_cc[0:5]],max_morphing_cc[0:5],min_morphing_cc[0:5],mean_persistence_cc[0:5],max_persistence_cc[0:5],min_persistence_cc[0:5],mean_m_vs_p_cc[0:5],max_m_vs_p_cc[0:5],min_m_vs_p_cc[0:5]]
rowLabels = ['morphing: mean','morphing: max','morphing: min','persistence: mean','persistence: max','persistence: min','morph vs per: mean','morph vs per: max','morph vs per: min']
rowColours = ['darkblue','darkblue','darkblue','darkred','darkred','darkred','purple','purple','purple']
colLabels = ['t+1','t+2','t+3','t+4','t+5']
loc = 'bottom'

## without changing anything, this is what your table function would look like
the_table=plt.table(cellText = data,
                rowLabels = rowLabels, rowColours = rowColours,
                colLabels = colLabels, loc = loc)

这是rowLabelWidth的源代码中的内容,我们将使用它来帮助确定将width和colWidth设置为什么.

Here's what's in the source code for rowLabelWidth, which we'll use to help figure out what to set width and colWidth to.

# Do row labels
if rowLabels is not None:
    for row in xrange(rows):
        table.add_cell(row + offset, -1,
                       width=rowLabelWidth or 1e-15, height=height,
                       text=rowLabels[row], facecolor=rowColours[row],
                       loc=rowLoc)
    if rowLabelWidth == 0:
        table.auto_set_column_width(-1)

看来您已将图表的宽度设置为轴 ([0.2, 0.45, 0.7, 0.45]) 为 0.7,因此我们将其设置为变量 tb_width

It appears you have set the chart to a width in axes([0.2, 0.45, 0.7, 0.45]), to 0.7, so we will set that to a variable, tb_width

tb_width = 0.7

rowLabelWidth 会自动调整大小,这对我们没有帮助.但是,如果您对 colWidths 使用以下三个选项,您就可以开始弄清楚如何使其按您想要的方式工作.在bbox属性中添加以明确说明表格的位置.需要注意的重要一点是,rowLabelWidth 似乎不包含在整个表格宽度中.

The rowLabelWidth gets auto-sized, which doesn't really help us. But if you play around with the following three options for colWidths, you can start to figure out how to make it work the way you want. Add in bbox properties to state specifically where the table should be. An important thing to note is that it appears the rowLabelWidth is not included in the overall table width.

## standard - essentially what happens when you don't specify colWidths. Takes the table width, divides it by the number of columns, giving each column an equal width.
colWidths = [tb_width/n_cols] * n_cols
## rowLabels stick out on the left

## similar to the above, but the '+1' attempts to account for the fact that another column's width, rowLabels, should fit inside the overall table width
colWidths=[( tb_width / (n_cols + 1) )] * n_cols  

## set your own width. this will start messing with the width of the rowLabelsWidth as now the colWidths aren't perfectly proportioned within the table width
tb_colWidth = 0.08
colWidths = [tb_colWidth] * n_cols

要确保 rowLabels 适合图表正下方而不突出在左侧,请使用 bbox 坐标.使用表格的左下角作为参考点,定位表格:bbox=[x_coordinate, y_coordinate, width, height].如果将x_coordinate设置为考虑到您的tb_colWidth,则它将使表格移动所需的确切数量,以使rowLabels列的最左侧直接位于上图的左下角.

To ensure that the rowLabels fit right beneath the chart without sticking out on the left, use bbox coordinates. Using the bottom left hand corner of the table as your reference point, position the table: bbox=[x_coordinate, y_coordinate, width, height]. If the x_coordinate is set to account for your tb_colWidth, then it will shift the table over the exact amount necessary to have the rowLabels-column's leftmost side directly under the left corner of the chart above.

bbox = [tb_colWidth, y_coordinate, tb_width, tb_height]

如果这现在导致最右边的列从图表下方突出,则将宽度缩小一列的大小:

If this now causes the rightmost column to stick out from under the chart, then shrink the width by the size of one column:

bbox = [tb_colWidth, y_coordinate, tb_width - tb_colWidth, tb_height]

现在将它们放在一起:

the_table=plt.table(cellText = data,
            rowLabels = rowLabels, rowColours = rowColours,
            colLabels = colLabels, loc = 'bottom',
            colWidths = colWidths, bbox = bbox)

您不必执行调整单元格宽度的最终表格单元格循环,而是可以使用上述工具进行控制.

You shouldn't have to do your final table cell loop of adjusting the cell widths, but instead, can control that using the above tools.

这篇关于Matplotlib表格式-更改行标签单元格的宽度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆