matplotlib中有多行x刻度标签

时间:2013-12-12 00:14:06

标签: python python-3.x matplotlib

我正在尝试制作类似于这个excel示例的情节:

example

我想知道是否在x刻度标签上有第二层(例如“5年统计摘要”)。我知道我可以使用\n创建多行刻度标签,但我希望能够独立地移动这两个级别。

4 个答案:

答案 0 :(得分:17)

这很接近:

xtick

fig = plt.figure( figsize=(8, 4 ) )
ax = fig.add_axes( [.05, .1, .9, .85 ] )
ax.set_yticks( np.linspace(0, 200, 11 ) )

xticks = [ 2, 3, 4, 6, 8, 10 ]
xticks_minor = [ 1, 5, 7, 9, 11 ]
xlbls = [ 'background', '5 year statistical summary', 'future build',
          'maximum day', '90th percentile day', 'average day' ]

ax.set_xticks( xticks )
ax.set_xticks( xticks_minor, minor=True )
ax.set_xticklabels( xlbls )
ax.set_xlim( 1, 11 )

ax.grid( 'off', axis='x' )
ax.grid( 'off', axis='x', which='minor' )

# vertical alignment of xtick labels
va = [ 0, -.05, 0, -.05, -.05, -.05 ]
for t, y in zip( ax.get_xticklabels( ), va ):
    t.set_y( y )

ax.tick_params( axis='x', which='minor', direction='out', length=30 )
ax.tick_params( axis='x', which='major', bottom='off', top='off' )

答案 1 :(得分:6)

由于缺乏声誉,我无法评论behzad的答案。我发现他的解决方案非常有用,但我想我会分享它而不是通过使用set_y()来控制垂直对齐,我只是添加了换行符来垂直偏移标签。所以,对于上面的例子:

xlbls = [ 'background', '\n5 year statistical summary', 'future build',
      '\nmaximum day', '\n90th percentile day', '\naverage day' ]

对我来说,这是一个更好的解决方案,可以保持多线标签和多层标签垂直对齐。

答案 2 :(得分:1)

由于声誉,我也无法发表评论,但对behzad的回答有一个小修正。

tick_params()'bottom'和'top'关键字使用布尔值,而不是字符串(至少对于py3.6)。例如,对我来说,使用bottom ='off'仍然会产生刻度线,而使用bottom = False会删除刻度线。

所以替换

ax.tick_params(axis ='x',which ='major',bottom ='off',top ='off')

使用

ax.tick_params(axis ='x',which ='major',bottom = False,top = False)

它有效!

答案 3 :(得分:0)

我发现的最佳解决方案是使用plt.annotate函数。这里描述得很好:in the last comment