首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matplotlib表格格式-更改行标签单元格的宽度

Matplotlib表格格式-更改行标签单元格的宽度
EN

Stack Overflow用户
提问于 2012-12-18 04:04:37
回答 2查看 7K关注 0票数 7

我对这个表有一个明显的问题,因为行标签在图的外部,我不知道如何修复它。我知道我可以进入儿童艺术家,并在那里改变高度和宽度等设置,但我已经尝试过了,它不起作用,所以也许你现在可以帮助我。

这是我用来做这个的代码,希望它不会太难读……:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2017-11-15 02:54:33

我还没有找到这个问题的完美答案,但我已经找到了一个对我自己的目的有用的解决方案。

同时调整colWidth和表的宽度可以缩小行标签列的宽度。在source code中,他们实际上使用了一个变量rowLabelWidth,但是他们不让用户设置它。不管怎样,首先我要重写你的现有代码,这样你就可以看到在哪里做了修改。这是一个可变格式的原件:

代码语言:javascript
复制
## 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设置为什么。

代码语言:javascript
复制
# 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

代码语言:javascript
复制
tb_width = 0.7

rowLabelWidth会自动调整大小,这对我们并没有真正的帮助。但是,如果您尝试使用colWidths的以下三个选项,您就可以开始弄清楚如何让它以您想要的方式工作。在bbox属性中添加,以指定表的具体位置。需要注意的重要一点是,rowLabelWidth似乎并未包含在整个表格宽度中。

代码语言:javascript
复制
## 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-column的最左侧直接位于上面图表的左下角。

代码语言:javascript
复制
bbox = [tb_colWidth, y_coordinate, tb_width, tb_height]

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

代码语言:javascript
复制
bbox = [tb_colWidth, y_coordinate, tb_width - tb_colWidth, tb_height]

现在把它们放在一起:

代码语言:javascript
复制
the_table=plt.table(cellText = data,
            rowLabels = rowLabels, rowColours = rowColours,
            colLabels = colLabels, loc = 'bottom',
            colWidths = colWidths, bbox = bbox)

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

票数 2
EN

Stack Overflow用户

发布于 2018-07-24 01:53:41

我遇到了这个问题,我通过将行标签的对齐方式从“左”改为“右”,部分修复了这个问题。

代码语言:javascript
复制
cellDict = the_table.get_celld()
for x in range(1, len(row_labels)+1):
    cellDict[(x,-1)]._loc = 'right'

get_celld()返回单元格的字典,cellDict(x,-1)选择x行和-1列中的单元格,即行标签列。

这不会更改行标签列的宽度,因此标签左侧可能仍留有空格。我的页面显示在屏幕左侧,但至少我现在可以看到行标签中的所有文本了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13921338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档