पंडों / पप्पलॉट में स्कैटर प्लॉट्स: श्रेणी के आधार पर प्लॉट कैसे करें


89

मैं पंडों डेटाफ्रेम ऑब्जेक्ट का उपयोग करते हुए पाइलट में एक सरल स्कैटर प्लॉट बनाने की कोशिश कर रहा हूं, लेकिन दो चर को प्लॉट करने का एक कुशल तरीका चाहता हूं लेकिन प्रतीकों को एक तीसरे कॉलम (कुंजी) द्वारा निर्धारित किया गया है। मैंने df.groupby का उपयोग करके विभिन्न तरीकों की कोशिश की है, लेकिन सफलतापूर्वक नहीं। एक नमूना डीएफ स्क्रिप्ट नीचे है। यह 'key1' के अनुसार मार्करों को रंग देता है, लेकिन Id को 'key1' श्रेणियों के साथ एक किंवदंती देखना पसंद है। क्या मैं करीब हूं? धन्यवाद।

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), index = pd.date_range('2010-01-01', freq = 'M', periods = 10), columns = ('one', 'two', 'three'))
df['key1'] = (4,4,4,6,6,6,8,8,8,8)
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(111)
ax1.scatter(df['one'], df['two'], marker = 'o', c = df['key1'], alpha = 0.8)
plt.show()

जवाबों:


118

आप इसके लिए उपयोग कर सकते हैं scatter, लेकिन इसके लिए आपके लिए संख्यात्मक मान होने की आवश्यकता है key1, और आपके पास एक किंवदंती नहीं होगी, जैसा कि आपने देखा।

plotइस तरह के असतत श्रेणियों के लिए उपयोग करना बेहतर है । उदाहरण के लिए:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(1974)

# Generate Data
num = 20
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

groups = df.groupby('label')

# Plot
fig, ax = plt.subplots()
ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
for name, group in groups:
    ax.plot(group.x, group.y, marker='o', linestyle='', ms=12, label=name)
ax.legend()

plt.show()

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

यदि आप चीजों को डिफ़ॉल्ट pandasशैली की तरह देखना चाहते हैं, तो बस rcParamsपंडों की स्टाइलशीट के साथ अपडेट करें और उसके रंग जनरेटर का उपयोग करें। (मैं भी किंवदंती को थोड़ा मोड़ रहा हूं):

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(1974)

# Generate Data
num = 20
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

groups = df.groupby('label')

# Plot
plt.rcParams.update(pd.tools.plotting.mpl_stylesheet)
colors = pd.tools.plotting._get_standard_colors(len(groups), color_type='random')

fig, ax = plt.subplots()
ax.set_color_cycle(colors)
ax.margins(0.05)
for name, group in groups:
    ax.plot(group.x, group.y, marker='o', linestyle='', ms=12, label=name)
ax.legend(numpoints=1, loc='upper left')

plt.show()

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


उपरोक्त RGB उदाहरण में किंवदंती में दो बार प्रतीक क्यों दिखाया गया है? केवल एक बार कैसे दिखाएं?
स्टीव शुलनिस्ट

1
@SteveSchulist - ax.legend(numpoints=1)केवल एक मार्कर दिखाने के लिए उपयोग करें । वहाँ दो हैं, एक के साथ के रूप में Line2D, अक्सर दो मार्करों को जोड़ने वाली एक पंक्ति होती है।
जो किंगटन

इस कोड को केवल जोड़ने के बाद मेरे लिए काम किया plt.hold(True)के बाद ax.plot()आदेश। कोई विचार क्यों?
युवल एट्ज़मन

set_color_cycle() Matplotlib 1.5 में पदावनत किया गया था। नहीं है set_prop_cycle()अब,।
एले

52

इस के साथ क्या करना सरल है Seaborn ( pip install seabornएक oneliner के रूप में)

sns.scatterplot(x_vars="one", y_vars="two", data=df, hue="key1") :

import seaborn as sns
import pandas as pd
import numpy as np
np.random.seed(1974)

df = pd.DataFrame(
    np.random.normal(10, 1, 30).reshape(10, 3),
    index=pd.date_range('2010-01-01', freq='M', periods=10),
    columns=('one', 'two', 'three'))
df['key1'] = (4, 4, 4, 6, 6, 6, 8, 8, 8, 8)

sns.scatterplot(x="one", y="two", data=df, hue="key1")

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

यहाँ संदर्भ के लिए डेटाफ़्रेम है:

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

चूँकि आपके डेटा में तीन परिवर्तनशील कॉलम हैं, इसलिए आप सभी जोड़ीदार आयामों के साथ प्लॉट करना चाह सकते हैं:

sns.pairplot(vars=["one","two","three"], data=df, hue="key1")

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

https://rasbt.github.io/mlxtend/user_guide/plotting/category_scatter/ एक और विकल्प है।


19

के साथ plt.scatter, मैं केवल एक के बारे में सोच सकता हूं: एक प्रॉक्सी कलाकार का उपयोग करने के लिए:

