Это быстрое решение для достижения чего-то похожего на то, что вы хотите.Он основан на двух приемах:
- Используйте
ax.plot(y,x)
вместо ax.plot(x,y)
, чтобы получить ориентацию гауссианов, аналогичную вашему примеру - Постройте всех ваших гауссианов на одной оси, но каждый раз добавляется увеличенное смещение, чтобы избежать наложения.
Это реализовано в следующем коде:
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()
, что приводит к следующему графику: