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
,尽管它涉及 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_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.
使用 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
,尽管它涉及 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_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.