कैसे एक पांडा / matplotlib बार ग्राफ कस्टम रंग देने के लिए


85

मैंने बस स्टैक्ड बार चार्ट बनाने के लिए एक्सेल के प्रतिस्थापन के रूप में पंडों / मेटप्लोटलिब का उपयोग करना शुरू किया। मैं एक मुद्दे में भाग रहा हूं

(1) डिफ़ॉल्ट कॉलोर्माॅप में केवल 5 रंग हैं, इसलिए यदि मेरे पास 5 से अधिक श्रेणियां हैं तो रंग दोहराते हैं। मैं और अधिक रंग कैसे निर्दिष्ट कर सकता हूं? आदर्श रूप से, प्रारंभ रंग और अंत रंग के साथ एक ढाल, और बीच में n रंग बनाने के लिए एक तरीका है?

(2) रंग बहुत ही मनभावन नहीं होते हैं। मैं n रंगों का एक कस्टम सेट कैसे निर्दिष्ट करूं? या, एक ढाल भी काम करेगा।

उपरोक्त दोनों बिंदुओं को दर्शाने वाला एक उदाहरण नीचे दिया गया है:

  4 from matplotlib import pyplot
  5 from pandas import *
  6 import random
  7 
  8 x = [{i:random.randint(1,5)} for i in range(10)]
  9 df = DataFrame(x)
 10 
 11 df.plot(kind='bar', stacked=True)

और आउटपुट यह है:

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


आंशिक कॉलॉर्मैप प्राप्त करने का एक बहुत आसान तरीका है। इस समाधान को नीचे देखें
टेड पेट्रोव

जवाबों:


118

आप colorविकल्प को सूची में सीधे plotफ़ंक्शन के रूप में निर्दिष्ट कर सकते हैं ।

from matplotlib import pyplot as plt
from itertools import cycle, islice
import pandas, numpy as np  # I find np.random.randint to be better

# Make the data
x = [{i:np.random.randint(1,5)} for i in range(10)]
df = pandas.DataFrame(x)

# Make a list by cycling through the colors you care about
# to match the length of your data.
my_colors = list(islice(cycle(['b', 'r', 'g', 'y', 'k']), None, len(df)))

# Specify this list of colors as the `color` option to `plot`.
df.plot(kind='bar', stacked=True, color=my_colors)

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

my_colors = ['g', 'b']*5 # <-- this concatenates the list to itself 5 times.
my_colors = [(0.5,0.4,0.5), (0.75, 0.75, 0.25)]*5 # <-- make two custom RGBs and repeat/alternate them over all the bar elements.
my_colors = [(x/10.0, x/20.0, 0.75) for x in range(len(df))] # <-- Quick gradient example along the Red/Green dimensions.

अंतिम उदाहरण मेरे लिए रंगों के सरल ढाल का पालन करता है:

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

मैं इसके साथ खेलने के लिए यह जानने के लिए बहुत देर तक नहीं खेला कि किंवदंती को परिभाषित रंग लेने के लिए कैसे मजबूर किया जाए, लेकिन मुझे यकीन है कि आप इसे कर सकते हैं।

सामान्य तौर पर, हालांकि, सलाह का एक बड़ा टुकड़ा केवल सीधे मैटलपोटलिब से कार्यों का उपयोग करना है। पंडों से उन्हें कॉल करना ठीक है, लेकिन मुझे लगता है कि आप बेहतर विकल्प और प्रदर्शन प्राप्त करते हैं और उन्हें सीधे मैटलपोटलिब से बुलाते हैं।


