matplotlib 同时显示大刻度(年)和小刻度(月)

a9wyjsp7  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(139)

以下最小示例显示的并非所有次要标签。显示哪些次要标签似乎取决于主要标签。

import numpy as np
import pandas as pd
import matplotlib.dates as mdates

dates = pd.date_range(start="2020-01-01", end="2023-01-01", freq="MS")

data = pd.Series(np.random.randint(5, 30, size=len(dates)), index=dates)

plt.plot(data.index, data.values)

ax = plt.gca()

ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.xaxis.set_minor_formatter(mdates.DateFormatter("%b"))
ax.set_xticks(
    ax.get_xticks(minor=True),
    ax.get_xticklabels(minor=True),
    rotation=90,
    fontsize=8,
    minor=True,
)

ax.xaxis.set_major_locator(mdates.YearLocator(month=6))
ax.xaxis.set_major_formatter(mdates.DateFormatter("\n%Y"))

plt.show()

下面是图:

如何显示所有次要标签(月)?

vsaztqbk

vsaztqbk1#

要做你正在寻找的,有几件事你需要做。
1.将ax.remove_overlapping_locs设置为false。这是关键,因为它不会删除存在主要刻度的次要刻度。更多信息here
1.将大刻度线和小刻度线的刻度线设置为相同的大小,以便月份整齐地显示在同一行中。
1.旋转次要刻度。更新了下面的代码。
请注意,我使用了figsize,这样图形就更长了,尽管这不是必要的。你可以把它拿走。

import numpy as np
import pandas as pd
import matplotlib.dates as mdates

dates = pd.date_range(start="2020-01-01", end="2023-01-01", freq="MS")

data = pd.Series(np.random.randint(5, 30, size=len(dates)), index=dates)

fig, ax = plt.subplots(figsize=(15,5))
plt.plot(data.index, data.values)
#ax = plt.gca()
ax.xaxis.remove_overlapping_locs = False

ax.xaxis.set_major_locator(mdates.YearLocator())
ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter("\n\n%Y"))
ax.xaxis.set_minor_formatter(mdates.DateFormatter("%b"))

ax.tick_params('x', length=4, width=1, which='both')
ax.tick_params(axis='x', which="minor", rotation=90, labelsize=8)
plt.show()

wpx232ag

wpx232ag2#

月份不一定是小刻度,它们也可以是大刻度。等你找到了

ax.set_xticks(
    ax.get_xticks(minor=True),
    ax.get_xticklabels(minor=True),
    rotation=90,
    fontsize=8,
    minor=True,
)

您正在将所有刻度替换为次要刻度。如果您只想对月份应用转换,我建议将上面的代码块替换为一个简单的

ax.tick_params(axis="x", which="minor", rotation=90, labelsize=8)

如果您想保留您的方法,只需按如下方式更改代码的顺序。

ax.xaxis.set_minor_locator(mdates.MonthLocator())
ax.xaxis.set_minor_formatter(mdates.DateFormatter("%b"))

ax.xaxis.set_major_locator(mdates.YearLocator(month=6))
ax.xaxis.set_major_formatter(mdates.DateFormatter("\n%Y")) 

ax.set_xticks(
    ax.get_xticks(minor=True),
    ax.get_xticklabels(minor=True),
    rotation=90,
    fontsize=8,
    minor=True,
)

相关问题