2013-03-27 39 views
8

Tôi có tập dữ liệu với các chỉ số cảm biến "liên tục" hiệu quả, với khoảng cách không thường xuyên.Đặt khoảng cách/ngắt trong một ô dòng

Tuy nhiên, có một số giai đoạn không ghi lại dữ liệu. Những khoảng trống này dài hơn đáng kể so với khoảng thời gian mẫu. Theo mặc định, pyplot kết nối từng điểm dữ liệu với điểm dữ liệu tiếp theo (nếu tôi có bộ kiểu đường), tuy nhiên tôi cảm thấy điều này hơi gây nhầm lẫn khi kết nối hai điểm dữ liệu ở hai bên của khoảng cách dài.

Tôi muốn đơn giản là không có dòng ở đó; có nghĩa là, tôi muốn dòng dừng lại và bắt đầu lại sau khoảng trống.

Tôi đã thử thêm vào một phần tử trong các phần khoảng cách này với giá trị y None, nhưng dường như gửi đường trở lại phần trước của cốt truyện (mặc dù những dòng này không xuất hiện ở tất cả các mức thu phóng) .

Tùy chọn khác mà tôi đã nghĩ chỉ đơn giản là vẽ từng mảnh bằng một cuộc gọi riêng đến plot, nhưng điều này sẽ hơi xấu xí và rườm rà.

Có cách nào thanh lịch hơn để đạt được điều này không?

Chỉnh sửa: Dưới đây là ví dụ hoạt động tối thiểu thể hiện hành vi. Cốt truyện đầu tiên là dòng nối mà tôi đang cố gắng tránh. Cốt truyện thứ hai cho thấy thêm một giá trị None xuất hiện để hoạt động, tuy nhiên nếu bạn xoay chế độ xem của ô, bạn sẽ có được những gì được hiển thị trong hình thứ ba, một dòng nhảy đến phần trước của cốt truyện.

import numpy as np 
import matplotlib.pyplot as plt 

t1 = np.arange(0, 8, 0.05) 
t2 = np.arange(10, 14, 0.05) 
t = np.concatenate([t1, t2]) 
c = np.cos(t) 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.set_title('Undesirable joining line') 


t1 = np.arange(0, 8, 0.05) 
t2 = np.arange(10, 14, 0.05) 
c1 = np.cos(t1) 
c2 = np.cos(t2) 
t = np.concatenate([t1, t1[-1:], t2]) 
c = np.concatenate([c1, [None,], c2]) 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.set_title('Ok if you don\'t pan the plot') 

fig = plt.figure() 
ax = fig.gca() 
ax.plot(t, c) 
ax.axis([-1, 12, -0.5, 1.25]) 
ax.set_title('Strange jumping line') 

plt.show() 

Plot 3, the "strange jumping line"

+1

Có thể tạo một ví dụ có thể tái sản xuất, đặc biệt là hiển thị mã matplotlib bạn đang sử dụng để vẽ không? –

+0

Ý tưởng hay. Đã thêm ví dụ. – Alex

+0

Nếu bạn gọi lô đất() hai lần thì sao? I E. ax.plot (t1, c1) và ax.plot (t2, c2). Bạn phải đặt màu theo cách thủ công: ax.plot (t1, c1, c = "b") – Robbert

Trả lời

10

mảng Masked làm việc tốt cho việc này. Bạn chỉ cần mặt nạ là người đầu tiên trong những điểm bạn không muốn kết nối:

import numpy as np 
import numpy.ma as ma 
import matplotlib.pyplot as plt 

t1 = np.arange(0, 8, 0.05) 
mask_start = len(t1) 
t2 = np.arange(10, 14, 0.05) 
t = np.concatenate([t1, t2]) 
c = np.cos(t)  # an aside, but it's better to use numpy ufuncs than list comps 

mc = ma.array(c) 
mc[mask_start] = ma.masked 
plt.figure() 
plt.plot(t, mc) 
plt.title('Using masked arrays') 

plt.show() 

enter image description here

Ít nhất trên hệ thống của tôi (OSX, Python 2.7, mpl 1.1.0), I don' t có bất kỳ vấn đề với panning, vv

+0

Cảm ơn bạn đã đề xuất. Trên máy tính của tôi (Python 2.7.3, matplotlib 1.1.1) Tôi vẫn nhận được dòng không mong muốn nếu tôi xoay âm mưu. – Alex

+0

Hoạt động tốt, cũng liên quan đến 'pandas.DataFrame' – MichaelA

Các vấn đề liên quan