พล็อตกระจาย Matplotlib พร้อมข้อความที่แตกต่างกันในแต่ละจุดข้อมูล


252

ฉันกำลังพยายามพล็อตกระจายและบันทึกข้อมูลจุดด้วยตัวเลขที่แตกต่างจากรายการ ตัวอย่างเช่นฉันต้องการพล็อตyvs xและใส่คำอธิบายประกอบด้วยตัวเลขที่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')

ความคิดใด ๆ


นอกจากนี้คุณยังสามารถรับพล็อตการกระจายที่มีป้ายกำกับเคล็ดลับเครื่องมือบนโฮเวอร์โดยใช้ไลบรารี mpld3 mpld3.github.io/examples/scatter_tooltip.html
Claude COULOMBE

คำตอบ:


466

ฉันไม่ได้ตระหนักถึงวิธีการวางแผนใด ๆ ซึ่งจะมีอาร์เรย์หรือรายการ แต่คุณสามารถใช้annotate()ในขณะที่ iterating 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]))

มีตัวเลือกการจัดรูปแบบมากมายให้annotate()ดูที่เว็บไซต์ matplotlib:

ป้อนคำอธิบายรูปภาพที่นี่


1
ใช้งานได้ดีบนซีบรูนregplotโดยไม่มีการหยุดชะงักมากเกินไป
ijoseph

@Rutger ฉันใช้ดาต้าเฟรมและฉันจะได้รับอย่างใดKeyError- ดังนั้นฉันคาดว่าdict()วัตถุที่คาดหวัง? มีวิธีอื่น ๆ ที่จะติดป้ายข้อมูลโดยใช้enumerate, annotateและกรอบข้อมูลนุ่น?
Rachel

@ ราเชลคุณสามารถใช้for row in df.iterrows():แล้วเข้าถึงค่าด้วยrow['text'], row['x-coord']ฯลฯ หากคุณโพสต์คำถามแยกต่างหากฉันจะดูมัน
Rutger Kassies

@ RutgerKassies ขอบคุณ Rutger! ฉันโพสต์คำถามที่นี่stackoverflow.com/questions/41481153/… ฉันกลัวว่ามันอาจจะคล้ายกับคำถามนี้มาก แต่ฉันไม่สามารถทำงานออกมาได้ ขอขอบคุณสำหรับความช่วยเหลือของคุณ!
Rachel

1
@aviator ไม่ได้มีมาให้ในตัว แต่ดูตัวอย่างนี้โดยใช้โครงร่างของ networkx: stackoverflow.com/a/34697108/1755432
Rutger Kassies

32

ในเวอร์ชันก่อนหน้า matplotlib 2.0 ax.scatterไม่จำเป็นต้องพล็อตข้อความโดยไม่มีเครื่องหมาย ในเวอร์ชั่น 2.0 คุณจะต้องax.scatterตั้งค่าช่วงและเครื่องหมายที่เหมาะสมสำหรับข้อความ

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]))

และในลิงค์นี้คุณสามารถค้นหาตัวอย่างในแบบ 3 มิติ


นี่มันเจ๋งมาก! ขอบคุณที่แบ่งปันโซลูชันนี้ คุณสามารถแบ่งปันสิ่งที่รหัสที่เหมาะสมคือการกำหนดขนาดของรูป? การใช้งานเช่นplt.figure(figsize=(20,10))ไม่ทำงานอย่างที่คาดไว้เนื่องจากการเรียกใช้รหัสนี้จะไม่เปลี่ยนขนาดของภาพ รอคอยที่จะให้ความช่วยเหลือของคุณ ขอบคุณ!
Levine

fig, ax = plt.subplots (figsize = (20,10))
rafaelvalle

21

ในกรณีที่ทุกคนพยายามใช้วิธีแก้ไขปัญหาข้างต้นกับ. scatter () แทนที่จะเป็น. subplot ()

ฉันพยายามเรียกใช้รหัสต่อไปนี้

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]))

แต่พบข้อผิดพลาดที่ระบุว่า "ไม่สามารถแกะวัตถุ PathCollection ที่ไม่สามารถทำซ้ำได้" โดยมีข้อผิดพลาดเฉพาะที่ชี้ไปที่รูปที่ codeline, ax = plt.scatter (z, y)

ในที่สุดฉันก็แก้ไขข้อผิดพลาดโดยใช้รหัสต่อไปนี้

plt.scatter(z, y)

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

ฉันไม่ได้คาดหวังว่าจะมีความแตกต่างระหว่าง. scatter () และ. subplot () ฉันควรจะรู้จักดีกว่า


11

คุณสามารถใช้pyplot.text(ดูที่นี่ )

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)

ป้อนคำอธิบายรูปภาพที่นี่



2

เป็นสายการบินเดียวที่ใช้ list comprehension และ numpy:

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

การตั้งค่าเป็นเหมือนคำตอบของ Rutger


1

ฉันชอบที่จะเพิ่มว่าคุณสามารถใช้ลูกศร / กล่องข้อความเพื่อทำหมายเหตุประกอบป้ายกำกับ นี่คือสิ่งที่ฉันหมายถึง:

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()

ซึ่งจะสร้างกราฟต่อไปนี้: ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.