Точки разброса на краю участка в Gridspec обрезаются - PullRequest
0 голосов
/ 17 октября 2019

Если я определю Gridspec следующим образом:

import matplotlib.gridspec as grd
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(15,8))
gs = grd.GridSpec(2, 1, wspace=0, hspace=0, height_ratios=[0.5, 0.5])

first = plt.subplot(gs[0])
second = plt.subplot(gs[1])

first.set_ylim(5, 10)
first.set_xlim(0, 10)
second.set_ylim(0, 5)
second.set_xlim(0, 10)

и затем нанесу точку на краю одного из участков, разделяющих границу,

first.scatter(5, 5)
plt.show()

точка получитсяобрезается по границе, и отображается только верхняя половина круга рассеяния. Есть ли способ показать точку через границу? (Добавление clip_on=False не влияет на результат).

Частичное решение - установить second.patch.set_alpha(0) так, чтобы появилась вторая половина точки рассеяния. Проблема заключается в том, что на моем исходном графике для каждого вспомогательного участка был задан цвет фона

second.axhspan(*second.get_ylim(), facecolor='red', alpha=0.5)

, и поэтому даже если я установил прозрачный фон осей с помощью second.patch.set_alpha(0), точка пересечения теперь будетпусть половина будет покрыта альфа-цветом 0.5, чего я не хочу. Проще говоря, я хочу, чтобы точки разброса имели zorder выше, чем что-либо еще, включая окружающие участки.

Единственное другое решение, о котором я подумал (если действительно нет простого способа сделать это), это наложить прозрачные оси на всю фигуру и нанести на них мои точки разброса. Причина, по которой я не хочу этого делать, заключается в том, что в действительности мой Gridspec очень сложен и объединяет несколько нелинейных осей Y, и, следовательно, отображение точек из абсолютных координат в относительные координаты фигуры будет довольно сложным.

1 Ответ

1 голос
/ 18 октября 2019

Как то так?

import numpy as np
import matplotlib.pyplot as plt

def forward(a):
    x = a
    ind = np.where(a>5)[0]
    x[ind] = (x[ind] - 5)*5/95 + 5
    return x


def inverse(a):
    x = a
    ind = np.where(a>5)[0]
    x[ind] = (x[ind] - 5) * 95 / 5 + 5
    return x

fig, ax = plt.subplots()

t = np.arange(0, 10, 0.01)
x = t * 10

ax.plot(t, x, 'd', ms=3)

ax.set_yscale('function', functions=(forward, inverse))
ax.set_xlim([0, 10])
ax.set_ylim([0, 100])
ax.set_yticks([0, 1, 2, 3, 4, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])

plt.show()

enter image description here

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