Как сделать градацию по цветам красный, желтый, зеленый, синий?
Не получается сделать градацию по цветам, получается только хаос. Ниже пример цветов какой хочу сделать, и какой получился.
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from tkinter import *
def makeData():
x = np.linspace(19.5, 20, 1000) # координаты и количество точек
y = np.linspace(19.5, 20, 1000)
xgrid, ygrid = np.meshgrid(x, y)
z = np.random.normal(xgrid, ygrid)
r = .1 # радиус маски
k=int(input('введите 1 для генерации центра маски, либо 0 для ввода стандартных параметров = '))
if k==1:
x0=float(input('Центр маски x '))
y0=float(input('Центр маски по y '))
else:
x0, y0 = 19.6, 19.7 # центр маски
X, Y = np.meshgrid(x, y)
mask = (X - x0) ** 2 + (Y - y0) ** 2 < r ** 2
return xgrid, ygrid, z, X, Y, mask
if __name__ == '__main__':
x, y, z, X, Y, mask = makeData()
fig = plt.figure(figsize=(10, 10))
axes = plt.axes(projection="3d")
cmap = LinearSegmentedColormap.from_list('red_blue', ['b', 'y', 'r'], 256)
axes.plot_surface(x, y, z *(1 + mask * 0.75), color='#11aa55', cmap=cmap)
axes.set_xlabel('x axis')
axes.set_ylabel('y axis')
axes.set_zlabel('Температура')
plt.show()
Ответы (1 шт):
Автор решения: Stanislav Volodarskiy
→ Ссылка
Вы рисуете полностью случайную функцию. Её соседние значения могут быть любыми. matplotlib не понимает как покрасить квадратик у которого голова в небесах а ноги на земле. Отсюда кажущийся хаос на картинках.
Вот пример для синуса. Я уменьшил число точек чтобы график можно было вращать:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from tkinter import *
def makeData():
x = np.linspace(19.5, 20, 100) # координаты и количество точек
y = np.linspace(19.5, 20, 100)
xgrid, ygrid = np.meshgrid(x, y)
z = np.random.normal(xgrid, ygrid)
f = 15
z = 3 + np.sin((f * (xgrid - 19.75)) ** 2 + (f * (ygrid - 19.75)) ** 2)
r = .1 # радиус маски
k=int(input('введите 1 для генерации центра маски, либо 0 для ввода стандартных параметров = '))
if k==1:
x0=float(input('Центр маски x '))
y0=float(input('Центр маски по y '))
else:
x0, y0 = 19.6, 19.7 # центр маски
X, Y = np.meshgrid(x, y)
mask = (X - x0) ** 2 + (Y - y0) ** 2 < r ** 2
return xgrid, ygrid, z, X, Y, mask
if __name__ == '__main__':
x, y, z, X, Y, mask = makeData()
fig = plt.figure(figsize=(10, 10))
axes = plt.axes(projection="3d")
cmap = LinearSegmentedColormap.from_list('red_blue', ['b', 'y', 'r'], 256)
axes.plot_surface(x, y, z *(1 + mask * 0.75), color='#11aa55', cmap=cmap)
# axes.scatter(x, y, z *(1 + mask * 0.75), c=z *(1 + mask * 0.75), cmap=cmap)
axes.set_xlabel('x axis')
axes.set_ylabel('y axis')
axes.set_zlabel('Температура')
plt.show()
Ещё вариант: поменяйте axes.plot_surface на axes.scatter. Если функция и правда бешенная, лучше её рисовать облаком точек.

