प्रत्येक डेटा बिंदु पर विभिन्न पाठ के साथ Matplotlib स्कैटर प्लॉट


252

मैं एक सूची से अलग-अलग संख्याओं के साथ स्कैटर प्लॉट और एनोटेट डेटा बिंदु बनाने की कोशिश कर रहा हूं। इसलिए, उदाहरण के लिए, मैं yबनाम 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
क्लाड कॉम्बे

जवाबों:


466

मुझे किसी भी प्लॉटिंग विधि के बारे में पता नहीं है जो एरेज़ या लिस्ट लेती है, लेकिन आप annotate()इन वैल्यूज़ से अधिक का उपयोग करते हुए कर सकते हैं 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बहुत अधिक व्यवधान के बिना , सीबॉर्न के शीर्ष पर अच्छी तरह से काम करता है।
१:१६ बजे

@ रगर मैं पंडों के डेटफ्रेम का उपयोग करता हूं और मुझे किसी तरह एक मिल जाता है KeyError- तो मुझे लगता है कि एक dict()वस्तु की उम्मीद है? क्या कोई अन्य तरीका है जो डेटा का उपयोग कर लेबल करता है enumerate, annotateऔर एक पांडा डेटा फ़्रेम?
राहेल

@ राचल, आप उपयोग कर सकते हैं for row in df.iterrows():, और उसके बाद मानों को एक्सेस कर सकते हैं row['text'], row['x-coord']आदि यदि आप एक अलग प्रश्न पोस्ट करते हैं तो मुझे इस पर एक नज़र डालनी होगी।
रटगर्स कसीस

@RutgerKassies धन्यवाद, रटगर! मैंने यहां एक प्रश्न पोस्ट किया है stackoverflow.com/questions/41481153/… मुझे डर है कि यह इसी प्रश्न के समान हो सकता है। लेकिन मैं इसे किसी भी तरह से काम नहीं कर सकता। आपके सहयोग के लिए धन्यवाद!
राचेल

1
@ नाविक, दुर्भाग्य से निर्मित नहीं है। लेकिन उदाहरण के लिए इसे नेटवर्कएक्स के लेआउट इंजन का उपयोग करके देखें: 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))अपेक्षित नहीं है, इस कोड को लागू करने से वास्तव में छवि का आकार नहीं बदलता है। आपकी सहायता के लिए तत्पर हैं। धन्यवाद!
लेविन

अंजीर, कुल्हाड़ी = plt.subplots (figsize = (20,10))
rafaelvalle

21

यदि कोई भी उपरोक्त समाधान को .subplot () के बजाय .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.scatter(z, y)

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

लेकिन त्रुटियों में भाग लेते हुए कहा कि "गैर-पुनरावृत्त PathCollection ऑब्जेक्ट को अनपैक नहीं कर सकते हैं", त्रुटि के साथ विशेष रूप से कोडलाइन अंजीर, कुल्हाड़ी = 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)

यहां छवि विवरण दर्ज करें


7

अजगर 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

सूची समझ और सुन्न का उपयोग कर एक लाइनर के रूप में:

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

Rutger के जवाब के लिए सेटअप ditto है।


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

जो निम्नलिखित ग्राफ उत्पन्न करेगा: यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.