Matplotlib 带有自定义定位器的小刻度并不全部可见

问题描述 投票:0回答:1

我正在开发一个集成 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 仍然提供正确的数据,因为:

  1. 旧版 Matplotlib 运行正常(在同一数据集上)
  2. 如果我在图表上设置稍微不同的缩放窗口,有时会出现一些小刻度,然后不会,反之亦然。

如何解决这个问题,而不需要摆弄 CustomLocator 提供的不完全匹配的时间?

matplotlib visibility xticks
1个回答
-3
投票

为了解决您在升级到版本 3.5.3 后 matplotlib 的

CustomLocator
未显示所有小刻度的问题,重要的是要了解 matplotlib 对定位器和格式化程序的处理可能已经发生了变化,影响了自定义定位器与轴的交互方式。在不修改
CustomLocator
提供的计时精度的情况下,您可以考虑采取一些策略来确保正确显示小刻度。

理解问题

问题似乎是由于 matplotlib 处理与数据点或轴刻度不精确匹配的定位器输出的方式发生变化而引起的。在以前的版本中,可能存在隐式“捕捉”到最近的有效点,其行为不再相同。

可能的解决方案

1.调整
CustomLocator
实施

确保您的

CustomLocator
尽可能与轴数据点对齐。即使您不想更改计时精度,稍微调整定位器确定位置的方式也可能会有所帮助。

  • 捕捉到最近的数据点:修改
    CustomLocator
    以显式查找
    ax1
    轴上最近的实际数据点并将其用于刻度位置。

2.利用
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())

3.后处理刻度位置

设置定位器后,通过将刻度线位置与轴数据点更紧密地对齐的功能来过滤刻度线位置,从而手动调整刻度线位置。

ticks = self.ax1.xaxis.get_minor_ticks()
# Filter or adjust ticks list here
self.ax1.xaxis.set_minor_locator(mticker.FixedLocator(ticks))

4.调查
set_minor_locator
行为

深入了解

set_minor_locator
在较新的 matplotlib 版本中的工作原理。可能会有新的参数或方法更直接地影响次要刻度的显示。

调试步骤

  • 查看 Matplotlib 变更日志:查找有关旧 matplotlib 版本和 3.5.3 之间的版本中定位器或轴处理更改的任何注释。
  • 检查源代码:有时,直接查看相关版本的 matplotlib 源代码可以揭示影响您问题的内部更改。

最后注意事项

考虑到您的具体情况(不想调整

CustomLocator
的计时精度),重点应该是将定位器的输出与轴的期望尽可能接近地对齐,无论是通过定位器本身的调整还是后处理它的输出。如果这些策略不能解决问题,请考虑联系 matplotlib 开发社区以获取见解或潜在的错误报告。

© www.soinside.com 2019 - 2024. All rights reserved.