Matplotlib: пользовательский форматировщик оси с использованием координат отображения - PullRequest
1 голос
/ 01 декабря 2011

В Matplotlib я хотел бы использовать FunctionFormatter для оси y, чтобы отформатировать тики так, чтобы тики не отображались в области рядом с нижней частью графика. Это делается для создания области без данных «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 Ответ

1 голос
/ 01 декабря 2011

Formatter не имеет ничего общего с отображением тиков, оно контролирует только то, как форматируются метки тиков.Что вам нужно, так это модифицированный Locator, который определяет положение отображаемых тиков.

Есть 2 способа выполнить задачу:

  • написать свой собственный класс 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...