有没有办法检测Matplotlib图中的缩放并根据缩放级别设置次要刻度格式?

时间:2015-03-05 00:51:56

标签: python matplotlib zoom axis-labels

我想绘制一个大数据范围但能够放大并获得分辨率。我需要使用自定义主要和次要刻度格式,因此我失去了使用缩放级别动态设置它们的能力。这个问题有实际解决方案吗?

2 个答案:

答案 0 :(得分:3)

您只需创建自己的tick formatter,然后将其附加到axes对象。

This示例包含您需要的一切。基本上,创建一个取得tick的值的函数,并返回你想要的tick标签 - 称之为my_formatter,然后执行此操作:

ax.xaxis.set_major_formatter(ticker.FuncFormatter(my_formatter))

并可选择

ax.xaxis.set_minor_formatter(ticker.FuncFormatter(my_formatter))

ticker.FuncFormatter(my_function)为您创建自定义格式化程序。

答案 1 :(得分:1)

如果刻度的格式实际上取决于缩放级别,则需要定义一个可以访问轴限制的刻度格式器。不幸的是,这不能直接使用 ticker.FuncFormatter 完成,因为传递给构造函数的函数没有将轴限制作为参数。 访问轴限制的一种方法是从 ticker.Formatter 继承并覆盖 __call__ 方法。

例如,这样的类可以定义如下。

import matplotlib.pyplot as plt
from matplotlib.ticker import Formatter

# Custom formatter class
class CustomFormatter(Formatter):
    def __init__(self, ax: Any):
        super().__init__()
        self.set_axis(ax)

    def __call__(self, x, pos=None):
        # Find the axis range
        vmin, vmax = self.axis.get_view_interval()
        # Use the range to define the custom string
        return f"[{vmin:.1f}, {vmax:.1f}]: {x:.1f}"

之后可以通过以下方式使用。

formatter = CustomFormatter(ax)
ax.yaxis.set_major_formatter(formatter)

这样,缩放时范围会相应调整。类似地,这可以针对次要刻度来实现。

测试和玩耍的完整示例:

data = [1, 4, 2, 7, 4, 6]
ax = plt.gca()
ax.plot(data)
ax.yaxis.set_major_formatter(CustomFormatter(ax))
plt.tight_layout()
plt.show()