Графики распределения в дискретном времени с pyplot - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть куча распределений химических концентраций, соответствующих дискретным временам.Я хотел бы построить все эти распределения на одном графике (графике графиков) таким образом, как это сделано на этих рисунках (первое изображение взято из анализа байесовских данных, Крушке): enter image description here

Прямо сейчас у меня есть эти распределения в качестве параметров для объектов распределения scipy, и я могу изобразить их индивидуально, например (где normal_param, взято из scipy.optimize.curve_fit в обычном cdf):

from matplotlib import pyplot as plt
import numpy

# values = [some float, some other float] which is a list of cdf sample concentrations 
values = [...,...] 

mean = numpy.mean(values)
std = numpy.std(values)

x1 = numpy.linspace(mean - (4*std), mean + (6*std), num=200)

plt.plot(x1, stats.norm.pdf(x1, scale=normal_param[1], loc=normal_param[0]), 
linewidth=2.0, color='g')

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

Как создать график, которыйкак это выглядит в matplotlib?

1 Ответ

0 голосов
/ 28 сентября 2018

Это быстрое решение для достижения чего-то похожего на то, что вы хотите.Он основан на двух приемах:

  1. Используйте ax.plot(y,x) вместо ax.plot(x,y), чтобы получить ориентацию гауссианов, аналогичную вашему примеру
  2. Постройте всех ваших гауссианов на одной оси, но каждый раз добавляется увеличенное смещение, чтобы избежать наложения.

Это реализовано в следующем коде:

from scipy import stats
import matplotlib.pyplot as plt
import numpy as np


# Dummy values and dummy gaussian for plotting
gauss = lambda x, mu, sig, offset: offset-stats.norm.pdf(x, loc=mu, scale=sig)
means = [0, 1.5, 2.4, 2.8, 3.2]
scales = [1, 0.8, 0.6, 0.8, 0.7]
timesteps = list(range(len(means)))

# The actual plotting
fig, ax = plt.subplots(figsize=(6,4))
for mean, scale, ts in zip(means, scales, timesteps):
    y_plot = np.linspace(mean-2*scale, mean+2*scale, 500)    
    ax.plot(gauss(y_plot, mean, scale, ts), y_plot, color='b')
    ax.plot(gauss(mean, mean, scale, ts), mean, 'o', color='b')
ax.set_xticks(timesteps)
ax.set_xlabel('timesteps')
ax.set_ylabel('Concentration')
ax.set_ylim([-3,6])
plt.show()

, что приводит к следующему графику:

enter image description here

...