2015-09-18 16 views
5

Tôi đang cố vẽ một chuỗi thời gian đơn, nhưng muốn biểu diễn nó theo hai đơn vị trên trục trái và phải. Đây là những gì tôi đã làm cho đến nay.Vẽ dữ liệu đơn với hai trục Y (hai đơn vị) trong 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

Bằng cách điều chỉnh ylim(), tôi có thể làm cho nó có vẻ như là một đường duy nhất, nhưng một số răng cưa có thể được nhìn thấy. Tôi thích nếu tôi không phải vẽ dữ liệu hai lần.

Mọi đề xuất?

CẬP NHẬT: Cảm ơn, askewchan, vì giải pháp hoàn hảo!

+0

Bạn có thể đưa toàn bộ tập lệnh của mình không? – Leb

Trả lời

5

Không cần để vẽ nó hai lần, nhiều này sẽ cho bạn kết quả bạn muốn:

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

Một cách mạnh mẽ hơn để làm điều đó là lần đầu tiên giải nén các giới hạn của cốt truyện (trong trường hợp bạn thay đổi họ, và họ không còn 2000070000, hoặc bạn muốn cốt truyện để có thể tự động điều chỉnh các giới hạn:

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

one plot

Tất cả cùng nhau, với một số chỉnh sửa nhỏ ở nơi khác:

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') 
Các vấn đề liên quan