使用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()
答案 0 :(得分:6)
我已经找到了这个错误。该错误在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'
(表示颜色的字符串"蓝色")。
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文档明确说明了以下内容,突出了我的
c可以是单色格式字符串,或长度为N的颜色规范序列,或使用通过kwargs指定的cmap和norm映射到颜色的N个数字序列(见下文)。 请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分。 c可以是一个二维数组,其中行是RGB或RGBA,但是。
基本上发生的是matplotlib取c_values
值(这是三个数字的元组),然后将这些颜色映射到当前的colormap(默认情况下由pandas设置为Greys
)。因此,您将获得三个具有不同" greyishness" 的散点图。当你有超过3个散点时,matplotlib假定它必须是一个RGB元组,因为长度不匹配数据数组的长度(3!= 4),所以将它用作一个恒定的RBG颜色。 / p>
这是关于熊猫Github here的错误报告。
答案 1 :(得分:-1)