2015-03-25 8 views
5

एक अजीब व्यवहार है जब एक स्कैटर प्लॉट प्लॉट करने के लिए पांडा और समुद्री शैवाल का उपयोग करते हुए एक अजीब व्यवहार होता है जिसमें केवल तीन अंक होते हैं: बिंदुओं में एक ही रंग नहीं होता है। समस्या तब गायब हो जाती है जब समुद्री भोजन लोड नहीं होता है या जब तीन से अधिक अंक होते हैं, या जब matplotlib की स्कैटर विधि के साथ सीधे साजिश करते हैं। निम्नलिखित उदाहरण देखें:पांडा स्कैटर प्लॉट रंग तीन अंक और समुद्री डाकू

from pandas import DataFrame #0.16.0 
import matplotlib.pyplot as plt #1.4.3 
import seaborn as sns #0.5.1 
import numpy as np #1.9.2 

df = DataFrame({'x': np.random.uniform(0, 1, 3), 'y': np.random.uniform(0, 1, 3)}) 
df.plot(kind = 'scatter', x = 'x', y = 'y') 
plt.show() 

df = DataFrame({'x': np.random.uniform(0, 1, 4), 'y': np.random.uniform(0, 1, 4)}) 
df.plot(kind = 'scatter', x = 'x', y = 'y') 
plt.show() 

उत्तर

6

मैंने बग को ट्रैक किया है। बग तकनीकी रूप से, seaborn नहीं के रूप में मैं मूल रूप से सोचा, pandas में है, हालांकि यह pandas, seaborn, और matplotlib से कोड शामिल है ...

pandas.tools.plotting.ScatterPlot._make_plot में निम्न कोड रंग चुनने के लिए होता है बिखराव साजिश

में इस्तेमाल किया जाएगा
if c is None: 
    c_values = self.plt.rcParams['patch.facecolor'] 
elif c_is_column: 
    c_values = self.data[c].values 
else: 
    c_values = c 

अपने मामले c में None, जो डिफ़ॉल्ट मान है, और इसलिए c_valuesplt.rcParams['patch.facecolor'] द्वारा दिया जाएगा के बराबर हो जाएगा।

अब, स्वयं को स्थापित करने के हिस्से के रूप में, समुद्री डाकू plt.rcParams['patch.facecolor'] से (0.5725490196078431, 0.7764705882352941, 1.0) संशोधित करता है जो एक आरजीबी ट्यूपल है। यदि seaborn का उपयोग नहीं किया जाता है तो मान matplotlib डिफ़ॉल्ट है जो 'b' है (एक स्ट्रिंग रंग "नीला" इंगित करता है)।

c_values तो बाद में प्रयोग किया जाता है वास्तव में भीतर ax.scatter

scatter = ax.scatter(data[x].values, data[y].values, c=c_values, 
        label=label, cmap=cmap, **self.kwds) 

लेखाचित्र तैयार करने समस्या तब उत्पन्न होती है क्योंकि कीवर्ड तर्क c तर्क के कई अलग अलग प्रकार के स्वीकार कर सकते हैं, इसे स्वीकार कर सकते हैं: -

  • एक मूल स्ट्रिंग (जैसे 'b' मूल matplotlib मामले में);
  • रंग विनिर्देशों का एक अनुक्रम (आरजीबी मूल्यों का अनुक्रम कहें);
  • वर्तमान colormap पर मानचित्र करने के लिए मूल्यों का एक अनुक्रम।

matplotlib डॉक्स विशेष रूप से निम्नलिखित राज्य, मेरा प्रकाश डाला

ग एक ही रंग प्रारूप स्ट्रिंग, या लंबाई एन के रंग विनिर्देशों के एक दृश्य, या एन संख्या का एक अनुक्रम हो सकता मैप किया kwargs के माध्यम से निर्दिष्ट cmap और मानक का उपयोग कर रंगों के लिए (नीचे देखें)। ध्यान दें कि सी एक संख्यात्मक आरजीबी या आरजीबीए अनुक्रम नहीं होना चाहिए क्योंकि यह रंगों की एक सरणी से रंगीन होने के लिए अलग नहीं है। सी 2-डी सरणी हो सकती है जिसमें पंक्तियां आरजीबी या आरजीबीए हैं, हालांकि।

क्या मूल रूप से होता है कि matplotlib c_values मूल्य लेता है (जो तीन नंबर की एक टपल है) और फिर वर्तमान रंग मैप पर उन रंगों के नक्शे (डिफ़ॉल्ट रूप से Greys होने के लिए पांडा द्वारा निर्धारित है)। इस तरह के रूप में, आप अलग अलग "greyishness" के साथ तीन बिखराव अंक मिलते हैं। आप अधिक से अधिक 3 बिखराव अंक है, matplotlib मान लिया गया है कि यह एक आरजीबी टपल क्योंकि लंबाई डेटा सरणियों की लंबाई से मेल नहीं खाता होना चाहिए (3! = 4) और इसलिए एक निरंतर आरबीजी रंग के रूप में यह उपयोग करता है।

इस पांडा Github here पर एक बग रिपोर्ट के रूप में लिखा गया है।

+0

बहुत बहुत धन्यवाद। क्या आप गिटहब पर एक बग रिपोर्ट पोस्ट करने जा रहे हैं और पीआर जमा कर रहे हैं? यदि आप चाहें तो मैं कोशिश कर सकता हूं और कर सकता हूं। –

+0

@ डेविड ब्रोचर्ट आह क्षमा करें उल्लेख करना भूल गया। मैं पांडा GitHub पर एक बग रिपोर्ट पोस्ट किया है [यहां] (https://github.com/pydata/pandas/issues/9724)। आगे बढ़ने से पहले लोग क्या कहते हैं देखेंगे। – Ffisegydd

+0

अच्छा जासूस काम, @Ffisegydd – mwaskom

-1

आप इस की कोशिश करना चाहते हो सकता है:

import seaborn.apionly as sns 

और अधिक जानकारी के लिए This question देखते हैं।

+0

जबकि इस जानकारी का एक उपयोगी सा है, यह समस्या को ठीक करने के सवाल का जवाब नहीं है। यदि आप * चाहते हैं * समुद्र तट रंग का उपयोग करना चाहते हैं? – Ffisegydd

संबंधित मुद्दे