ম্যাটপ্ল্লোব ব্যবহার করে বিভিন্ন শ্রেণিবদ্ধ স্তরের জন্য বিভিন্ন রঙের প্লট করুন


104

আমি এই তথ্য ফ্রেম আছে diamondsযা মত ভেরিয়েবল গঠিত হয় (carat, price, color), এবং আমি একটি ছিটান চক্রান্ত আকর্ষণ করতে চাই priceথেকে caratপ্রত্যেকের জন্য color, বিভিন্ন যার মানে colorচক্রান্ত বিভিন্ন রং আছে।

এটি Rসহ সহজ ggplot:

ggplot(aes(x=carat, y=price, color=color),  #by setting color=color, ggplot automatically draw in different colors
       data=diamonds) + geom_point(stat='summary', fun.y=median)

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

আমি ভাবছি পাইথন ব্যবহার করে এটি matplotlibকীভাবে করা যায় ?

পুনশ্চ:

আমি যেমন অক্জিলিয়ারী চক্রান্ত প্যাকেজ, সম্পর্কে জানতে seabornএবং ggplot for python, এবং আমি তাদের পছন্দ করা donot, শুধু খুঁজে বের করতে যদি এটি ব্যবহার কাজ করা সম্ভব চান matplotlibএকা,; p


4
ম্যাটপ্ল্লিটিবের মতো এমন কিছু তৈরি করা সত্যিই চমৎকার লাগবে তবে মনে হয় এটি সহজ হবে না। এখানে আলোচনা: github.com/matplotlib/matplotlib/issues/6214
নট 101

উত্তর:


159

আপনি plt.scatterএকটি cযুক্তি পাস করতে পারেন যা আপনাকে রঙগুলি নির্বাচন করতে দেয়। নীচের কোডটি colorsআপনার ডায়মন্ডের রঙগুলি প্লট করার রঙগুলিতে মানচিত্র করতে একটি অভিধানকে সংজ্ঞায়িত করে ।

import matplotlib.pyplot as plt
import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

fig, ax = plt.subplots()

colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}

ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))

plt.show()

df['color'].apply(lambda x: colors[x]) কার্যকরভাবে "হীরা" থেকে "চক্রান্ত করা" পর্যন্ত রঙের মানচিত্রগুলি।

(অন্য উদাহরণ চিত্র না রাখার জন্য আমাকে ক্ষমা করুন, আমি মনে করি 2 টি যথেষ্ট: পি)

সঙ্গে seaborn

আপনি যে seabornচারপাশে একটি মোড়ক ব্যবহার করতে পারেন matplotlibএটি এটি ডিফল্টরূপে সুন্দর দেখায় (বরং মতামতভিত্তিক, আমি জানি: পি) তবে কিছু প্লটিং ফাংশন যুক্ত করে।

এই জন্য আপনি ব্যবহার করতে পারে seaborn.lmplotসঙ্গে fit_reg=False(যা এটি স্বয়ংক্রিয়ভাবে কিছু রিগ্রেশন কাজ করা থেকে আটকায়)।

নীচের কোডটি উদাহরণস্বরূপ ডেটাসেট ব্যবহার করে। hue='color'আপনি নির্বাচনের মাধ্যমে সমুদ্র সৈকতকে আপনার রঙের উপর ভিত্তি করে আপনার ডেটা ফ্রেম বিভক্ত করতে এবং তারপরে প্রতিটি প্লট করতে বলুন tell

import matplotlib.pyplot as plt
import seaborn as sns

import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

sns.lmplot('carat', 'price', data=df, hue='color', fit_reg=False)

plt.show()

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

seabornব্যবহার না করেpandas.groupby

আপনি যদি সামুদ্রিক অংশ ব্যবহার করতে না চান তবে আপনি pandas.groupbyএকা রঙগুলি পেতে ব্যবহার করতে পারেন এবং তারপরে কেবল ম্যাটপ্ল্লোলিব ব্যবহার করে প্লট করতে পারেন তবে আপনাকে যেতে যেতে ম্যানুয়ালি রঙ বরাদ্দ করতে হবে, আমি নীচে একটি উদাহরণ যুক্ত করেছি:

fig, ax = plt.subplots()

colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}

grouped = df.groupby('color')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='carat', y='price', label=key, color=colors[key])

plt.show()

এই কোডটি উপরের মতো একই ডেটাফ্রেমকে ধরে নেয় এবং তারপরে এটির ভিত্তিতে গোষ্ঠী করে color। এটি এরপরে এই গোষ্ঠীগুলির উপরে পুনরুক্তি করে প্রতিটিটির জন্য প্লট করে। একটি রঙ নির্বাচন করতে আমি একটি colorsঅভিধান তৈরি করেছি যা ডায়মন্ডের রঙকে ম্যাপ করতে পারে (উদাহরণস্বরূপ D) একটি সত্য রঙে (উদাহরণস্বরূপ red)।

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


