matplotlib 设置xlim时,次要刻度与主要刻度间隔不均匀/对齐

v7pvogib  于 2023-03-30  发布在  其他
关注(0)|答案(3)|浏览(190)

我正在绘制一些时间序列数据。我注意到,在绘制整个时间序列时,次要刻度(x轴)的间隔非常均匀。但是当我设置x轴限制(xlim)时,突然次要刻度开始变得越来越不同步。
正如你所看到的,在2017-01到2017-04之间,次要的滴答声是完全均匀分布的,但在2017-07它稍微偏离,然后在2017-10及以后变得更糟。
代码及图:

plt.figure(figsize=(10,6))
plt.xlim(datetime(2017, 1, 1), datetime(2019, 1, 1))
plt.minorticks_on()
plt.plot(df['Date'], df['Price'])

有没有什么方法可以让次要的刻度间隔完全?刻度的数量并不重要,重要的是它们的间隔要均匀。我现在不关心y轴。

zaqlnxep

zaqlnxep1#

您可以通过添加次要定位器(set_minor_locator)到您的代码并将其设置为月份来实现这一点,这将为每个月给予次要报价。更新了以下随机价格的示例代码...

Price = {'Price':np.random.randint(30, size=(20))}
df = pd.DataFrame(Price)
df['Date'] = pd.date_range(start = '2017-01-01', end = '2019-01-01', periods = len(df))

plt.figure(figsize=(10,6))
plt.xlim(datetime.datetime(2017, 1, 1), datetime.datetime(2019, 1, 1))
plt.minorticks_on()

## Add these lines
import matplotlib.dates as mdates
plt.gca().xaxis.set_minor_locator(mdates.MonthLocator()) ## Minor ticks every month

plt.plot(df['Date'], df['Price'])

huus2vyu

huus2vyu2#

您可以将set_major_locatorset_minor_locatormatploltib中的MultipleLocatorAutoLocator模块组合使用。

from datetime import datetime
from matplotlib.ticker import (MultipleLocator, AutoMinorLocator)

fig, axs = plt.subplots(figsize=(10,6))
plt.xlim(datetime(2017, 1, 1), datetime(2019, 1, 1))
axs.xaxis.set_major_locator(MultipleLocator(90))

# For the minor ticks, use no labels; default NullFormatter.
axs.xaxis.set_minor_locator(MultipleLocator(9))
6vl6ewon

6vl6ewon3#

多亏了@Redox,我才能想出一个解决方案:

from matplotlib.dates import MonthLocator, YearLocator

plt.figure(figsize=(10,6))
plt.xlim(datetime(2017, 1, 1), datetime(2019, 1, 1))
plt.minorticks_on()

is_label_year = re.match('^\d{4}$', plt.gca().xaxis.get_majorticklabels()[0].get_text())
plt.gca().xaxis.set_minor_locator(YearLocator() if is_label_year else MonthLocator())

plt.plot(df['Date'], df['Price'])

基本上,我有条件地设置YearLocatorMonthLocator,这取决于majorticklabels的格式分别是YYYY还是YYYY-MM

相关问题