我正在用两条线构建一个线图,一条用于高温,另一条用于低温。x 轴基于日期时间格式(2014-01-01 等)一整年的天数。但是,我更改了几个月(一月、二月、三月等)的标签,而不是数据。问题是第一个标签“Jan”在原点。我想要的是将所有标签向右移动,使它们在刻度之间居中。
fig, ax = plt.subplots()
plt.plot(x, y1)
plt.plot(x, y2)
# Change x-axis from %y-%m-%d format to %m:
monthsFmt = mdates.DateFormatter('%m')
plt.gca().xaxis.set_major_formatter(monthsFmt)
# Replace numeric x-axis labels (1,2,3, ..., 12) for abbreviations of months ('Jan', 'Feb', 'Mar', etc.):
labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
ax.set_xticklabels(labels)
# CODE GOES HERE TO CENTER X-AXIS LABELS...
# Render plot:
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是我正在寻找的结果:
按照 DavidG 发布的帖子中的建议使用小刻度应该可行。下面是我针对您的具体问题进行了调整的 MWE,强制主要刻度线出现在每个月的第一天,并使用次要刻度线将标签放置在主要刻度线之间:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import datetime
# Generate some data for example :
yr = 2014
fig, ax = plt.subplots()
x0 = datetime.datetime(yr, 1, 1)
x = np.array([x0 + datetime.timedelta(days=i) for i in range(365)])
y1 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5
y2 = np.sin(2*np.pi*np.arange(365)/365) + np.random.rand(365)/5 - 1
# Draw high and low temperatures lines :
ax.plot(x, y1, color='#c83c34')
ax.plot(x, y2, color='#28659c')
ax.fill_between(x, y2, y1, facecolor='#daecfd', alpha=0.5)
# Force the major ticks position on the first of each month and hide labels:
xticks = [datetime.datetime(yr, i+1, 1) for i in range(12)]
xticks.append(datetime.datetime(yr+1, 1, 1))
ax.set_xticks(xticks)
ax.tick_params(axis='both', direction='out', top=False, right=False)
ax.axis([xticks[0], xticks[-1], -2.5, 1.5])
ax.set_xticklabels([])
# CODE GOES HERE TO CENTER X-AXIS LABELS...
labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
mticks = ax.get_xticks()
ax.set_xticks((mticks[:-1]+mticks[1:])/2, minor=True)
ax.tick_params(axis='x', which='minor', length=0)
ax.set_xticklabels(labels, minor=True)
fig.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)