Как замаскировать часть строки в matplotlib

#python #numpy #matplotlib #python-imaging-library #drawing

#python #numpy #matplotlib #python-imaging-библиотека #рисование

Вопрос:

Я рисую несколько строк с помощью matplotlib на python :

 from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

fig_axes = (-100, 100, -50, 80)
x_range = (-800, 800, 33)
orig = (0,5)
x = np.linspace(x_range[0], x_range[1], x_range[2])

fig = plt.figure(figsize=(15, 9))

ax = fig.add_subplot(1,1,1)
ax.set_facecolor('black')
ax.axis([fig_axes[0], fig_axes[1], fig_axes[2], fig_axes[3]])


for i in x:
    ax.plot((orig[0], i), (orig[1], fig_axes[2]), 'r', linewidth=1.5)

plt.show()
 

Затем я получаю изображение, подобное этому :

вывод

Теперь я хочу скрыть всю часть выше 0 на графике. Я слышал о

numpy.ma.masked_where

но у меня нет массива, поэтому я не могу его использовать.

У вас есть какие-либо идеи, как я могу это сделать?

Я хочу что-то подобное :

исключенный вывод

Спасибо

Ответ №1:

нарисуйте прямоугольник, чтобы скрыть

 import matplotlib.patches as patches
rect = patches.Rectangle((-100,0),200,80,facecolor='black',fill=True,zorder=20)
ax.add_patch(rect)
 

или пересчитать конечные точки, должна быть базовая геометрия

Ответ №2:

Вы можете задать прямоугольный путь обрезки строк:

 from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mp

fig_axes = (-100, 100, -50, 80)
x_range = (-800, 800, 33)
orig = (0,5)
x = np.linspace(x_range[0], x_range[1], x_range[2])

fig = plt.figure(figsize=(15, 9))

ax = fig.add_subplot(1,1,1)
ax.set_facecolor('black')
ax.axis([fig_axes[0], fig_axes[1], fig_axes[2], fig_axes[3]])

r = mp.Rectangle((fig_axes[0],fig_axes[2]), fig_axes[1]-fig_axes[0], 0-fig_axes[2], transform=ax.transData)
for i in x:
    l = ax.plot((orig[0], i), (orig[1], fig_axes[2]), 'r', linewidth=1.5)
    l[0].set_clip_path(r)
 

Комментарии:

1. @BingWang Это именно то, что я сделал, но я думаю, что есть «более чистый» способ сделать это

Ответ №3:

Итак, как и было запрошено в комментарии, я рисую на нем прямоугольник с :

 ax.add_patch(ptc.Rectangle((fig_axes[0], 0), (fig_axes[1]-fig_axes[0]), (orig[1] 5), fc ='black', zorder = 3))