簡體   English   中英

大熊貓散布具有三點和seaborn的顏色

[英]pandas scatter plot colors with three points and seaborn

使用pandas和seaborn繪制僅包含三個點的散點圖時,會有一個奇怪的行為:這些點的顏色不同。 當未加載seaborn或具有三個以上點時,或者直接使用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()

我已經找到了錯誤。 該缺陷是pandas在技術上,而不是seaborn因為我本來以為,盡管它涉及到從代碼pandasseabornmatplotlib ...

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_values將由plt.rcParams['patch.facecolor']

現在,作為設置的一部分,seaborn將plt.rcParams['patch.facecolor']修改為(0.5725490196078431, 0.7764705882352941, 1.0) ,這是一個RGB元組。 如果未使用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可以接受多種不同類型的參數,它可以接受:

  • 字符串(例如在原始matplotlib情況下為'b' );
  • 顏色規格序列(例如RGB值序列);
  • 一系列值映射到當前顏色圖。

matplotlib文檔專門指出以下內容,突出顯示我的

c可以是單個顏色格式字符串,也可以是長度為N的顏色規范序列,也可以是使用通過kwargs指定的cmap和norm映射到顏色的N個數字序列(請參見下文)。 請注意,c不應是單個數字RGB或RGBA序列,因為這與要進行顏色映射的值數組是無法區分的。 c可以是一個二維數組,其中的行是RGB或RGBA。

基本上發生的是matplotlib取c_values值(這是三個數字的元組),然后將這些顏色映射到當前的顏色表(默認情況下,pandas將其設置為Greys )。 這樣,您將獲得三個具有不同“灰色度”的散點。 當分散點超過3個時,matplotlib假定它必須是RGB元組,因為其長度與數據數組的長度不匹配(3!= 4),因此將其用作恆定的RBG顏色。

這已經作為關於Github大熊貓的錯誤​​報告寫在這里

您可能要嘗試以下操作:

import seaborn.apionly as sns

並參閱此問題以獲取更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM