Как на графике в Python закрасить точки которые находятся ниже линии одним цветом, а выше другим?
На вход программа принимает значения из двух файлов. В одном пишутся координаты x, в другом координаты y. Есть синусоида. Не могу сообразить, как сделать так, чтобы те точки, которые находятся под синусоидой окрасить одним цветом, а над синусоидой другим. Подскажите пожалуйста
from re import X
from tkinter import Y
import numpy as np
import matplotlib.pyplot as plt
with open("x_val.txt") as file:
x_val = [row.strip() for row in file]
with open("y_val.txt") as file:
y_val = [row.strip() for row in file]
Xpoints = [float(i) for i in x_val]
Ypoints = [float(i) for i in y_val]
х=np.linspace(0.0, 1.0, 2000)
y= np.sin(х)
plt.ylim(y.min(),y.max())
plt.plot(х,y, color = 'black')
plt.scatter(Xpoints, Ypoints, color = 'red')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
Ответы (2 шт):
Автор решения: strawdog
→ Ссылка
Сделайте небольшие подготовительные вычисления:
import numpy as np
import matplotlib.pyplot as plt
х=np.linspace(0.0, 1.0, 2000)
y= np.sin(х)
plt.ylim(y.min(),y.max())
plt.plot(х,y, color = 'black')
Xpoints=[.1,.3, .6, .8]
Ypoints=[.2,.2, .7, .4]
clr = [int(Ypoints[i] - np.sin(Xpoints[i])>0) for i in range(len(Xpoints))]
palette = ["red", "blue"]
colors = [palette[x] for x in clr]
plt.scatter(Xpoints, Ypoints, color = colors)
plt.xlabel('X')
plt.ylabel('Y')
Автор решения: CrazyElf
→ Ссылка
Если по оси x оба набора точек совпадают, то можно ещё как-то так, с помощью маскировки массивов:
import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt
Xpoints = np.linspace(0.0, 1.0, 2000)
Ypoints = Xpoints / 2 + 0.2
х=np.linspace(0.0, 1.0, 2000)
y= np.sin(х)
plt.ylim(y.min(),y.max())
plt.plot(х,y, color = 'black')
mask1 = Xpoints < y
mask2 = Ypoints >= y
plt.scatter(ma.masked_array(Xpoints, mask=mask1),
ma.masked_array(Ypoints, mask=mask1), color = 'blue')
plt.scatter(ma.masked_array(Xpoints, mask=mask2),
ma.masked_array(Ypoints, mask=mask2), color = 'red')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