ধন্যবাদ, তবে আমি কেবল ম্যাটপ্ললিটব দিয়ে কীভাবে কাজ করব তা সন্ধান করতে চাই।
অ্যাভোকাডো

হ্যাঁ, groupbyআমি এটি করতে পেরেছিলাম, সুতরাং এখানে এমন একটি বৈশিষ্ট্য রয়েছে matplotlibযা বিভিন্ন রঙের সাহায্যে স্বয়ংক্রিয়ভাবে বিভিন্ন শ্রেণীর জন্য আঁকতে পারে, তাই না ?
অ্যাভোকাডো

@ লোগানোকলস ওকে আমি দেখুন :) আমি আবার এটি সম্পাদনা করেছি এবং খুব সাধারণ উদাহরণ যুক্ত করেছি যা উদাহরণগুলির সাথে একইভাবে রঙগুলি মানচিত্র করতে একটি অভিধান ব্যবহার করে groupby
Ffisegydd

4
@ ফাইফিজিডিডি প্রথম পদ্ধতিটি ব্যবহার করে যা হ'ল ax.scatterআপনি কীভাবে এতে কিংবদন্তী যুক্ত করবেন? আমি চেষ্টা করছি label=df['color']এবং তারপরে plt.legend()কোনও সাফল্য নেই with
আহুশ

4
এটি পরিবর্তন করতে ভাল হবে ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))থেকেax.scatter(df['carat'], df['price'], c=df['color'].map(colors)
Dawei

39

সিউর্ন কালার প্যালেটটি ব্যবহার করার জন্য এখানে একটি সংক্ষিপ্ত এবং জেনেরিক সমাধান।

প্রথমে আপনার পছন্দ মতো রঙিন প্যালেটটি সন্ধান করুন এবং optionচ্ছিকভাবে এটি কল্পনা করুন:

sns.palplot(sns.color_palette("Set2", 8))

তারপরে আপনি এটি করে এটি ব্যবহার করতে পারেন matplotlib:

# Unique category labels: 'D', 'F', 'G', ...
color_labels = df['color'].unique()

# List of RGB triplets
rgb_values = sns.color_palette("Set2", 8)

# Map label to RGB
color_map = dict(zip(color_labels, rgb_values))

# Finally use the mapped values
plt.scatter(df['carat'], df['price'], c=df['color'].map(color_map))

4
আমি আপনার পদ্ধতির পছন্দ। উপরের উদাহরণটি দেওয়া, আপনি অবশ্যই এই জাতীয় রঙের মতো সাধারণ নামগুলিতে মানচিত্রটি মানচিত্র করতে পারেন: 1) রঙের বর্ণগুলি নির্ধারণ করুন = {'ডি': 'লাল', 'ই': 'নীল', 'এফ': 'সবুজ ',' জি ':' কালো '} 2) এগুলি আপনি যেমন করেছেন তেমন মানচিত্র করুন: ax.scatter (df [' carat '], df [' মূল্য '], c = df [' color ']। মানচিত্র (রং))
স্টিফান

4
এই ক্ষেত্রে আপনি কীভাবে রঙের দ্বারা একটি লেবেল যুক্ত করবেন?
ফ্রাসোয়া Leblanc

4
আরো কিছু বিমূর্ততা যোগ করার জন্য প্রতিস্থাপন করতে পারেন 8মধ্যে sns.color_palette("Set2", 8)দ্বারা len(color_labels)
সুইয়ার

এটি দুর্দান্ত, তবে এটি সমুদ্রযুক্ত দ্বারা স্বয়ংক্রিয়ভাবে করা উচিত। শ্রেণীগত ভেরিয়েবল জন্য একটি মানচিত্রে ব্যবহার করতে হচ্ছে প্রতি একক সময় আপনি দ্রুত হয় চক্রান্ত কিছু করতে চান অবিশ্বাস্যভাবে বাধা। প্লটটিতে পরিসংখ্যান প্রদর্শন করার ক্ষমতা গ্রহণ করার জন্য বুদ্ধিমানের আইডিয়াটি উল্লেখ না করা। সিবর্ন, দুর্ভাগ্যক্রমে, এই কারণগুলির কারণে প্যাকেজ হিসাবে হ্রাস পাচ্ছে
তাড়া করুন

7

আমার একই প্রশ্ন ছিল, এবং সারা দিন বিভিন্ন প্যাকেজ চেষ্টা করে কাটিয়েছি।

আমি মূলত মাতালিবপ্লোট ব্যবহার করেছি: এবং পূর্বনির্ধারিত বর্ণগুলিতে ম্যাপিং বিভাগগুলির সাথে সন্তুষ্ট নই; বা গোষ্ঠীবদ্ধকরণ / একত্রিতকরণের পরে গোষ্ঠীগুলির মাধ্যমে পুনরাবৃত্তি করা (এবং এখনও রঙের মানচিত্র রাখতে হবে)। আমি কেবল অনুভব করেছি এটি প্যাকেজ বাস্তবায়ন খুব খারাপ।

