在matplotlib中的刻度线之间居中x-tick标签

时间:2013-06-17 23:17:09

标签: python matplotlib pandas

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

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

enter image description here

以下是我用于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')

3 个答案:

答案 0 :(得分:18)

一种方法是使用次要刻度。这个想法是你设置次要刻度,使它们位于主要刻度之间,并手动指定标签。

例如:

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

修改:或者,正如评论中所建议的那样:

# 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)

实施例

<强>之前: Before

<强>后: enter image description here

答案 1 :(得分: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()])

答案 2 :(得分:0)

一种简单的替代方法是使用水平对齐并通过添加空格来操纵标签,如下面的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)

结果图:

Approximately centered tick labels