【问题标题】:pandas scatter plot colors with three points and seabornpandas 用三点和 seaborn 散点图颜色
【发布时间】:2015-05-28 23:14:06
【问题描述】:

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

【问题讨论】:

    标签: python pandas seaborn


    【解决方案1】:

    我已经找到了这个错误。从技术上讲,该错误在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可以接受多种不同类型的参数,它可以接受:-

    • 一个字符串(如'b'在原始matplotlib案例中);
    • 一系列颜色规范(比如一系列 RGB 值);
    • 要映射到当前颜色图的一系列值。

    matplotlib 文档特别说明了以下内容,突出显示了我的

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

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

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

    【讨论】:

    • 非常感谢。你打算在 GitHub 上发布错误报告并提交 PR 吗?如果你愿意,我可以试试看。
    • @DavidBrochart 啊抱歉忘了提。我在 pandas github here 上发布了一个错误报告。在继续之前会先看看人们怎么说。
    【解决方案2】:

    你可能想试试这个:

    import seaborn.apionly as sns
    

    更多详情请参阅This question

    【讨论】:

    • 虽然这是一个有用的信息,但它并没有回答如何解决问题的问题。如果您使用 seaborn 着色怎么办?
    猜你喜欢
    • 2019-11-23
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 2018-01-27
    • 2019-09-14
    相关资源
    最近更新 更多