Python 为seaborn散点图中的不同类别设置不同的透明度值

Python 为seaborn散点图中的不同类别设置不同的透明度值,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,这个问题与我在这里发布的一篇文章有关。我的seaborn散点图代码如下所示: import matplotlib.pyplot as plt import pandas as pd import seaborn as sns df = pd.DataFrame() df['First PCA dimension'] = [1,2,3,4] df['Second PCA dimension'] = [0,5,5,7] df['Third PCA dimension'] = [1,2,6,4] d

这个问题与我在这里发布的一篇文章有关。我的seaborn散点图代码如下所示:

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

df = pd.DataFrame()
df['First PCA dimension'] = [1,2,3,4]
df['Second PCA dimension'] = [0,5,5,7]
df['Third PCA dimension'] = [1,2,6,4]
df['Data points'] = [1,2,3,4]

plt.figure(figsize=(42,30))
plt.title('2-D PCA of my data points',fontsize=32)

colors = ["#FF9926", "#2ACD37","#FF9926", "#FF0800"]
b = sns.scatterplot(x="First PCA dimension", y="Second PCA dimension", hue="Data points", palette=sns.color_palette(colors), data=df, legend="full", alpha=0.3)
sns.set_context("paper", rc={"font.size":48,"axes.titlesize":48,"axes.labelsize":48})

b.set_ylabel('mylabely', size=54)
b.set_xlabel('mylabelx', size=54)
b.set_xticklabels([1,2,3,4,5,6,7,8], fontsize = 36)

lgnd = plt.legend(fontsize='22')
for handle in lgnd.legendHandles:
    handle.set_sizes([26.0])

plt.show()

alpha值为0.3时,将为散射图中的每个点设置透明度值。但是,我希望每个数据点有一个不同的透明度值(基于它所属的类别)。这是否可以通过提供一个alpha值列表来实现,类似于我在上述示例中提供颜色列表的方式?

如评论中所述,这是您使用的
seaborn
实现的

但是,您可以通过使用标记的关键颜色来破解它,并使用
PathCollection.get\u facecolor()
PathCollection.set\u facecolor()
使用RGBA颜色替换这些颜色

例如,我需要一个
swarmlot
violinplot
之上,在不同的不透明度上有一些点。要将灰色变为透明黑色(我需要做的),我们可以:

seaborn.violinplot(...)
points = seaborn.swarmplot(...)

for c in points.collections:
    if not isinstance(c, PathCollection):
        continue
    fc = c.get_facecolor()
    if fc.shape[1] == 4:
        for i, r in enumerate(fc):
            # change mid-grey to 50% black
            if numpy.array_equiv(r, array([0.5, 0.5, 0.5, 1])):
                fc[i] = array([0, 0, 0, 0.5])
            # change white to transparent
            elif numpy.array_equiv(r, array([1, 1, 1, 1])):
                fc[i] = array([0, 0, 0, 0])
        c.set_facecolor(fc)

非常糟糕,但它为我提供了一张单张图片所需的功能。

在指定颜色时只需使用alpha,例如
“35; FF992644”
。似乎seaborn中至少有两个bug。一是调色板截断了alpha,二是散点图忽略了alpha。也许不值得追踪,可以直接使用matplotlib。第一个bug很容易看到,只需
打印(sns.color_调色板([(1,1,1,0)])
并观察alpha是如何丢失的。使用matplotlib,它将是
plt.scatter(x=“第一PCA维度”,y=“第二PCA维度”,c=“数据点”,cmap=matplotlib.colors.ListedColormap(colors),Data=df)
谢谢。这似乎奏效了。我还将发布一个问题,让seaborn开发人员了解这个bug。如果你想把你的评论放在一个答案中,我会很高兴地投票并接受它。所以第一个错误是,第二个错误是