2010-05-07 24 views
11

Matplotlib clabels'in konumunu bir kontur çiziminde kontrol etmek istiyorum, ancak clabel'deki manual = True bayrağını kullanmadan. Örneğin, bir x koordinatı belirtmek ve bu çizgiden geçen noktalarda etiketler oluşturmak istiyorum. Gördüğünüz gibi, tek tek etiketlerin yerini get_position() kullanarak alabilirsiniz, ancak ben buna bağlıyım. Herhangi bir yardım büyük takdir edilecektir. Teşekkürler!Matplotlib Contour Clabel Konum

cevap

5

Hayır, bunu yapmak için matplotlib içine yerleştirmenin bir yolu yoktur. Varsayılan konumlarla yaşamak ya da manuel ile tamamen etkileşimli ve fareyi kullanarak gitmelisiniz.

Bunu, algoritmalarını geliştirebilmeleri için akış yönünden bir hata raporu olarak dosyalamak isteyebilirsiniz.

Bu konu üzerinde çalışmak için birden çok seçenek vardır. Birincisi, programatik olarak metni kontur şekline yerleştirmektir. Metnin altındaki satırları bu şekilde güvenli bir şekilde çıkaramayacaksınız. Bir kontur c varsayarsak, c.collections'da kontur çizgilerini bulabilirsiniz. Her kontur çizgisi için get_paths'u çağırıp metninizi bu yola yerleştirin.

Diğer seçenek, manuel yerleştirme kodunu değiştirmek (matplotlib.contour.BlockingContourLabeler'da) veya etiket konumlarını (matplotlib.contour.locate_label'da) bularak kodu değiştirmektir, ancak her iki işlev de oldukça yoğun olacaktır. Eğer locate_label için bir çalışma yerine elde edebilirsiniz Eğer siz

%psource c.clabel 
ile interaktif oturumdan fonksiyon kaynağını görüntülemek kolayca yapabilirsiniz ipython kullanırsanız sadece senin Btw makro

def your_locate_label(self, linecontour, labelwidth): 
    # some magic 
    pass 

ar = np.array([[1,0], [0,1]] 
c = matplotlib.contour(ar) 
c.locate_label = your_locate_label 

c.clabel() 

komplo eski yöntem üzerine

veya doğrudan çağırmak sizin dosya üzerinde $EDITOR o Evet, şimdi

%edit c.clabel 
+0

Ben bu konunun yayınlanmıştır bulamadık, bu yüzden yapılan bir yenisi: https://github.com/matplotlib/matplotlib/issues/613 – keflavich

9

ile tanımlanır edildi etiket konumlarını kontrol etmenin bir yoludur! https://github.com/matplotlib/matplotlib/pull/642

plt.figure() 
CS = plt.contour(X, Y, Z) 
manual_locations = [(-1, -1.4), (-0.62, -0.7), (-2, 0.5), (1.7, 1.2), (2.0, 1.4), (2.4, 1.7)] 
plt.clabel(CS, inline=1, fontsize=10, manual=manual_locations) 
+0

manuel x, y bir iterable nesne olabilir Tuplelerin. Kontur etiketleri, her x, y pozisyonunda fare tıklanmış gibi oluşturulacaktır. – Faber

+2

Otomatik etiketlemeye izin vermenin bir yolu var mı, ve daha sonra, eksenleri kesişen herhangi bir nesneyi kaldırmak (ve belki de iyileştirmek) için etiketler arasında geçiş yapmanın bir yolu var mı? –