2015-09-18 5 views
5

Ich versuche, eine einzelne Zeitreihe zu plotten, aber möchte es in zwei Einheiten auf der linken und rechten Achse darstellen. Hier ist, was ich bisher gemacht habe.Einzelne Daten mit zwei Y-Achsen (zwei Einheiten) in Matplotlib plotten

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

Durch die ylim Einstellung(), kann ich es als eine einzige Zeile zu erscheinen, aber einige Aliasing zu sehen ist. Ich würde es vorziehen, wenn ich die Daten nicht zweimal auftragen müsste.

Irgendwelche Vorschläge?

UPDATE: Danke, askewchan, für die perfekte Lösung!

+0

Kannst du dein ganzes Skript einbeziehen? – Leb

Antwort

5

Es gibt keine Notwendigkeit, es ist zweimal zu planen, sollte dies viel geben Sie das gewünschte Ergebnis:

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

eine robustere Art und Weise, es zu tun ist, zunächst die Grenzen des Grundstücks zu extrahieren (falls Sie ändern sie, und sie sind nicht mehr 20000 und 70000, oder Sie wollen, dass die Handlung der Lage sein, um automatisch die Grenzen einstellen:

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

one plot

Alles zusammen, mit einigen kleinen Verbesserungen woanders:

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') 
Verwandte Themen