সিউর্ন আমার ক্ষেত্রে কাজ করবে না এবং আল্টায়ার কেবলমাত্র একটি বৃহত্তর নোটবুকের ভিতরে কাজ করে।

আমার জন্য সবচেয়ে ভাল সমাধানটি ছিল প্লটনাাইন যা "পাইথনের গ্রাফিক্সের ব্যাকরণের প্রয়োগ এবং ggplot2 এর উপর ভিত্তি করে"।

পাইথনে আপনার আর উদাহরণটি প্রতিলিপি করতে নীচে প্লটটাইন কোড রয়েছে:

from plotnine import *
from plotnine.data import diamonds

g = ggplot(diamonds, aes(x='carat', y='price', color='color')) + geom_point(stat='summary')
print(g)

প্লটিনাইন হীরা উদাহরণ

খুব পরিষ্কার এবং সহজ :)


প্রশ্ন matplotlib চাইলেন
চাক


5

এখানে একটি গুণগত রঙিন মানচিত্র থেকে চিহ্নিতকারী এবং রঙগুলির সংমিশ্রণ matplotlib:

import itertools
import numpy as np
from matplotlib import markers
import matplotlib.pyplot as plt

m_styles = markers.MarkerStyle.markers
N = 60
colormap = plt.cm.Dark2.colors  # Qualitative colormap
for i, (marker, color) in zip(range(N), itertools.product(m_styles, colormap)):
    plt.scatter(*np.random.random(2), color=color, marker=marker, label=i)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., ncol=4);

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


ইন mpl.cm.Dark2.colors- mplআপনার কোডটিতে সংজ্ঞায়িত বলে মনে হচ্ছে না এবং এর Dark2কোনও বৈশিষ্ট্য নেই colors
শোভাল্ট

@ শোভাল্ট পর্যালোচনা করার জন্য ধন্যবাদ। আমি আমদানি করেছি উচিত matplotlibযেমন mpl, আমি ব্যবহার করে আমার কোড সংশোধন আছে pltযা ধারণ করে cm। কমপক্ষে matplotlibআমি যে 2.0.0.0 সংস্করণটি ব্যবহার করছি Dark2তার বৈশিষ্ট্যটি রয়েছেcolors
পাবলো রেস

4
দেরীতে, তবে আপনার রঙগুলির বৈশিষ্ট্যটি না থাকলে: ইটার (plt.cm.Dark2 (np.linspace (0,1, N)))
জেফ লেন্টস

3

Df.plot সহ ()

সাধারণত যখন কোনও ডেটা ফ্রেমের প্লট করা হয় তখন আমি ব্যবহার করি pd.DataFrame.plot()। এটি সূচকটিকে x মান হিসাবে গ্রহণ করবে, y মান হিসাবে মান এবং প্রতিটি কলাম আলাদা আলাদা রঙের সাথে পৃথক করে। এই ফর্মটিতে একটি ডেটাফ্রেম ব্যবহার করে set_indexএবং অর্জন করা যায় unstack

import matplotlib.pyplot as plt
import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

df.set_index(['color', 'carat']).unstack('color')['price'].plot(style='o')
plt.ylabel('price')

পটভূমি

এই পদ্ধতির সাহায্যে আপনাকে ম্যানুয়ালি রঙগুলি নির্দিষ্ট করতে হবে না।

এই পদ্ধতিটি অন্যান্য ডেটা সিরিজের জন্য আরও বোধ করতে পারে। আমার ক্ষেত্রে আমার টাইমসরিজ ডেটা রয়েছে, সুতরাং মাল্টিআইডেক্সে তারিখ সময় এবং বিভাগগুলি রয়েছে। একাধিক কলাম দ্বারা রঙিন করার জন্য এই পদ্ধতির ব্যবহার করাও সম্ভব, তবে কিংবদন্তি গোলমাল করছে।


0

আমি সাধারণত এটি সিবোর্ন ব্যবহার করে করি যা ম্যাটপ্ল্লিটিবের উপরে নির্মিত

import seaborn as sns
iris = sns.load_dataset('iris')
sns.scatterplot(x='sepal_length', y='sepal_width',
              hue='species', data=iris); 

0

আপনি কমান্ডগুলি ব্যবহার করে বিভাগীয় কলামকে একটি সংখ্যাসূচক রূপান্তর করতে পারেন:

#we converting it into categorical data
cat_col = df['column_name'].astype('categorical') 

#we are getting codes for it 
cat_col = cat_col.cat.codes 

# we are using c parameter to change the color.
plt.scatter(df['column1'],df['column2'], c=cat_col) 

উল্লেখ্য আপনার প্রয়োজন হতে পারে যে astype('category'), না categorical
j6m8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.