matplotlib 将时间轴年格式化为数字,将月格式化为缩写br

rggaifut  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(139)

我试图找到一种方法来格式化日期时间轴,以将年份显示为数字,将月份显示为小写字母。(例如APR)。我需要自己格式化它,但我还没有能够弄清楚如何。因为我只想显示Apr,Jul,Oct.我在ConciseDateFormatter中使用了MonthLocator。我尝试了以下方法:

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator
from matplotlib.dates import ConciseDateFormatter
from matplotlib.ticker import FuncFormatter

x = pd.date_range('2016-01-01', '2021-12-31', freq='M')
y = np.random.rand(len(x))

fig, ax = plt.subplots(figsize=(10, 8))
locator = MonthLocator((1, 4, 7, 10))
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(
    ConciseDateFormatter(
        locator, formats=['%Y', '%b', '%d', '%H:%M', '%H:%M', '%S.%f']
    )
)
ax.tick_params(axis='x', labelsize=8)
ax.plot(x, y)

但我希望轴是

2016 - APR - JUL - OCT - 2017 - APR - JUL -OCT - 2018 -

我试过a few ways,但都不管用。一旦我使用了用户定义的FuncFormatter,它就不再尊重我的ConciseDateFormatter。我想知道什么是最简单的方法来实现我想要的结果。我应该简单地写一个格式化程序函数,包括一个if语句吗?如果年和月都等于1,它应该显示年份数字;否则,它应该显示月份名称。如果是这样的话,我如何才能完成它?

nnsrf1az

nnsrf1az1#

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.dates import MonthLocator, num2date
from matplotlib.ticker import FuncFormatter

x = pd.date_range('2016-01-01', '2021-12-31', freq='M')
y = np.random.rand(len(x))

# Custom formatting function
def custom_date_formatter(x, pos):
    dt = num2date(x)
    if dt.month == 1:
        return dt.strftime('%Y')
    return dt.strftime('%b').upper()

fig, ax = plt.subplots(figsize=(10, 8))
locator = MonthLocator((1, 4, 7, 10))
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(FuncFormatter(custom_date_formatter))
ax.tick_params(axis='x', labelsize=8)
ax.plot(x, y)
plt.show()

预期结果:

相关问题