Sembra che quello che vuoi siano sottotrame ... Quello che stai facendo ora non ha molto senso (o sono molto confuso dal tuo frammento di codice, comunque ...).
Provare qualcosa di più simile a questo:
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(nrows=3)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
data = np.random.random(1) * np.random.random(10)
ax.plot(data, marker='o', linestyle='none', color=color)
plt.show()
Edit:
Se non si desidera sottotrame, il vostro frammento di codice rende molto più senso.
Stai provando ad aggiungere tre assi uno sopra l'altro. Matplotlib riconosce che esiste già una sottotrama in quella esattamente dimensione e posizione sulla figura, quindi restituisce lo stesso oggetto assi ogni volta. In altre parole, se guardi il tuo elenco ax
, vedrai che sono tutti lo stesso oggetto.
Se si usa il in realtà, è necessario reimpostare fig._seen
in un dettato vuoto ogni volta che si aggiunge un asse. Probabilmente non vuoi davvero farlo, comunque.
Invece di mettere tre trame indipendenti l'una sull'altra, date un'occhiata all'utilizzo di twinx
invece.
E.g.
import matplotlib.pyplot as plt
import numpy as np
# To make things reproducible...
np.random.seed(1977)
fig, ax = plt.subplots()
# Twin the x-axis twice to make independent y-axes.
axes = [ax, ax.twinx(), ax.twinx()]
# Make some space on the right side for the extra y-axis.
fig.subplots_adjust(right=0.75)
# Move the last y-axis spine over to the right by 20% of the width of the axes
axes[-1].spines['right'].set_position(('axes', 1.2))
# To make the border of the right-most axis visible, we need to turn the frame
# on. This hides the other plots, however, so we need to turn its fill off.
axes[-1].set_frame_on(True)
axes[-1].patch.set_visible(False)
# And finally we get to plot things...
colors = ('Green', 'Red', 'Blue')
for ax, color in zip(axes, colors):
data = np.random.random(1) * np.random.random(10)
ax.plot(data, marker='o', linestyle='none', color=color)
ax.set_ylabel('%s Thing' % color, color=color)
ax.tick_params(axis='y', colors=color)
axes[0].set_xlabel('X-axis')
plt.show()
Grazie - in realtà io voglio un unico pannello con tutti i punti, ma ognuno con una scala y diversa ... – hatmatrix
Speriamo che le modifiche siano d'aiuto. Suppongo che tu voglia che gli assi y siano etichettati con gli intervalli reali.Se non lo fai (e in pratica vuoi solo che i valori y non abbiano significato), puoi farlo molto più semplicemente. –
Ah, 'spine 'è l'attributo che volevo penso. Ma la regolazione manuale della colonna vertebrale sembra la strada da percorrere, anche con un asse "fluttuante" che non è necessariamente connesso con i dati, a patto che mi assicuri che le bilance vengano manipolate correttamente! Grazie. – hatmatrix