Seaborn 散点图的“色调”颜色不正确

eli*_*iss 4 python scatter matplotlib hue seaborn

我在为散点图标记着色时遇到一些问题。我有一个简单的数据框,其中包含值“pos”和其他两个值“af_min”和“af_max”。我想根据 af_x 和 af_y 的某些条件为标记着色,但由于我没有任何列可用作色调,因此我创建了自己的列“颜色”。

       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
Run Code Online (Sandbox Code Playgroud)

现在,我使用seaborn和seaborn调色板创建一个散点图:

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

但结果如下:如您所见,一种色调不会着色,因为只有两种颜色:蓝色和红色。尝试使用 hsv 调色板

现在发生了一些非常奇怪的事情:为了解决这个问题,我构建了自己的调色板广告将其添加到seaborn istance中。但是散点图不是用我选择的色调进行着色,而是用我前段时间在另一个脚本中使用的一些颜色进行着色,并且无法更改它们。这是情节:使用个人调色板进行分散 这是代码:

           #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)
Run Code Online (Sandbox Code Playgroud)

我在这里放置了整个脚本,以便您可以复制它:

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")
Run Code Online (Sandbox Code Playgroud)

感谢任何可以提供帮助的人!

Joh*_*anC 7

第一个示例的问题在于hsv调色板在其开头和结尾处具有相同的颜色。这是因为“hsv”中的“h”是一个循环变量,从 0 到 360 度。Matplotlib 默认使用 3 种颜色,在颜色范围内均匀分布,因此从开始使用红色,从中心使用青色,从末尾再次使用红色。所以,hsv在这种情况下,这不是最合适的配色方案。请参阅matplotlib 的可用颜色图seaborn 的扩展

\n

HSV 调色板:\nHSV调色板

\n

对于第二个示例,sns.set_palette()设置 matplotlib 的颜色循环,但 seaborn 本身并不总是使用它。当给定数字色调时,seaborn 默认会选择rocket颜色图。从文档中:

\n
\n

色调(以及较小程度上的大小)\n语义的默认处理(如果存在)取决于该变量是否被推断为 \n表示 \xe2\x80\x9cnumeric\xe2\x80\x9d 或 \xe2\x80\x9ccategorical \xe2\x80\x9d 数据。特别是,数字变量默认使用顺序颜色图表示,并且图例条目显示常规的 xe2x80x9cticksxe2x80x9d 以及数据中可能存在或不存在的值。

\n
\n

使用自定义调色板的最简单方法是直接将其提供给函数(无需调用,sns.color_palette()因为seaborn调色板内部只是颜色列表):

\n
colors = [\'#747FE3\', \'#8EE35D\', \'#E37346\']\nsns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", palette=colors, s=40)\n
Run Code Online (Sandbox Code Playgroud)\n

sns.scatterplot 具有自定义颜色

\n

PS:当色调是绝对的时set_palette使用。scatterplot这是一个例子。我还添加了为所选行设置值的首选方法;这对于大型数据框很重要。请注意,这里对数组进行布尔运算需要相当多的括号。

\n
afMin = 0.1\nafMax = 0.9\n\ndf[\'color\'] = ""\nafx = df["af_x"]\nafy = df["af_y"]\ndf.loc[((afx >= afMin) & (afx <= afMax) & ((afy < afMin) | (afy > afMax))), "color"] = "a"\ndf.loc[((afy >= afMin) & (afy <= afMax) & ((afx < afMin) | (afx > afMax))), "color"] = "b"\ndf.loc[((afy >= afMin) & (afy <= afMax) & (afx >= afMin) & (afx <= afMax)), "color"] = "c"\n\ncolors = [\'#747FE3\', \'#8EE35D\', \'#E37346\']\nsns.set_palette(sns.color_palette(colors))\n\nsns.scatterplot(data=df, x="af_x", y="af_y", hue="color", s=40)\n
Run Code Online (Sandbox Code Playgroud)\n