【问题标题】:Centering x-tick labels between tick marks in matplotlib在 matplotlib 中的刻度线之间居中 x-tick 标签
【发布时间】:2013-06-14 01:09:16
【问题描述】:

我想让 x-tick 日期标签在刻度线之间居中,而不是如下图所示以刻度线为中心。

我已阅读文档,但无济于事 - 有人知道这样做的方法吗?

如果有帮助,这里是我用于 x 轴刻度格式的所有内容:

day_fmt = '%d'   
myFmt = mdates.DateFormatter(day_fmt)
ax.xaxis.set_major_formatter(myFmt)    
ax.xaxis.set_major_locator(matplotlib.dates.DayLocator(interval=1))     

for tick in ax.xaxis.get_major_ticks():
    tick.tick1line.set_markersize(0)
    tick.tick2line.set_markersize(0)
    tick.label1.set_horizontalalignment('center')

【问题讨论】:

    标签: python matplotlib pandas


    【解决方案1】:

    一个简单的替代方法是使用水平对齐并通过添加空格来操作标签,如下面的 MWE 所示。

    #python v2.7
    import numpy as np
    import pylab as pl
    from calendar import month_abbr
    
    pl.close('all')
    fig1 = pl.figure(1)
    pl.ion()
    
    x = np.arange(120)
    y = np.cos(2*np.pi*x/10)
    
    pl.subplot(211)
    pl.plot(x,y,'r-')
    pl.grid()
    
    new_m=[]
    for m in month_abbr: #'', 'Jan', 'Feb', ...
     new_m.append('  %s'%m) #Add two spaces before the month name
    new_m=np.delete(new_m,0) #remove first void element
    
    pl.xticks(np.arange(0,121,10), new_m, horizontalalignment='left')
    pl.axis([0,120,-1.1,1.1])
    
    fig1name = './labels.png'
    fig1.savefig(fig1name)
    

    结果图:

    【讨论】:

      【解决方案2】:

      这是使用定位器和格式化程序的替代方法。它可以用于标签之间的任何间距:

      # tick_limit: the last tick position without centering (16 in your example)
      # offset: how many steps between each tick (1 in your example)
      # myticklabels: string labels, optional (range(1,16) in your example)
      
      # need to set limits so the following works:
      ax.xaxis.set_ticks([0, tick_limit]) 
      # offset all ticks between limits:
      ax.xaxis.set(ticks=np.arange(offset/2., tick_limit, offset), ticklabels=myticklabels)
      # turn off grid
      ax.grid(False)
      

      由于这会修改主要刻度,因此可能需要调整网格 - 取决于应用程序。也可以使用ax.twinx()) 来解决这个问题。这将导致在单独轴的另一侧移动标签,但原始网格保持不变并提供两个网格,一个用于原始刻度,一个用于偏移量。

      编辑:

      假设间隔均匀的整数刻度,这可能是最简单的方法:

      ax.set_xticks([float(n)+0.5 for n in ax.get_xticks()])
      

      【讨论】:

        【解决方案3】:

        一种方法是使用次要刻度。这个想法是您将次要刻度设置为位于主要刻度之间的中间,然后您手动指定标签。

        例如:

        import matplotlib.ticker as ticker
        
        # a is an axes object, e.g. from figure.get_axes()
        
        # Hide major tick labels
        a.xaxis.set_major_formatter(ticker.NullFormatter())
        
        # Customize minor tick labels
        a.xaxis.set_minor_locator(ticker.FixedLocator([1.5,2.5,3.5,4.5,5.5]))
        a.xaxis.set_minor_formatter(ticker.FixedFormatter(['1','2','3','4','5']))
        

        三行:

        • “隐藏”主要刻度上的 1、2、3、4、...
        • 在主要滴答之间设置次要滴答(假设您的主要滴答位于 1、2、3...)
        • 手动指定次要刻度的标签。这里,“1”在图表上介于 1.0 和 2.0 之间。

        这只是一个简单的例子。您可能希望通过在循环中填充列表或其他方式来简化它。

        您也可以尝试其他locators or formatters

        编辑: 或者,按照 cmets 中的建议:

        # Hide major tick labels
        a.set_xticklabels('')
        
        # Customize minor tick labels
        a.set_xticks([1.5,2.5,3.5,4.5,5.5],      minor=True)
        a.set_xticklabels(['1','2','3','4','5'], minor=True)
        

        示例:

        之前:

        之后:

        【讨论】:

        • 谢谢,我会试试这个。有没有办法将已经存在的 x 轴刻度标签作为我可以使用的列表返回?我浏览了文档,但运气不佳。
        • a.xaxis.get_majorticklabels() 返回一个可迭代对象,您可以使用 for tl in a.xaxis.get_majorticklabels() 之类的内容对其进行循环。但请注意,此列表的元素不是您可能期望的字符串,而是matplotlib.text.Text 对象。要获得你想要的字符串:[tl.get_text() for tl in a.xaxis.get_majorticklabels()]。一个重要的注意事项是,在实际绘制绘图之前,这些值是不会确定的。因此,它们并不是获得标签的好方法。直接从数据中获取值会更好。
        • 我的 x 轴由半小时数据组成,因此我没有创建位置,而是添加了以下内容:ax.xaxis.set_minor_formatter(myFmt) ax.xaxis.set_minor_locator(matplotlib.dates.HourLocator(interval=12)) 并将我的主要格式化程序更改为您所做的,ax.xaxis.set_major_formatter(ticker.NullFormatter())但由于某种原因,它没有隐藏主要的刻度标签,还有什么我可能遗漏的吗?
        • 您可以通过使用a.set_xticksa.set_xticklabels 更轻松地做到这一点。两者都采用一个可选的布尔参数,称为次要使它们影响次要刻度,例如a.set_xticklabels(''); x.set_xticks([1.5,2.5,3.5,4.5,5.5],minor=True); a.set_xticklabels(['1','2','3','4','5'],minor=True)
        猜你喜欢
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 2012-03-14
        • 2013-03-24
        相关资源
        最近更新 更多