2015-02-26 31 views
7

'da tamamen özel bir efsane Matplotlib'i temel olarak çizim yapmak için değil, bir 'resim' çiziyorum.Matplotlib, Python

'Resimde' resmin belirli bölümlerini etiketlemek için plt.annotate kullanıyorum.

Simgelerin anlamlarını göstermek için tamamen özel bir açıklama yapmak istiyorum.

handles yerine '*' veya 'o' gibi normal belirteçlerin alfanümerik harfler olmalıdır özel handles ve labels, tanımlamak için bir yol var mı.

Bu mümkün mü yoksa plt.annotation kullanarak lejandı manuel olarak oluşturmalı mıyım?

+0

Size kendi gösterge tuşlarını tanımlayabilirsiniz. [Bu cevap] 'a bir göz atın (http://stackoverflow.com/a/27841028/2043505). – Schorsch

+0

Teşekkürler, ancak bu cevap, farklı şekillerin lejant tuşları olarak nasıl kullanılacağını açıklıyor. Bu cevabı kullanarak alfasayısal harflerin nasıl uygulanacağından emin değilim. – Jonny

cevap

11

Bunu yapmanın pek çok yolu var, ancak bu durumda bir proxy sanatçı kullanmak muhtemelen en kolay yoldur. Rasgele metni bir işaretçi olarak kullanabilirsiniz, bu yüzden satırlar yerine sahte Line2D 's show etiketlerine sahip olmak oldukça kolaydır.

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

def main(): 
    labels = ['A', 'B', 'C'] 
    positions = [(2, 5), (1, 1), (4, 8)] 
    descriptions = ['Happy Cow', 'Sad Horse', 'Drooling Dog'] 

    # Plot the data, similar to what you described... 
    fig, ax = plt.subplots() 
    ax.imshow(np.random.random((10, 10)), interpolation='none') 
    for label, xy in zip(labels, positions): 
     ax.annotate(label, xy, xytext=(20, 20), size=15, 
        textcoords='offset points', 
        bbox={'facecolor':'white'}, 
        arrowprops={'arrowstyle':'->'}) 

    # Create a legend with only labels 
    proxies = [create_proxy(item) for item in labels] 
    ax.legend(proxies, descriptions, numpoints=1, markerscale=2) 

    plt.show() 

def create_proxy(label): 
    line = matplotlib.lines.Line2D([0], [0], linestyle='none', mfc='black', 
       mec='none', marker=r'$\mathregular{{{}}}$'.format(label)) 
    return line 

main() 

enter image description here

+0

Harika! Cevabınızdaki çaba için teşekkürler. – Jonny

1

Çoğu durumda muhtemelen de renk ile grafik üzerinde elemanları göstermek istiyorum: Bir örnek (bu toplu nispeten "fantezi" dir annotate çağrısı) olarak

özel efsanenizde. Bu durumda, matplotlib'in kendi işlevlerini kullanacağım, aynı zamanda kendi karmaşık fonksiyonunuzu da yazmanıza gerek yok.

import matplotlib 

red_line = matplotlib.lines.Line2D([], [], color='red',markersize=100, label='Blue line') 


blue_line = matplotlib.lines.Line2D([], [], color='blue', markersize=100, label='Green line') 
purple_line = matplotlib.lines.Line2D([], [], color='purple', markersize=100, label='Green line') 

handles = [blue_line,red_line, purple_line] 
labels = [h.get_label() for h in handles] 

ax.legend(handles=handles, labels=labels) 
plt.show()