大熊猫散点图颜色有三点和seaborn

Dav*_*art 5 python pandas 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()
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

Ffi*_*ydd 6

我已经找到了这个bug.该缺陷是在pandas技术上,而不是seaborn因为我本来以为,虽然它从涉及的代码pandas,seabornmatplotlib...

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
Run Code Online (Sandbox Code Playgroud)

在你的情况下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)
Run Code Online (Sandbox Code Playgroud)

出现这个问题是因为关键字参数c可以接受多种不同类型的参数,它可以接受: -

  • 一个字符串(例如'b'在原始matplotlib的情况下);
  • 一系列颜色规范(比如一系列RGB值);
  • 要映射到当前色彩映射的一系列值.

matplotlib文档明确说明了以下内容,突出了我的

c可以是单色格式字符串,或长度为N的颜色规范序列,或使用通过kwargs指定的cmap和norm映射到颜色的N个数字序列(见下文).请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分.然而,c可以是2-D阵列,其中行是RGB或RGBA.

基本上发生的是matplotlib获取c_values值(这是三个数字的元组),然后将这些颜色映射到当前的colormap(Greys默认情况下由pandas 设置).因此,您会得到三个具有不同"灰色"的散点.当您有超过3个散点时,matplotlib假定它必须是RGB元组,因为长度与数据数组的长度不匹配(3!= 4),因此将其用作常量RBG颜色.

这已被编写成的大熊猫Github上的bug报告在这里.