Python 熊猫用三点和海生的颜色散布在地图上

Python 熊猫用三点和海生的颜色散布在地图上,python,pandas,seaborn,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 =

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


您可能想尝试以下方法:

import seaborn.apionly as sns

有关更多详细信息,请参阅。

我已经找到了错误。从技术上讲,这个bug出现在
pandas
中,而不是我最初认为的
seaborn
,尽管它涉及
pandas
seaborn
matplotlib
中的代码

在以下代码中,选择散点图中使用的颜色

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\u值将由
plt.rcParams['patch.facecolor']
给出

现在,作为自身设置的一部分,seaborn将
plt.rcParams['patch.facecolor']
修改为
(0.5725490196078431,0.7764705882352941,1.0)
,这是一个RGB元组。如果未使用
seaborn
,则该值为matplotlib默认值,即
'b'
(表示颜色“蓝色”的字符串)

c_值
随后用于在
ax.scatter

scatter = ax.scatter(data[x].values, data[y].values, c=c_values,
                     label=label, cmap=cmap, **self.kwds)
出现此问题是因为关键字argument
c
可以接受多种不同类型的参数,它可以接受:-

  • 一个字符串(如原始matplotlib中的
    'b'
  • 颜色规格序列(例如RGB值序列)
  • 要映射到当前颜色映射的值序列
matplotlib文档特别说明了以下内容,突出显示了我的

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

基本上,matplotlib采用
c_值
值(三个数字的元组),然后将这些颜色映射到当前颜色映射(pandas默认设置为
Greys
)。因此,您将获得三个具有不同“灰度”的分散点。如果有3个以上的分散点,matplotlib会假定它必须是RGB元组,因为长度与数据数组的长度不匹配(3!=4),因此会将其用作恒定的RBG颜色


这已被写成pandas Github上的错误报告。

虽然这是一条有用的信息,但它并没有回答如何解决问题的问题。如果你想用seaborn的颜料呢?非常感谢。你打算在GitHub上发布bug报告并提交PR吗?“如果你愿意的话,我可以试着去做。”大卫·罗查特:对不起,忘了提一下。我在pandas github上发布了一个bug报告。在继续之前,我们会看看人们说了些什么。
scatter = ax.scatter(data[x].values, data[y].values, c=c_values,
                     label=label, cmap=cmap, **self.kwds)