Matplotlib:使用显示坐标的自定义轴格式化程序

时间:2011-11-30 20:45:37

标签: python matplotlib

在Matplotlib中,我想对y轴使用FunctionFormatter来格式化刻度,使得在绘图底部附近的区域中不显示刻度。这是为了形成“y无数据”区域,沿着图的底部的条带,其中将绘制没有y值的数据。

在伪代码中,该函数将是这样的:

def CustomFormatter(self,y,i):
        if y falls in the bottom 50 pixels' worth of height of this plot:
            return ''

def CustomFormatter(self,y,i):
        if y falls in the bottom 10% of the height of this plot in display coordinates:
            return ''

我很确定我必须使用倒置的axes.transData.transform才能做到这一点,但我不确定该怎么做。

如果重要的话,我还会提到:我也会在这个格式化程序中有其他格式规则,处理 有y数据的部分情节。

1 个答案:

答案 0 :(得分:1)

Formatter与显示刻度无关,它仅控制刻度标签的格式。你需要的是修改Locator,它定位显示的刻度位置。

有两种方法可以完成任务:

  • 编写自己的Locator类,继承自matplotlib.ticker.Locator。不幸的是,缺乏关于它是如何工作的文档,所以我从来没有能够做到这一点;

  • 尝试使用预定义的定位器来获得您想要的内容。例如,在这里,您可以从绘图中获取刻度位置,找到靠近底部的位置,并覆盖默认定位器,FixedLocator仅包含您需要的刻度。

作为一个简单的例子:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tkr

x = np.linspace(0,10,501)
y = x * np.sin(x)
ax = plt.subplot(111)
ax.plot(x,y)

ticks = ax.yaxis.get_ticklocs()      # get tick locations in data coordinates
lims = ax.yaxis.get_view_interval()  # get view limits
tickaxes = (ticks - lims[0]) / (lims[1] - lims[0])  # tick locations in axes coordinates
ticks = ticks[tickaxes > 0.5] # ticks in upper half of axes
ax.yaxis.set_major_locator(tkr.FixedLocator(ticks))  # override major locator 

plt.show()

这会生成以下图表:enter image description here