Seaborn散点图无法正确着色'hue'。

3

我在为散点图标记着色方面遇到了一些问题。我有一个简单的数据框,其中包含一个值“pos”和另外两个值“af_min”和“af_max”。 我想根据af_x和af_y的某些条件来着色标记,但由于我没有利用作为hue的任何列,所以我创建了自己的列“color”。

       pos      af_x      af_y  color 
0  3671023  0.200000  0.333333    2.0
1  4492071  0.176471  0.333333    2.0
2  4492302  0.222222  0.285714    2.0
3  4525905  0.298246  0.234043    2.0
4  4520905  0.003334  0.234043    1.0
5  4520905  0.400098  0.000221    0.0
6  4520905  0.001134  0.714043    1.0
7  4520905  0.559008  0.010221    0.0

现在,我用seaborn和一个seaborn调色板创建散点图的方法如下:

sns.scatterplot(data=df, x="af_x", y="af_y", hue="color", palette="hsv", s=40, legend=False)

但结果如下: 可以看到有一个hue没有着色,因为只有两种颜色,蓝色和红色。 Attempt using hsv palette.

现在非常奇怪的事情发生了: 为了绕过这个问题,我构建了自己的调色板并将它添加到seaborn实例中。但是散点图不是用我选择的阴影着色,而是用我之前某个时候在另一个脚本中使用的一些颜色来着色,而且无法更改。这里是绘图: Scatter with personal palette 以下是代码:

           #violet      #green      #orange
 colors = ['#747FE3', '#8EE35D', '#E37346']
 sns.set_palette(sns.color_palette(colors))

 sns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", s=40, legend=False)

以下是整个脚本,您可以复制它:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

lst = [[3671023, 0.200000, 0.333333], [4492071, 0.176471, 0.333333],
      [4492302, 0.222222, 0.285714], [4525905, 0.298246, 0.234043],
      [4520905, 0.003334, 0.234043], [4520905, 0.400098, 0.000221], 
      [4520905, 0.001134, 0.714043], [4520905, 0.559008, 0.010221]
      ]
df = pd.DataFrame(lst, columns =['pos', 'af_x', 'af_y'])

afMin=0.1
afMax=0.9

df['color']=np.nan
for index in df.index:
  afx=df.loc[index, "af_x"]
  afy=df.loc[index, "af_y"]
  if ((afx >= afMin and afx <= afMax) and (afy < afMin or afy > afMax)):
      df.loc[index, "color"] = 0
  elif ((afy >= afMin and afy <= afMax) and (afx < afMin or afx > afMax)):
      df.loc[index, "color"] = 1
  elif ((afy >= afMin and afy <= afMax) and (afx >= afMin or afx <= afMax)):
      df.loc[index, "color"] = 2

sns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", palette = "hsv", s=40, 
legend=False)

plt.savefig("stack_why_hsv.png")

           #violet      #green      #orange
colors = ['#747FE3', '#8EE35D', '#E37346']
sns.set_palette(sns.color_palette(colors))

sns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", s=40, legend=False)
plt.savefig("stack_why_personal.png")

感谢任何能提供帮助的人!

1个回答

6
你的第一个示例存在问题,因为"hsv"中的"h"是一个循环变量,从0度到360度。因此,hsv调色板在其开始和结束处具有相同的颜色。Matplotlib默认使用3种颜色,均匀地分布在颜色范围内,因此从开始处使用红色,从中心处使用青色,再次从结束处使用红色。因此,在这种情况下,hsv不是最适合的颜色方案。请参见matplotlib提供的色图seaborn的扩展hsv调色板 对于您的第二个示例,sns.set_palette() 设置了 matplotlib 的颜色循环,但 seaborn 本身并不总是使用它。当给出数值色调时,seaborn 默认选择 rocket 色图。来自 文档

如果存在语义(尤其是大小),则色调的默认处理方式取决于变量是否被推断为表示“数字”或“分类”数据。特别地,数字变量默认使用顺序色图表示,并且图例条目显示具有可能存在于数据中的常规“刻度”值。

使用自定义调色板的最简单方法是直接将其提供给函数(无需调用 sns.color_palette(),因为 seaborn 调色板在内部只是颜色列表):
colors = ['#747FE3', '#8EE35D', '#E37346']
sns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", palette=colors, s=40)

sns.scatterplot with custom colors

PS: set_palette 在 hue 为分类变量时被 scatterplot 使用。这里有一个示例。我还添加了 设置选定行的首选方法,对于大型数据框架来说非常重要。请注意,数组上的布尔运算在此需要相当多的括号。

afMin = 0.1
afMax = 0.9

df['color'] = ""
afx = df["af_x"]
afy = df["af_y"]
df.loc[((afx >= afMin) & (afx <= afMax) & ((afy < afMin) | (afy > afMax))), "color"] = "a"
df.loc[((afy >= afMin) & (afy <= afMax) & ((afx < afMin) | (afx > afMax))), "color"] = "b"
df.loc[((afy >= afMin) & (afy <= afMax) & (afx >= afMin) & (afx <= afMax)), "color"] = "c"

colors = ['#747FE3', '#8EE35D', '#E37346']
sns.set_palette(sns.color_palette(colors))

sns.scatterplot(data=df, x="af_x", y="af_y", hue="color", s=40)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接