2015-09-18 12 views
5

Sto provando a tracciare una singola serie temporale, ma voglio rappresentarla in due unità sugli assi sinistro e destro. Ecco cosa ho fatto finora.Stampa di dati singoli con due assi Y (due unità) in matplotlib

fig, ax1 = plt.subplots() 
t = np.arange(1,50,1) 
s1 = np.sin(t)*20000+40000 #synthetic ts, but closer to my data 
ax1.plot(t, s1, 'b-') 

ax1.set_xlabel('time') 
ax1.set_ylim(20000,70000) 
ax1.set_ylabel('km3/year') 

km3yearToSv=31.6887646*(1/1e6) 

ax2 = ax1.twinx() 
s2 = s1*km3yearToSv 
ax2.plot(t, s2, 'b-') 
ax2.set_ylim(20000*km3yearToSv,70000*km3yearToSv) 
ax2.set_ylabel('Sv') 

enter image description here

Regolando la ylim(), posso farlo sembrare come una singola linea, ma alcuni aliasing può essere visto. Preferirei se non dovessi tracciare i dati due volte.

Qualche suggerimento?

AGGIORNAMENTO: Grazie, askewchan, per la soluzione perfetta!

+0

Puoi includere l'intero script? – Leb

risposta

5

Non v'è alcuna necessità di tracciare due volte, questo molto dovrebbe darvi il risultato desiderato:

ax2 = ax1.twinx() 
ax2.set_ylim(20000*km3yearToSv, 70000*km3yearToSv) 
ax2.set_ylabel('Sv') 

Un modo più robusto per farlo è quello di estrarre prima i limiti della trama (nel caso in cui cambiarli, e sono più 20000 e 70000, o se si vuole la trama sia in grado di regolare automaticamente i limiti:

ax2 = ax1.twinx() 
mn, mx = ax2.get_ylim() 
ax2.set_ylim(mn*km3yearToSv, mx*km3yearToSv) 
ax2.set_ylabel('Sv') 

one plot

Tutti insieme, con alcune piccole modifiche altrove:

import numpy as np 
import matplotlib.pyplot as plt 

mean, amp = 40000, 20000 
t = np.arange(50) 
s1 = np.sin(t)*amp + mean #synthetic ts, but closer to my data 

fig, ax1 = plt.subplots() 
ax1.plot(t, s1, 'b-') 

ax1.set_xlabel('time') 
mn, mx = ax1.set_ylim(mean-amp, mean+amp) 
ax1.set_ylabel('km$^3$/year') 

km3yearToSv = 31.6887646e-6 

ax2 = ax1.twinx() 
ax2.set_ylim(mn*km3yearToSv, mx*km3yearToSv) 
ax2.set_ylabel('Sv') 
Problemi correlati