Как заставить цвет поверх карты цветов в matplotlib?

Я работаю над игрой для 0 игроков, в которой «существо» перемещается по карте, поедая пищу, чтобы выжить, при этом каждый ход стоит ему энергии, а поедание пищи добавляет энергии. Карта еды представляет собой случайно сгенерированный двумерный массив, в каждой позиции которого находится случайное количество еды.

food = np.random.randint(0, high=8, size=[10,10])

По мере того, как существа едят пищу, ценность еды в этом месте соответственно уменьшается.

Существо — это объект с переменными «id», «energy», «xpos» и «ypos». Идентификатор — это целое число, которое является «именем» этого существа. (В конце концов я хочу, чтобы в этой игре несколько существ соревновались друг с другом.)

class Creature:
    def __init__(self, xpos,ypos, energy):
        self.id = 1
        self.xpos = xpos
        self.ypos = ypos
        self.energy = energy

Программа работает в цикле, где каждый ход стоит существу 1 очко энергии. Если его энергия падает ниже значения, он становится голодным и пытается найти место, содержащее пищу, которую начинает есть. По мере того, как существо ест пищу, ценность еды для этой позиции уменьшается.

Я пытаюсь отобразить это визуально, используя matplotlib. В настоящее время я использую это для создания тепловой карты еды и, отдельно, сетки, показывающей местоположение существа:

def colormap(data):
    fig, ax = plt.subplots()
    ax.imshow(data)    
    ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
    ax.set_xticks(np.arange(-.5, 10, 1));
    ax.set_yticks(np.arange(-.5, 10, 1));    
    plt.show()

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

Я застрял в том, куда идти дальше. Возможно, matplotlib здесь не подходит.

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

Спасибо за любую помощь, я понимаю, что могу ошибаться в своем подходе

#Import modules
import random 
import matplotlib.pyplot as plt
import numpy as np

#Create a heatmap grid from an array
def colormap(data):
    fig, ax = plt.subplots()
    ax.imshow(data)    
    ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
    ax.set_xticks(np.arange(-.5, 10, 1));
    ax.set_yticks(np.arange(-.5, 10, 1));    
    plt.show()

#Creatue a new creature object
class Creature:
    def __init__(self,ID, xpos,ypos,energy):
        self.id = 1
        self.xpos = xpos
        self.ypos = ypos
        self.energy = energy


#Create the variables of that creature
xpos = random.randint(0,9)
ypos = random.randint(0,9)
energy = (10)

   

#Now that random attributes have been chosed and it has found a unique location, it spawns
newcreature = Creature(id,xpos,ypos,energy)

#Create an array to hold the ID of the creature occupying each space
occupant = np.full((10,10),0)

#creatue food map
food = np.random.randint(0, high=8, size=[10,10])


#Write the ID of the creature to the map of creature occupying that place in the map
occupant[newcreature.xpos,newcreature.ypos] = newcreature.id

#Display the food map
colormap(food)

#Display the creature map
colormap(occupant)
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Matplotlib может быть инструментом для этой работы, если вас не беспокоит частота кадров.

Вы очень близки к своей цели: вам нужно использовать цветовую карту для карты еды и точечную диаграмму, чтобы наложить положение существа (также с цветовой картой, чтобы указать уровень энергии). Вот модифицированный код, я прокомментировал его, чтобы вы лучше поняли:

import random 
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
import matplotlib.cm as cm
import numpy as np

#Create a heatmap grid from an array
def colormap(data, cmap_food, norm_food, pos, energy_cmap, norm_energy, current_energy):
    fig, ax = plt.subplots()
    img = ax.imshow(data, cmap=cmap_food, norm=norm_food)    
    s = ax.scatter(*pos, s=150, cmap=energy_cmap, norm=norm_energy, c=current_energy, label="energy")
    ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
    cb_energy = fig.colorbar(s)
    cb_energy.set_label("Energy", rotation=90)
    cb_food = fig.colorbar(img)
    cb_food.set_label("Food", rotation=90)
    ax.set_xticks(np.arange(-.5, 10, 1));
    ax.set_yticks(np.arange(-.5, 10, 1));
    plt.show()

#Creatue a new creature object
class Creature:
    def __init__(self,ID, xpos,ypos,energy):
        self.id = 1
        self.xpos = xpos
        self.ypos = ypos
        self.energy = energy


#Create the variables of that creature
xpos = random.randint(0,9)
ypos = random.randint(0,9)
energy = 10

#Now that random attributes have been chosed and it has found a unique location, it spawns
newcreature = Creature(id,xpos,ypos,energy)

#creatue food map
max_food = 8
food = np.random.randint(0, high=max_food, size=[10,10])

# colormap used to visualize food
# You can explore more colormaps at:
# https://matplotlib.org/stable/tutorials/colors/colormaps.html
cmap_food = cm.YlGn

# Normalize the colors
# If we think that the food colormap is too intesense, we can either
# change the food colormap, or increase vmax to a number greater than
# max_food.
# Maybe, we would like the minimum food location not to be white:
# then we can change vmin to a negative number.
norm_food = Normalize(vmin=0, vmax=max_food)

# Choose an appropriate colormap, one that should be visible at
# every energy/food level on top of the food colormap.
energy_cmap = cm.cool_r
# normalize the energy of the creature between the minimum and maximum
norm_energy = Normalize(vmin=0, vmax=energy)
# position of the creature
pos = (newcreature.xpos, newcreature.ypos)

#Display the food map
colormap(food, cmap_food, norm_food, pos, energy_cmap, norm_energy, newcreature.energy)

enter image description here

Как только вы поймете этот код, вы можете начать играть с выбором лучших цветовых карт и установкой лучших значений в объектах Normalize.

Не забудьте отметить этот ответ как решение вашего вопроса. :)

Davide_sd 26.04.2022 09:42

Спасибо, отметил. Это мой первый вопрос. Все еще изучаю нормы и этикет :) Также мне нужно более тщательно изучить ваш код, но по какой-то причине частота кадров значительно улучшилась. Спасибо и за это!

thebiotechnologist 30.04.2022 00:34

Другие вопросы по теме