Как удалить текст, когда он выходит за пределы участка в matplotlib? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу написать текст на графике, но я заметил, что когда я перемещаю горизонтальное положение с помощью панорамирования matplotlib (клавиша P + перетаскивание мышью) и текст выходит за пределы области графика, он все равно появляется. Я хотел бы, чтобы он исчез, как только его положение превысит пределы оси X.

Вот картинка, чтобы прояснить себя:

enter image description here

Аннотации справа там быть не должно. Он должен присутствовать только в том случае, если положение аннотации находится внутри оси X.

Вот мой код:

from matplotlib.pyplot import figure, show
import numpy as np

fig = figure()
ax = fig.add_subplot(111, xlim=(0,1), ylim=(0,1), autoscale_on=False)
x,y = np.random.rand(2,200)
ax.scatter(x,y)
ax.text(np.mean(x), np.max(y), 'A',
        rotation = 0,
        ha = 'center',
        fontsize = 15,
        bbox=dict(facecolor='yellow',edgecolor='black', boxstyle='round'))
show()

РЕДАКТИРОВАТЬ: установка clip_on=True заставляет аннотацию исчезать, так как она должна быть выше максимума вертикальной оси. На следующем рисунке слева показано, что происходит, когда для этого аргумента установлено значение True; справа желаемое изображение.

enter image description here

1 Ответ

0 голосов
/ 29 августа 2018

При использовании clip_on=True путь клипа по умолчанию (т.е. область, которая обрезает исполнителя) - это оси. Здесь вы хотите обрезать по оси только в направлении х. В направлении у вы бы хотели обрезать по экстенту фигуры. Это возможно с помощью пользовательского пути клипа.

Такой путь клипа может быть патчем matplotlib, например, Rectangle. Затем прямоугольник может быть определен в смешанной системе координат, так что он простирается от 0 до 1 вдоль направления x в координатах осей и от 0 до 1 вдоль направления y в координатах фигуры. Установка пути обрезки текста к определенному прямоугольнику позволяет обрезать текст по осям по оси x и по фигуре в направлении y.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans


fig = plt.figure()
ax = fig.add_subplot(111, xlim=(0,1), ylim=(0,1), autoscale_on=False)
x,y = np.random.rand(2,200)
ax.scatter(x,y)

trans = mtrans.blended_transform_factory(ax.transAxes, fig.transFigure)
clippath = plt.Rectangle((0,0), 1, 1, transform=trans, clip_on=False)

txt = ax.text(np.mean(x), np.max(y), 'A',
        rotation = 0,
        ha = 'center',
        fontsize = 15,
        bbox=dict(facecolor='yellow',edgecolor='black', boxstyle='round'),
        clip_on=True)
txt.set_clip_path(clippath)

plt.show()

enter image description here

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