df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), index = pd.date_range('2010-01-01', freq = 'M', periods = 10), columns = ('one', 'two', 'three'))
df['key1'] = (4,4,4,6,6,6,8,8,8,8)
fig1 = plt.figure(1)
ax1 = fig1.add_subplot(111)
x=ax1.scatter(df['one'], df['two'], marker = 'o', c = df['key1'], alpha = 0.8)

ccm=x.get_cmap()
circles=[Line2D(range(1), range(1), color='w', marker='o', markersize=10, markerfacecolor=item) for item in ccm((array([4,6,8])-4.0)/4)]
leg = plt.legend(circles, ['4','6','8'], loc = "center left", bbox_to_anchor = (1, 0.5), numpoints = 1)

और परिणाम है:

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


10

आप df.plot.scatter का उपयोग कर सकते हैं, और प्रत्येक बिंदु के रंग को परिभाषित करने वाले c = तर्क के लिए एक सरणी पास कर सकते हैं:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), index = pd.date_range('2010-01-01', freq = 'M', periods = 10), columns = ('one', 'two', 'three'))
df['key1'] = (4,4,4,6,6,6,8,8,8,8)
colors = np.where(df["key1"]==4,'r','-')
colors[df["key1"]==6] = 'g'
colors[df["key1"]==8] = 'b'
print(colors)
df.plot.scatter(x="one",y="two",c=colors)
plt.show()

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


4

आप अल्टेयर या गगपोट को भी आज़मा सकते हैं जो घोषणात्मक विज़ुअलाइज़ेशन पर केंद्रित हैं।

import numpy as np
import pandas as pd
np.random.seed(1974)

# Generate Data
num = 20
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

अल्टेयर कोड

from altair import Chart
c = Chart(df)
c.mark_circle().encode(x='x', y='y', color='label')

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

ggplot कोड

from ggplot import *
ggplot(aes(x='x', y='y', color='label'), data=df) +\
geom_point(size=50) +\
theme_bw()

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


3

Matplotlib 3.1 के बाद से आप उपयोग कर सकते हैं .legend_elements()। एक उदाहरण स्वचालित कथा निर्माण में दिखाया गया है । फायदा यह है कि सिंगल स्कैटर कॉल का इस्तेमाल किया जा सकता है।

इस मामले में:

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

df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), 
                  index = pd.date_range('2010-01-01', freq = 'M', periods = 10), 
                  columns = ('one', 'two', 'three'))
df['key1'] = (4,4,4,6,6,6,8,8,8,8)


fig, ax = plt.subplots()
sc = ax.scatter(df['one'], df['two'], marker = 'o', c = df['key1'], alpha = 0.8)
ax.legend(*sc.legend_elements())
plt.show()

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

यदि कुंजियों को सीधे संख्याओं के रूप में नहीं दिया गया था, तो यह इस प्रकार दिखेगा

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

df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), 
                  index = pd.date_range('2010-01-01', freq = 'M', periods = 10), 
                  columns = ('one', 'two', 'three'))
df['key1'] = list("AAABBBCCCC")

labels, index = np.unique(df["key1"], return_inverse=True)

fig, ax = plt.subplots()
sc = ax.scatter(df['one'], df['two'], marker = 'o', c = index, alpha = 0.8)
ax.legend(sc.legend_elements()[0], labels)
plt.show()

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


मुझे यह कहते हुए एक त्रुटि हुई कि 'PathCollection' ऑब्जेक्ट में कोई विशेषता 'किंवदंतियों' नहीं है। मेरा कोड इस प्रकार है। fig, ax = plt.subplots(1, 1, figsize = (4,4)) scat = ax.scatter(rand_jitter(important_dataframe["workout_type_int"], jitter = 0.04), important_dataframe["distance"], c = color_list, marker = 'o', alpha = 0.9) print(scat.legends_elements()) #ax.legend(*scat.legend_elements())
नंदीश पटेल

1
@NandishPatel इस उत्तर के पहले वाक्य को देखें। यह भी सुनिश्चित करें कि भ्रमित न करें legends_elementsऔर legend_elements
ImportanceOfBeingErnest

हाँ धन्यवाद। यह एक टाइपो (किंवदंतियों / किंवदंती) था। मैं पिछले 6 घंटों से कुछ पर काम कर रहा था, इसलिए Matplotlib संस्करण मेरे साथ नहीं हुआ। मुझे लगा कि मैं नवीनतम का उपयोग कर रहा हूं। मुझे भ्रम था कि प्रलेखन कहता है कि ऐसी कोई विधि है लेकिन कोड एक त्रुटि दे रहा था। फिर से धन्यवाद। मैं अब सो सकता हूं।
नंदीश पटेल

2

यह बल्कि हैकिंग है, लेकिन आप one1एक Float64Indexही बार में सब कुछ करने के लिए उपयोग कर सकते हैं:

df.set_index('one').sort_index().groupby('key1')['two'].plot(style='--o', legend=True)

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

ध्यान दें कि 0.20.3 के अनुसार, इंडेक्स को क्रमबद्ध करना आवश्यक है , और किंवदंती थोड़ा विस्की है


1

सीबॉर्न में एक आवरण फ़ंक्शन scatterplotहोता है जो इसे अधिक कुशलता से करता है।

sns.scatterplot(data = df, x = 'one', y = 'two', data =  'key1'])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.