Как обновить график в al oop? - PullRequest
0 голосов
/ 27 апреля 2020

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

Здесь я называю данные, которые я хочу построить:

def plotter(population):
for people in population:
    if people.status==0:
        plt.scatter(people.positionx,people.positiony,c='b')
    else:
        if people.healthstatus==0:
            plt.scatter(people.positionx,people.positiony,c='g')
        if people.healthstatus==1:
            plt.scatter(people.positionx,people.positiony,c='y')
        if people.healthstatus==2:
            plt.scatter(people.positionx,people.positiony,c='r')

это главное, где итерация модели

def main(iterations,populationsize):
    popde=generator(populationsize)
    population=popde[0]
    dead=popde[1]
    plt.ion()

    for numit in range(iterations):
        population=movement(population)
        popde2=infection(population,populationsize,dead)
        population=popde2[0]
        dead=popde2[1]
        populationsize=popde2[2]
        plotter(population)
        plt.pause(0.1)
        plt.draw()

Код работает отлично, это просто вопрос стиля

I пытался найти другие решения в Интернете, но я не мог найти то, что подходит для моей проблемы. Заранее спасибо всем, кто поможет!

1 Ответ

0 голосов
/ 27 апреля 2020

Я предполагаю, что population является списком и что атрибуты positionx и positiony объекта people являются скалярными числами (float или int). Для будущих вопросов рассмотрите возможность размещения минимального рабочего примера . Следующий код основан на этом ответе на аналогичный вопрос.

Нет необходимости создавать индивидуальные точечные диаграммы для каждого человека. Приведенный ниже код собирает все x-, y-позиции и цвета за один шаг и строит их в одном объекте точечной диаграммы. Этот точечный график создается до l oop (сохраняется в переменную sc) и затем передается в функцию plotter, которая обновляет свойства графика (позиции и цвета) на каждой итерации.

import matplotlib.pyplot as plt

def main(iterations,populationsize):
    popde=generator(populationsize)
    population=popde[0]
    dead=popde[1]
    plt.ion()

    sc = plt.scatter([], [])  # initialise empty scatter plot

    for numit in range(iterations):
        population=movement(population)
        popde2=infection(population,populationsize,dead)
        population=popde2[0]
        dead=popde2[1]
        populationsize=popde2[2]
        plotter(population, sc)  # pass scatter object to plotter function
        plt.draw()  # update the current figure
        plt.pause(0.1)


def plotter(population, sc):
    # create list of all x- and y-positions
    posx = [people.positionx for people in population]
    posy = [people.positiony for people in population]

    # create list of colors
    color = ['#88888']*len(population)  # initialise all colors as grey
    for ip, people in enumerate(population):
        if people.status == 0:
            color[ip] = 'b'
        elif people.healthstatus == 0:
            color[ip] = 'g'
        elif people.healthstatus == 1:
            color[ip] = 'y'
        elif people.healthstatus == 2:
            color[ip] = 'r'
        # if none of these criteria match, the marker remains grey

    sc.set_offsets(np.c_[posx, posy])  # update marker positions
    sc.set_color(color)  # update marker color

В качестве примечания я бы порекомендовал использовать «объектно-ориентированный стиль кодирования» для matplotlib при написании скриптов или функций. Приведенный выше код всегда отображается на активной в данный момент фигуре, поэтому, если вы ранее создали другую фигуру или активная фигура изменилась во время выполнения кода, вы можете неожиданно нарисовать неправильную фигуру.

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