Her veri noktasında farklı metinlere sahip Matplotlib dağılım grafiği


252

Bir dağılım grafiği yapmaya ve bir listeden farklı numaralarla veri noktalarına açıklama eklemeye çalışıyorum. Yani, örneğin, ben arsa istiyorum yvs xnumaraları karşılık gelen ve açıklama yaparak n.

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]
ax = fig.add_subplot(111)
ax1.scatter(z, y, fmt='o')

Herhangi bir fikir?


Ayrıca mpld3 kitaplığını kullanarak fareyle üzerine gelindiğinde araç ipucu etiketleri içeren dağılım grafiği alabilirsiniz. mpld3.github.io/examples/scatter_tooltip.html
Claude COULOMBE

Yanıtlar:


466

Dizileri veya listeleri alan herhangi bir çizim yönteminin farkında değilim ama annotate()değerleri üzerinden yineleme yaparken kullanabilirsiniz n.

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()
ax.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

İçin birçok biçimlendirme seçeneği vardır annotate(), matplotlib web sitesine bakın:

resim açıklamasını buraya girin


1
regplotÇok fazla bozulma olmadan Seaborn'un üstünde iyi çalışır .
ijoseph

@Rutger Ben bir panda datframe kullanın ve bir şekilde bir olsun KeyError- bu yüzden bir dict()nesne bekleniyor sanırım ? Kullanarak verileri etiketlemek için başka bir yolu var mı enumerate, annotateve bir pandalar veri çerçevesi?
Rachel

@Rachel, Kullanabilir for row in df.iterrows():ve sonra row['text'], row['x-coord']vb ile değerlere erişebilirsiniz. Ayrı bir soru gönderirseniz, buna bir göz atacağım .
Rutger Kassies

@RutgerKassies Teşekkürler Rutger! Burada bir soru gönderdim stackoverflow.com/questions/41481153/… Bu soruna benzer olabileceğinden korkuyorum. Ama bir şekilde çözemiyorum. Yardımın için teşekkürler!
Rachel

1
@aviator, maalesef yerleşik değil. Ancak, örneğin networkx'in düzen motorunu kullanarak buna bakın: stackoverflow.com/a/34697108/1755432
Rutger

32

Matplotlib 2.0'dan önceki sürümlerde, ax.scatterişaretleyicisiz metin çizmek gerekli değildir. Sürüm 2.0'da ax.scattermetin için uygun aralığı ve işaretçileri ayarlamanız gerekir .

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Ve bu bağlantıda 3d olarak bir örnek bulabilirsiniz.


Bu harika! Bu çözümü paylaştığınız için teşekkürler. Şeklin boyutunu ayarlamak için uygun kodun ne olduğunu da paylaşır mısınız? Uygulamalar gibi plt.figure(figsize=(20,10))beklendiği gibi bu kodu yürütmesini aslında resmin boyutunu değişmemesini ki, çalışmıyor. Yardımınızı bekliyorum. Teşekkürler!
Levine

incir, balta = plt.subplots (figsize = (20,10))
rafaelvalle

21

Herhangi birinin yukarıdaki çözümleri .subplot () yerine bir .scatter () yöntemine uygulamaya çalışması durumunda,

Aşağıdaki kodu çalıştırmayı denedim

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Ancak "yinelenemeyen PathCollection nesnesini açamıyorum" hatalarıyla karşılaştı ve hata özellikle kod çizgisi incir, ax = plt.scatter (z, y)

Sonunda aşağıdaki kodu kullanarak hatayı çözdüm

plt.scatter(z, y)

for i, txt in enumerate(n):
    plt.annotate(txt, (z[i], y[i]))

Ben .scatter () ve .subplot () arasında bir fark olmasını beklemiyordum.


11

Ayrıca kullanabilirsiniz pyplot.text( buraya bakın ).

def plot_embeddings(M_reduced, word2Ind, words):
""" Plot in a scatterplot the embeddings of the words specified in the list "words".
    Include a label next to each point.
"""
for word in words:
    x, y = M_reduced[word2Ind[word]]
    plt.scatter(x, y, marker='x', color='red')
    plt.text(x+.03, y+.03, word, fontsize=9)
plt.show()

M_reduced_plot_test = np.array([[1, 1], [-1, -1], [1, -1], [-1, 1], [0, 0]])
word2Ind_plot_test = {'test1': 0, 'test2': 1, 'test3': 2, 'test4': 3, 'test5': 4}
words = ['test1', 'test2', 'test3', 'test4', 'test5']
plot_embeddings(M_reduced_plot_test, word2Ind_plot_test, words)

resim açıklamasını buraya girin


7

Python 3.6+:

coordinates = [('a',1,2), ('b',3,4), ('c',5,6)]
for x in coordinates: plt.annotate(x[0], (x[1], x[2]))

2

Liste anlama ve numpy kullanan tek bir astar olarak:

[ax.annotate(x[0], (x[1], x[2])) for x in np.array([n,z,y]).T]

kurulum Rutger'in cevabına ditto.


1

Etikete açıklama eklemek için okları / metin kutularını bile kullanabileceğinizi eklemek isterim. Demek istediğim şu:

import random
import matplotlib.pyplot as plt


y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [58, 651, 393, 203, 123]

fig, ax = plt.subplots()
ax.scatter(z, y)

ax.annotate(n[0], (z[0], y[0]), xytext=(z[0]+0.05, y[0]+0.3), 
    arrowprops=dict(facecolor='red', shrink=0.05))

ax.annotate(n[1], (z[1], y[1]), xytext=(z[1]-0.05, y[1]-0.3), 
    arrowprops = dict(  arrowstyle="->",
                        connectionstyle="angle3,angleA=0,angleB=-90"))

ax.annotate(n[2], (z[2], y[2]), xytext=(z[2]-0.05, y[2]-0.3), 
    arrowprops = dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1))

ax.annotate(n[3], (z[3], y[3]), xytext=(z[3]+0.05, y[3]-0.2), 
    arrowprops = dict(arrowstyle="fancy"))

ax.annotate(n[4], (z[4], y[4]), xytext=(z[4]-0.1, y[4]-0.2),
    bbox=dict(boxstyle="round", alpha=0.1), 
    arrowprops = dict(arrowstyle="simple"))

plt.show()

Aşağıdaki grafik oluşturulur: resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.