我想让刻度标记居中的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')
答案 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']))
三行:
这只是一个简单的例子。您可能希望通过在循环中填充列表来简化它。
您还可以尝试使用其他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)
<强>之前:强>
<强>后:强>
答案 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)
结果图: