Как сделать градацию по цветам красный, желтый, зеленый, синий?

введите сюда описание изображенияНе получается сделать градацию по цветам, получается только хаос. Ниже пример цветов какой хочу сделать, и какой получился.

Пример цветов

Мой код

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. Если функция и правда бешенная, лучше её рисовать облаком точек.

→ Ссылка