2013-03-27 18 views
8

Zaman zaman boşluk ile etkili "sürekli" sensör okumaları olan bir veri setim var. Bununla birlikte, hiçbir verinin kaydedilmediği birkaç dönem vardır. Bu boşluklar, numune periyodundan anlamlı ölçüde daha uzundur.Satır aralığına boşluk/boşluk koyun

Varsayılan olarak, pyplot her veri noktasını bir sonraki noktaya bağlar (bir çizgi stil kümem varsa), ancak bu iki veri noktasını uzun bir aralığın her iki tarafına bağladığında biraz yanıltıcı olduğunu hissediyorum.

Orada hiç satır olmamayı tercih ederim; Yani, hattın durup tekrar aradan sonra tekrar başlamasını istiyorum.

Bu boşluk bölümlerinde None y değeriyle bir öğe eklemeyi denedim, ancak çizgiyi arsanın önceki bir bölümüne geri göndermiş gibi görünüyor (garip bir şekilde bu satırlar tüm yakınlaştırma düzeylerinde görünmüyor) .

Düşündüğüm diğer seçenek, her parçayı plot'a ayrı bir çağrı ile çizmek, ancak bu biraz çirkin ve hantal olur.

Bunu gerçekleştirmenin daha zarif bir yolu var mı?

Düzenleme: Aşağıda, davranışı gösteren en az çalışan bir örnek verilmiştir. İlk arsa, kaçınmaya çalıştığım birleşme çizgisidir. İkinci arsa, bir None değerinin eklenmesinin işe yaradığını gösterir, ancak çizimin görüntüsünü kaydırırsanız, üçüncü şekilde gösterileni elde edersiniz, çizginin artalanının önceki bir bölümüne atlama.

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

Tekrarlanabilir bir örnek oluşturmak mümkün mü, özellikle şu anda kullanmakta olduğunuz matplotlib kodunu göstermek mümkün mü? –

+0

İyi fikir. Örnek eklendi. – Alex

+0

Ya iki kere arsa() çağırırsanız? Yani. ax.plot (t1, c1) ve ax.plot (t2, c2). Rengi manuel olarak ayarlamanız gerekir: ax.plot (t1, c1, c = "b") – Robbert

cevap

10

Maskeli diziler bu iyi sonuçlar verir. '

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

En azından benim sistemde (OSX, Python 2.7, mpl 1.1.0), ben don: Sırf bağlamak istemiyorum noktaların ilk maskelemek için gereken t, vb. ile ilgili herhangi bir sorun var.

+0

Öneriniz için teşekkürler. Makinemde (Python 2.7.3, matplotlib 1.1.1) Parçayı tarıyorsam, hala istenmeyen çizgiyi alıyorum. – Alex

+0

“pandas.DataFrame' ile bağlantılı olarak harika çalışır – MichaelA

İlgili konular