পান্ডাস / পাইপলট মধ্যে স্কেটার প্লট: বিভাগ অনুসারে কীভাবে প্লট করবেন


90

আমি পাইপ্লোটে একটি পান্ডাস ডেটাফ্রেম অবজেক্টটি ব্যবহার করে একটি সাধারণ স্ক্যাটার প্লট তৈরি করার চেষ্টা করছি, তবে দুটি ভেরিয়েবল প্লট করার একটি দক্ষ উপায় চাই তবে তৃতীয় কলাম (কী) দ্বারা চিহ্নিত চিহ্নগুলি পেতে চাই। আমি df.groupby ব্যবহার করে বিভিন্ন উপায়ে চেষ্টা করেছি, তবে সফলভাবে হয়নি। একটি নমুনা ডিএফ স্ক্রিপ্ট নীচে আছে। এটি 'কী 1' অনুযায়ী চিহ্নিতকারীগুলিকে রঙ করে তবে আইডি 'কী 1' বিভাগগুলির সাথে কিংবদন্তি দেখতে পছন্দ করে। আমি কি কাছে? ধন্যবাদ

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

উত্তর:


120

আপনি 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()

এখানে চিত্র বর্ণনা লিখুন


উপরের আরজিবি উদাহরণে কেন কিংবদন্তিতে দুটি বার প্রতীক দেখানো হয়েছে? কিভাবে একবার দেখাবেন?
স্টিভ শুলিস্ট

4
@ স্টিভশুলিস্ট - ax.legend(numpoints=1)কেবলমাত্র একটি চিহ্নিতকারী দেখানোর জন্য ব্যবহার করুন । দুটি হিসাবে রয়েছে, ক Line2Dএর সাথে, দুটি মার্কারকে সংযোগ করার জন্য প্রায়শই একটি লাইন থাকে।
জো কিংটন

এই কোডটি কেবল কমান্ডের পরে যুক্ত করার plt.hold(True)পরে আমার পক্ষে কাজ করেছিল ax.plot()। কোন ধারণা কেন?
যুবাল আতজমন

set_color_cycle() ম্যাটপ্লোটিলেব 1.5 তে অবমূল্যায়িত হয়েছিল। নেই set_prop_cycle()এখন।
আলে

52

এই সঙ্গে কাজ করতে সহজ সমুদ্রজাত ( 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 ব্যবহার করতে পারেন, এবং সি বিন্যাসে প্রতিটি বিন্দুর বর্ণ নির্ধারণ করতে একটি অ্যারে পাস করতে পারেন:

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

এখানে চিত্র বর্ণনা লিখুন


4

ম্যাটপ্ল্লিটিব ৩.১ এর পরে আপনি ব্যবহার করতে পারেন .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()

এখানে চিত্র বর্ণনা লিখুন


আমি 'প্যাথকলেকশন' অবজেক্টের 'লেজেন্ডস এলিমেটস' নেই বলে কোনও ত্রুটি পেয়েছি। আমার কোডটি নিম্নরূপ। 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())
নন্দীশ প্যাটেল

4
@ নন্দীশপেটেল এই উত্তরের প্রথম বাক্যটি পরীক্ষা করে দেখুন। এছাড়াও বিভ্রান্ত না করার বিষয়টি নিশ্চিত করুন legends_elementsএবং legend_elements
ImportanceOfBeingErnest

হ্যাঁ, আপনাকে ধন্যবাদ. এটি ছিল একটি টাইপো (কিংবদন্তি / কিংবদন্তি)। আমি গত 6 ঘন্টা থেকে কিছু নিয়ে কাজ করছি যাতে ম্যাটপ্ল্লোব সংস্করণ আমার কাছে না ঘটে। আমি ভাবলাম আমি সর্বশেষটি ব্যবহার করছি। আমি বিভ্রান্ত হয়ে পড়েছিলাম যে ডকুমেন্টেশন বলছে এমন পদ্ধতি আছে তবে কোডটি একটি ত্রুটি দিচ্ছিল। আবার আপনাকে ধন্যবাদ. আমি এখন ঘুমাতে পারি
নন্দীশ প্যাটেল 15'19

2

বরং হল hacky, কিন্তু আপনি ব্যবহার করতে পারে 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'])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.