matplotlib का उपयोग करके अलग-अलग श्रेणीगत स्तरों के लिए अलग-अलग रंग की साजिश करें


102

मैं इस डेटा फ्रेम है 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, और मैं उन्हें पसंद नहीं करता, बस यह पता लगाना चाहता हूं कि क्या matplotlibअकेले काम करना संभव है , पी;


1
मैटप्लोटलिब में बनाया गया ऐसा कुछ होना वास्तव में अच्छा होगा, लेकिन ऐसा लगता है कि यह आसान नहीं होगा। यहाँ पर चर्चा: github.com/matplotlib/matplotlib/issues/6214
n

जवाबों:


156

आप 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यह डिफ़ॉल्ट रूप से सुंदर दिखता है (बल्कि राय-आधारित, मुझे पता है: P) लेकिन कुछ प्लॉटिंग फ़ंक्शन भी जोड़ता है।

इसके लिए आप के seaborn.lmplotसाथ उपयोग कर सकते हैं fit_reg=False(जो इसे स्वचालित रूप से कुछ प्रतिगमन करने से रोकता है)।

नीचे दिए गए कोड एक उदाहरण डेटासेट का उपयोग करता है। चयन करकेhue='color' आप अपने रंगों के आधार पर अपने डेटाफ़्रेम को विभाजित करने के लिए सीबॉर्न को बताएं और फिर प्रत्येक को प्लॉट करें।

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

यह कोड ऊपर जैसा ही DataFrame मानता है और फिर उसके आधार पर समूह बनाता है color। यह तब इन समूहों पर पुनरावृत्ति करता है, प्रत्येक के लिए साजिश रचता है। एक रंग का चयन करने के लिए मैंने एक colorsशब्दकोश बनाया है जो हीरे के रंग (उदाहरण के लिए D) को वास्तविक रंग (उदाहरण के लिए red) के लिए मैप कर सकता है ।

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


धन्यवाद, लेकिन मैं सिर्फ यह पता लगाना चाहता हूं कि अकेले मैटलपोटलिब के साथ काम कैसे करना है।
एवोकैडो

हां, groupbyमैं ऐसा कर सकता था, इसलिए इसमें ऐसी विशेषता है matplotlibकि अलग-अलग रंग का उपयोग करके स्वचालित रूप से विभिन्न स्तरों के लिए आकर्षित कर सकते हैं, है ना?
एवोकैडो

@loganecolss Ok मैं देख रहा हूँ :) मैंने इसे फिर से संपादित किया है और एक बहुत ही सरल उदाहरण जोड़ा है जो रंगों को मैप करने के लिए एक शब्दकोश का उपयोग करता है, groupbyउदाहरण के लिए।
Ffisegydd

1
@Ffisegydd पहली विधि का उपयोग करते हुए ax.scatter, आप इसमें किंवदंतियों को कैसे जोड़ेंगे? मैं उपयोग करने की कोशिश कर रहा हूं label=df['color']और फिर plt.legend()कोई सफलता नहीं है।
ऐशोश

1
इसे बदलने के लिए बेहतर होगा 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)
दावेई

33

यहां एक समुद्री रंग पैलेट का उपयोग करने के लिए एक रसीला और सामान्य समाधान है।

पहले एक रंग पैलेट ढूंढें जिसे आप पसंद करते हैं और वैकल्पिक रूप से इसकी कल्पना करते हैं:

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

2
मुझे आपका दृष्टिकोण पसंद है। ऊपर दिए गए उदाहरण को देखते हुए, आप निश्चित रूप से इस तरह के सरल रंग नामों के मानों को भी मैप कर सकते हैं: 1) रंगों को परिभाषित करें रंग = {'डी': 'लाल', 'ई': 'ब्लू', 'एफ': 'ग्रीन' ',' G ':' black '} 2) जैसा आपने किया था वैसा ही उन्हें मैप करें: ax.scatter (df [' carat '], df [' price '], c = df [' color ']। map (रंग)।
स्टीफन

1
आप इस मामले में रंग द्वारा एक लेबल कैसे जोड़ेंगे, हालांकि?
फ्रांकोइस लेब्लांक

2
कुछ और अमूर्त जोड़ने के लिए, आप 8में sns.color_palette("Set2", 8)से बदल सकते हैं len(color_labels)
तैयर

यह बहुत अच्छा है, लेकिन इसे स्वचालित रूप से समुद्री जीव द्वारा किया जाना चाहिए। हर बार जब आप किसी चीज को जल्दी से तैयार करना चाहते हैं, तो श्रेणीबद्ध चर के लिए एक मानचित्र का उपयोग करना अविश्वसनीय रूप से बाधा है। भूखंड पर आँकड़े प्रदर्शित करने की क्षमता को बाहर निकालने के लिए मूर्खतापूर्ण विचार का उल्लेख नहीं करना। सीबोर्न, दुर्भाग्य से, इन कारणों के कारण एक पैकेज के रूप में घट रहा है
पीछा


6

मेरे पास एक ही सवाल था, और पूरे दिन अलग-अलग पैकेजों को आज़माने में बिताया।

मैंने मूल रूप से matlibplot का उपयोग किया था: और पूर्वनिर्धारित रंगों की मैपिंग श्रेणियों से खुश नहीं था; या समूहीकरण / एकत्रीकरण तब समूहों के माध्यम से पुनरावृत्ति (और अभी भी रंग मैप करने के लिए)। मुझे लगा कि यह खराब पैकेज कार्यान्वयन था।

सीबोर्न मेरे मामले पर काम नहीं करेगा, और अल्टेयर केवल एक जुपिटर नोटबुक के अंदर काम करता है।

मेरे लिए सबसे अच्छा समाधान प्लॉटाइन था, जो "पायथन में ग्राफिक्स के एक व्याकरण का कार्यान्वयन है, और ggplot2 पर आधारित है"।

पायथन में अपने R उदाहरण को दोहराने के लिए नीचे प्लॉटाइन कोड है:

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
शोवॉल्ट

@Shovalt समीक्षा के लिए धन्यवाद। मैं आयातित किया जाना चाहिए था matplotlibके रूप में mpl, मैं का उपयोग करके अपनी कोड को सही है plt, जो भी शामिल है cm। कम से कम जिस matplotlibसंस्करण में मैं 2.0.0 का उपयोग कर रहा हूं, Dark2उसमें विशेषता हैcolors
पाब्लो रेयेस

1
देर से, लेकिन अगर आपके पास रंग विशेषता नहीं है: iter (plt.cm.Dark2 (np.linspace (0,1, N)))
ज्योफ लेंट्स

3

Df.plot () के साथ

आम तौर पर जब जल्दी से एक DataFrame की साजिश रचते हैं, तो मैं उपयोग करता हूं pd.DataFrame.plot()। यह सूचकांक को x मान के रूप में लेता है, y मान के रूप में मान और प्रत्येक कॉलम को अलग रंग के साथ अलग से प्लॉट करता है। इस रूप में एक DataFrame का उपयोग करके 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); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.