26 June 2020

Задача двух осей и четырех графиков - введение


Данная задача появилась у меня когда я стал симулировать SEIRD модель Если посмотреть на пример графика, что там получается, то можно видеть что все данные размещаются на одном и том же.:



Этого, пожалуй, вполне хватит, если речь идет только о моделировании и вот почему:
на графиках, хоть и разный масштаб, но интересна динамика, поэтому даже учитывая малую амплитуду для данных Infected и Death мы тут видим качественное изменение, что вполне достаточно для анализа.

Теперь представим себе другой случай - мы не просто моделируем, но и смотрим соответствие модели экспериментальным данным.
Тогда:
  •  количество графиков удваивается - надо показывать как модельные так и реальные данные
  •  масштаб играет роль - насколько модель будет отражать реальные данные для того же графика Death при мелком размере графика будет непонятно.
Рассмотрим сначала простейщий пример, чтобы наглядно представлять принцип.
Для симуляции модельных данных я буду брать модель синуса и косинуса, а для симуляции реальных данных - просто добавлю туда случайные величины.

По факту для работы нам достаточно импортировать только NumPy:

import numpy as np

Данные будут храниться в глобальных переменных. Пусть амплитуды будут различаться.
Пусть ось x будет одинаковая.
Возьмем для примера два набора - y и y2, реальные данные будут тогда yr и yr2 соответственно:

x, y, y2, yr, yr2  = [], [], [], [], []

Теперь сначала вычислим данные для модельных наборов:

# параметры тригонометрический функций
f = 0.5; phase = 2

# 10 значений по оси х
x = np.linspace(0, 10, 10)

# y будет синусом
y = np.sin(f * x + phase)

# y2 будет косинусом с пятикратно более высокой амплитудой
y2 = 5*np.cos(f * x + phase)


Далее смоделируем реальные данные. Вычислять их будем по модельным, используя векторные возможности NumPy:

yr = y + np.random.random() * y
yr2 = y2 + np.random.random() * y2


Т.е. в каждой точке данные получаются умножением случайного числа в диапазоне (0,1) на модельные данные.

Если хочется решить задачу при минимальном кодировании, то логично сделать два графика - для y и для y2:



Если хочется уплотнить информацию - удобнее эти два графика сделать на одном, но с двумя осями.


Второй способ - более тяжелый с точки зрения кодирования, но более компактный: скажем в случае SEIRD модели надо четыре величины и их можно упаковать в два графика.

В дальнейшем мы эти варианты последовательно рассмотрим.

No comments:

Post a Comment