2011-05-26 34 views
15

Bu şeyin nasıl çağrıldığını veya nasıl tanımlanacağını bilmiyorum, bu yüzden başlık biraz yanıltıcı olabilir.

İlk ekli grafik pyplot ile oluşturuldu. Şu anda kullandığım üç kırmızı nokta yerine tüm grafikleri geçen düz bir çizgi çizmek istiyorum. Plotte mümkün mü? İkinci görüntü benim aradığım şey. Currently What I am looking forBirkaç grafik üzerinde bir çizgiyi çizme

+0

Kırmızı noktaları nereye alacaklarını nasıl belirlersiniz? – Sword22

+0

@ Sword22 Tüm grafikler aynı x eksenine sahip. Kırmızı noktalar temel olarak x ekseni değerlerinin bir listesidir. – Artium

cevap

24

Alakalı hatlar için kapalı kırpma çevirerek bu çekin.

from matplotlib import pyplot as plt 
from numpy import arange, sin, cos 

xx = arange(100) 
cut = (xx > 0) & (xx % 17 == 0) 
y1 = sin(xx) 
y2 = (xx**2) % 2.0+cos(xx+0.5) 

fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax1.plot(xx, y1, c="blue",zorder=1) 
ax1.scatter(xx[cut], y1[cut], c="red",zorder=2) 
ax2 = fig.add_subplot(212) 
ax2.plot(xx, y2, c="green",zorder=1) 
ax2.scatter(xx[cut], y2[cut], c="red",zorder=2) 

for x in xx[cut]: 
    ax1.axvline(x=x,ymin=-1.2,ymax=1,c="red",linewidth=2,zorder=0, clip_on=False) 
    ax2.axvline(x=x,ymin=0,ymax=1.2,c="red",linewidth=2, zorder=0,clip_on=False) 

plt.draw() 
fig.savefig('pic.png') 

biraz daha çalışması ile çizim hattını değiştirebilir: - doğrudan ana çerçeve üzerinde çizgiler çizmek mümkün olabilir - ama benim için çalıştı aşağıdaki Bunu yapmak için temizleyici bir yolu muhtemelen vardır Birden çok altpip penceresinin genel durumunu ele alalım, ama çok tembelim. : ^)

example of cross-subplot vertical lines

1

ben axvline(x, y1, y2) (link) denemek istiyorum ama pyplot seçeneklerden herhangi birkaç subplots/grafikler üzerinden yayılan bir şey çizmek sanmıyorum.

Eğer durum böyleyse, aynı amacı grafiğin her bir noktasında çizerek, aynı niyetin izleyiciye iletilmesini umuyordum.

+0

Özür dilerim. Cevabım, sahip olmadığınız yeni bilgileri sunmuyor. Zaten bir örnek koymuştum, bu yüzden zaten yayınlayacağımı düşündüm. Çok daha hızlı olmanız için +1. – bernie

+1

@Adam Bernier Örnek kaynak kodunu vermekten asla özür dileriz ... –

+0

Jonathan ile anlaştılar, kaynak koduyla bir cevap ve örnekler olmadan birinden çok daha iyi, hız sayılmaz! –

10

İlgili belgeler:
http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.axvline

Düzenleme: beri @DSM's answer yüzden utanç verici cevabım az yoksul hale getirmek için bir girişim Bu cevap dahil etmişlerdir benim daha çok daha iyiydi. Bir sütundaki (örneğin, bir kılavuzda birden çok alt düzlemin daha genel durumu) bir alt kümedeki bir çok alt alt genel durumunu ele almaya çalıştım.

Cevabınız için @DSM ve soru için @Artium'a teşekkürler.

import matplotlib.pyplot as plt 
import numpy as np 

def main(): 
    fig = plt.figure() 

    x = np.arange(20) 
    y1 = np.cos(x) 
    y2 = (x**2) 
    y3 = (x**3) 
    yn = (y1,y2,y3) 
    cut = (x > 0) & (x % 2 == 0) 
    COLORS = ('b','g','k') 

    for i,y in enumerate(yn): 
     ax = fig.add_subplot(len(yn),1,i+1) 

     ax.plot(x, y,ls='solid', color=COLORS[i], zorder=1) 
     ax.scatter(x[cut], y[cut], c='r', zorder=2) 

     if i != len(yn) - 1: 
      ax.set_xticklabels(()) 

     for j in x[cut]: 
      if i != len(yn) - 1: 
       ax.axvline(x=j, ymin=-1.2, ymax=1, 
          c='r', lw=2, zorder=0, clip_on=False) 
      else: 
       ax.axvline(x=j, ymin=0, ymax=1, 
          c='r', lw=2, zorder=0, clip_on=False) 

    fig.suptitle('Matplotlib Vertical Line Example') 
    plt.show() 

if __name__ == '__main__': 
    main() 

enter image description here

+0

Cevabınızı gerçekten çok beğendim. Ancak, benim durumumda kodunuzu çalıştırırsam yatay ve dikey kenar boşlukları bulunur. Onları nasıl kaldıracağınız hakkında bir fikrin var mı? – Rickson

+0

Daha kesin olmak için. Benim durumumda, xaxis aralığı [0,20] ve f yerine [-5,20]. e.Son arsa için, yaxis aralığı [0,7000] yerine [-1000,8000]. Başarı olmadan neredeyse her şeyi (autoscale, sıkı eksen, relim vb.) Denedim. – Rickson

+0

Başkası ilgilenirse: Bu, saçılma noktalarının oluşmasından kaynaklanır. – Rickson

5

[Güncelleme 03/2013] matplotlib yeni revizyonlar ise, büyük ölçüde bu görevi basitleştiren ConnectionPatch var. Kapsanması gereken ikiden fazla alt bölüm olduğunda özellikle yararlıdır.

from matplotlib import pyplot as plt 
from matplotlib.patches import ConnectionPatch 
from numpy import arange, sin, cos 

xx = arange(100) 
cut = (xx > 0) & (xx % 17 == 0) 
y1 = sin(xx) 
y2 = (xx**2) % 2.0+cos(xx+0.5) 

fig = plt.figure() 
ax1 = fig.add_subplot(211) 
ax1.plot(xx, y1, c="blue") 
ax1.scatter(xx[cut], y1[cut], c="red") 
ax2 = fig.add_subplot(212) 
ax2.plot(xx, y2, c="green") 
ax2.scatter(xx[cut], y2[cut], c="red") 

for x in xx[cut]: 
    con = ConnectionPatch(xyA=(x, -1.5), xyB=(x, 1.5), 
     coordsA="data", coordsB="data", axesA=ax2, axesB=ax1, 
     arrowstyle="-", linewidth=2, color="red") 
    ax2.add_artist(con) 

plt.draw() 
fig.savefig('pic.png') 
İlgili konular