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.
Birkaç grafik üzerinde bir çizgiyi çizme
cevap
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. : ^)
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.
Ö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
@Adam Bernier Örnek kaynak kodunu vermekten asla özür dileriz ... –
Jonathan ile anlaştılar, kaynak koduyla bir cevap ve örnekler olmadan birinden çok daha iyi, hız sayılmaz! –
İ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()
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
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
Başkası ilgilenirse: Bu, saçılma noktalarının oluşmasından kaynaklanır. – Rickson
[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')
Kırmızı noktaları nereye alacaklarını nasıl belirlersiniz? – Sword22
@ Sword22 Tüm grafikler aynı x eksenine sahip. Kırmızı noktalar temel olarak x ekseni değerlerinin bir listesidir. – Artium