使用matplotlib将日期设置为x轴上的第一个字母

时间:2012-03-06 10:30:02

标签: python matplotlib

我有时间序列图(超过1年),其中x轴上的月份是Jan,Feb,Mar等形式,但我想只有月份的第一个字母(J) ,F,M等)。我使用

设置刻度线
ax.xaxis.set_major_locator(MonthLocator())
ax.xaxis.set_minor_locator(MonthLocator())

ax.xaxis.set_major_formatter(matplotlib.ticker.NullFormatter())
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%b')) 

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

我试图让@ Appleman1234建议的解决方案工作,但是因为我,我自己想要创建一个我可以保存在外部配置脚本中并导入其他程序的解决方案,我发现格式化程序不得不在formatter函数本身之外定义变量。

我没有解决这个问题,但我只是想在这里分享一些稍短的解决方案,以便你和其他人可以接受或离开它。

首先获得标签有点棘手,因为在设置刻度标签之前需要绘制轴。否则,当您使用Text.get_text()时,您只会得到空字符串。

您可能希望摆脱特定于我的案例的minor=True

# ...

# Manipulate tick labels
plt.draw()
ax.set_xticklabels(
    [t.get_text()[0] for t in ax.get_xticklabels(minor=True)], minor=True
)

我希望它有所帮助:)

答案 1 :(得分:2)

基于官方示例here的以下代码段对我有用。

这使用基于函数的索引格式化程序命令仅返回请求的月份的第一个字母。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import matplotlib.cbook as cbook
import matplotlib.ticker as ticker
datafile = cbook.get_sample_data('aapl.csv', asfileobj=False)
print 'loading', datafile
r = mlab.csv2rec(datafile)

r.sort()
r = r[-365:]  # get the last year

# next we'll write a custom formatter
N = len(r)
ind = np.arange(N)  # the evenly spaced plot indices
def format_date(x, pos=None):
    thisind = np.clip(int(x+0.5), 0, N-1)
    return r.date[thisind].strftime('%b')[0]


fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(ind, r.adj_close, 'o-')
ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
fig.autofmt_xdate()

plt.show()

答案 2 :(得分:0)

原始答案使用日期索引。这不是必需的。取而代之的是,您可以从DateFormatter('%b')获取月份名称,并使用FuncFormatter仅使用月份的首字母。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
from matplotlib.dates import MonthLocator, DateFormatter 

x = np.arange("2019-01-01", "2019-12-31", dtype=np.datetime64)
y = np.random.rand(len(x))

fig, ax = plt.subplots()
ax.plot(x,y)


month_fmt = DateFormatter('%b')
def m_fmt(x, pos=None):
    return month_fmt(x)[0]

ax.xaxis.set_major_locator(MonthLocator())
ax.xaxis.set_major_formatter(FuncFormatter(m_fmt))
plt.show()

enter image description here