3
माइनर बग: my_colors = [चक्र ([, b ’,, r’,: g ’, 'y’,। K ’])। आगे () के लिए i in रेंज (len (df))]' b’ देगा। अजगर 2.7 में हर बार। आपको इसके बजाय सूची (islice (साइकिल (['b', 'r', 'g', 'y', 'k']), कोई नहीं, len (df)) का उपयोग करना चाहिए।
vkontori

धन्यवाद, मैं शायद पकड़ा नहीं होगा कि। एक अन्य विकल्प पहले चक्र बनाना है, फिर बस इसके nextकार्य को समझ के अंदर कॉल करें ।
Ely

हाँ। it = cycle (['b', 'r', 'g', 'y', 'k']); my_colors = [x (len (df)) में i के लिए अगला (यह)) इसे भी काट देगा ...
vkontori

1
आज स्थापित पांडा और मेटप्लोटिब के साथ, ऊपर का कोड मेरे लिए कुछ भी नहीं उत्पन्न करता है, हालांकि यह चलता है।
काक्यो

@ काकाओ क्या आप नियमित दुभाषिया, आईपीथॉन, या शेल (या कुछ और) से भाग रहे हैं? इस कोड को आप किस प्रकार के परिवेश में निष्पादित करते हैं, इसके आधार पर, आपको matplotlib के लिए इंटरेक्टिव मोड को चालू करने या pylab.ion()इंटरैक्टिव पाइलैब के लिए सेट करने की आवश्यकता हो सकती है ।
Ely

52

मैंने पाया कि प्रीसेट कलर ग्रेडिएंट colormapमें .plot()से एक के साथ पैरामीटर का उपयोग करना सबसे आसान तरीका है :

df.plot(kind='bar', stacked=True, colormap='Paired')

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

आप यहां प्रीसेट कॉलोरामैप की एक बड़ी सूची पा सकते हैं ।

colormaps


18
मेरे मामले में यह केवल सभी सलाखों के पार एक रंग देता है
tsando

मैंने पाया कि इन कॉलोरामैप्स में उपयोगी matplotlib.org/examples/color/colormaps_reference.html gallantlab.github.io/colormaps.html
Al Po

15

अपने स्वयं के कॉलमैप बनाने के बारे में अधिक विस्तृत जवाब के लिए, मैं इस पृष्ठ पर जाने का सुझाव देता हूं

यदि वह उत्तर बहुत अधिक काम का है, तो आप जल्दी से रंगों की अपनी सूची बना सकते हैं और उन्हें colorपैरामीटर में पास कर सकते हैं। सभी cmcolormaps matplotlib मॉड्यूल में हैं। आइए, उलटे अवरो कॉलोर्मैप से 30 आरजीबी (प्लस अल्फा) रंग मूल्यों की एक सूची प्राप्त करें। ऐसा करने के लिए, पहले कॉलोर्मैप प्राप्त करें और फिर इसे 0 और 1. के बीच मानों का एक क्रम दें। यहां, हम np.linspace.4 और .8 के बीच 30 समान रूप से-दूरी वाले मान बनाने के लिए उपयोग करते हैं जो कॉलॉर्मैप के उस हिस्से का प्रतिनिधित्व करते हैं।

from matplotlib import cm
color = cm.inferno_r(np.linspace(.4, .8, 30))
color

array([[ 0.865006,  0.316822,  0.226055,  1.      ],
       [ 0.851384,  0.30226 ,  0.239636,  1.      ],
       [ 0.832299,  0.283913,  0.257383,  1.      ],
       [ 0.817341,  0.270954,  0.27039 ,  1.      ],
       [ 0.796607,  0.254728,  0.287264,  1.      ],
       [ 0.775059,  0.239667,  0.303526,  1.      ],
       [ 0.758422,  0.229097,  0.315266,  1.      ],
       [ 0.735683,  0.215906,  0.330245,  1.      ],
       .....

फिर हम मूल पोस्ट से डेटा का उपयोग करके साजिश करने के लिए इसका उपयोग कर सकते हैं:

import random
x = [{i: random.randint(1, 5)} for i in range(30)]
df = pd.DataFrame(x)
df.plot(kind='bar', stacked=True, color=color, legend=False, figsize=(12, 4))

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


2
इसके अलावा अन्य रंग मानचित्रों के दस्तावेज़ यहां दिए गए हैं inferno_r: matplotlib.org/examples/color/colormaps_reference.html
tsando

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