我正在开发一个集成 matplotlib 图表(时间序列)的应用程序。
在其中一张图表中,我使用自定义定位器来设置次要刻度位置。
self.ax1.xaxis.set_minor_locator(self.CustomLocator)
一切都按预期工作并显示所有小刻度,直到我升级到更新的 matplotlib 版本(当前为 3.5.3)。 现在它不再显示所有的小刻度。此行为似乎与以下事实有关:CustomLocator 提供的日期时间与 ax1 轴所基于的日期时间不完全相同。似乎较旧的 matplotlib 版本正在对最接近的现有 ax1 值进行某种裁剪,但较新的版本由于某种原因未能这样做。
我已经将 set_snap 和 set_clip_on 都设置为 true(_clipon 之前为 True,但 _snap 似乎默认为 None),不幸的是,这并没有解决问题。
我知道 CustomLocator 仍然提供正确的数据,因为:
有谁知道如何解决这个问题,而不需要摆弄 CustomLocator 提供的不完全匹配的时间?
为了解决您在升级到版本 3.5.3 后 matplotlib 的
CustomLocator
未显示所有小刻度的问题,重要的是要了解 matplotlib 对定位器和格式化程序的处理可能已经发生了变化,影响了自定义定位器与轴的交互方式。在不修改 CustomLocator
提供的计时精度的情况下,您可以考虑采取一些策略来确保正确显示小刻度。
问题似乎是由于 matplotlib 处理与数据点或轴刻度不精确匹配的定位器输出的方式发生变化而引起的。在以前的版本中,可能存在隐式“捕捉”到最近的有效点,其行为不再相同。
CustomLocator
实施确保您的
CustomLocator
尽可能与轴数据点对齐。即使您不想更改计时精度,稍微调整定位器确定位置的方式也可能会有所帮助。
CustomLocator
以显式查找 ax1
轴上最近的实际数据点并将其用于刻度位置。matplotlib.ticker.MaxNLocator
您可以子类化
matplotlib.ticker.MaxNLocator
或其他内置定位器并调整其行为,而不是完全自定义的定位器。这种方法可以让您从 matplotlib 的内部处理中受益,同时自定义刻度生成。
from matplotlib.ticker import MaxNLocator
class CustomMaxNLocator(MaxNLocator):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Customize the tick generation here
self.ax1.xaxis.set_minor_locator(CustomMaxNLocator())
设置定位器后,通过将刻度线位置与轴数据点更紧密地对齐的功能来过滤刻度线位置,从而手动调整刻度线位置。
ticks = self.ax1.xaxis.get_minor_ticks()
# Filter or adjust ticks list here
self.ax1.xaxis.set_minor_locator(mticker.FixedLocator(ticks))
set_minor_locator
行为深入了解
set_minor_locator
在较新的 matplotlib 版本中的工作原理。可能会有新的参数或方法更直接地影响次要刻度的显示。
考虑到您的具体情况(不想调整
CustomLocator
的计时精度),重点应该是将定位器的输出与轴的期望尽可能接近地对齐,无论是通过定位器本身的调整还是后处理它的输出。如果这些策略不能解决问题,请考虑联系 matplotlib 开发社区以获取见解或潜在的错误报告。