Wiele wykresów na jednym (horyzontalnie i wertykalnie)

0

Hej moze zaczne od tego jak wykres ma wygladac:

screenshot-20220926190013.png
A teraz do rzeczy. Na osi x maja byc wartosci od 0 do 10 jak na wykresie. Na osi y maja byc wartosci od 0 do 60 jak na wykresie. Dla kazdego naturalnego i z przedzialu 0-10, mam zestaw 10000 liczb. Czarna linia to srednia sposrod tych liczb dla kazdego i. I teraz najtrudniejsze - chce dla wybranych i narysowac histogram jak na wykresie (w tym przypadku i=2 oraz i=6). Co wazne chce uzyc argumentu density=True w funkcji hist. To co chyba bedzie najtrudniejsze to dopasowanie wysokosci (czy tam szerokosci) tych histogramow, kora chcialbym wyrazic w wartosciach osi x (na moim rysunku wysokosc historamu to 3 bo czerwony zaczyna sie w 2 a najwyzszy punkt ma w 5 a niebieski zaczyna sie w 6 a najwyzszy punkt w 9). Jest kto w stanie pomoc? Ponizej kawalek kodu:

import numpy as np
import matplotlib.pyplot as plt

x = range(11)
res = np.random.randint(0, 60, size = (11, 10000))

means = [res[i, :].mean() for i in x]

fig, ax = plt.subplots(figsize = (12, 6), dpi = 300)

ax.plot(x, means)
ax.hist(res[2,:], bins = 100, density = True, orientation = 'horizontal', bottom = 2)

a tak wyglada wynik, wiec problem jest z dopasowaniem wysokosci

screenshot-20220926191541.png

2

trzeba by użyć np.histogram i tam dać density=True, a potem wynik przeskalować i na końcu wywołać plt.hist. Coś w tym stylu pasuje?:

#!/usr/bin/env python

import numpy as np
import matplotlib.pyplot as plt

N = 10000

x = np.linspace(0, 10, N)
y = np.cumsum(np.random.randn(N))
# make y.min==0 and y.max==60
y = y - y.min()
y = y / y.max() * 60

plt.grid(True)

counts, bins = np.histogram(y, bins=30, density=True)
hist_scale = 3
counts = hist_scale * counts / counts.max()
plt.hist(bins[:-1], bins, weights=counts, rwidth=0.9, orientation="horizontal", bottom=2, alpha=0.7)
plt.hist(bins[:-1], bins, weights=counts, rwidth=0.9, orientation="horizontal", bottom=6, alpha=0.7)

plt.axhline(y.mean(), linestyle=":", color="black")  # mean line
plt.plot(x, y, linewidth=0.7, color="green")
plt.ylim(-5, 65)

plt.show()

screenshot-20220926224912.png

0

@jvoytech: Dzieki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1