25

我想让 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')
4

3 回答 3

24

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

例如:

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 之间。

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

您还可以尝试使用其他定位器或格式化程序

编辑:或者,如评论中所建议:

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

例子:

前: 前

后: 在此处输入图像描述

于 2013-06-18T00:03:51.267 回答
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()])
于 2016-07-08T13:03:40.553 回答
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)

结果图:

近似居中的刻度标签

于 2018-10-26T12:22:38.737 回答