pandas 三点散点图颜色和 seaborn

pandas scatter plot colors with three points and seaborn

使用 pandas 和 seaborn 绘制只有三个点的散点图时会出现奇怪的行为:这些点的颜色不同。当seaborn没有加载或者点数超过三个时,或者直接用matplotlib的scatter方法绘图时问题消失。请参阅以下示例:

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

您可能想试试这个:

import seaborn.apionly as sns

有关详细信息,请参阅 This question

我已经找到了这个错误。从技术上讲,该错误在 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'(表示颜色 "blue" 的字符串)。

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 can be a single color format string, or a sequence of color specifications of length N, or a sequence of N numbers to be mapped to colors using the cmap and norm specified via kwargs (see below). Note that c should not be a single numeric RGB or RGBA sequence because that is indistinguishable from an array of values to be colormapped. c can be a 2-D array in which the rows are RGB or RGBA, however.

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

这已作为错误报告写在 pandas Github here.