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