在Seaborn中使用调色板作为颜色映射

7
这可能是关于色图和调色板的误解,但我想使用一个在seaborn中不可用的色图来为我的分组数据集着色。我尝试直接使用palettable和cmocean,但会收到TypeError错误信息:
'LinearSegmentedColormap'对象不可迭代
使用Seaborn中可用的任何调色板都可以正常工作,但我需要一个不会变成白色的调色板,因为这会在图表中产生奇怪的“条纹”。我有一个包含3列数字数据的数据框,添加了一个颜色使用的bin列用于绘制图表。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import cmocean

cmap=cmocean.cm.balance
cpal=sns.color_palette(cmap,n_colors=64,desat=0.2)

plt.style.use("seaborn-dark")
ax = sns.stripplot(x='Data', y='Dimension', data=dfBalance, jitter=0.15, edgecolor='none', alpha=0.4, size=4, hue='bin', palette=cpal)
sns.despine()
ax.legend_.remove()
plt.show()
1个回答

7
Seaborn在使用.color_palette时不能接受Colormap实例作为输入。您可以参考官方文档中的说明,输入参数应为matplotlib的cmap名称、颜色列表等格式。由于cmocean在matplotlib中注册其colormap时使用"cmo."前缀,因此您需要这样操作:
import seaborn as sns
import cmocean

cpal = sns.color_palette("cmo.balance", n_colors=64, desat=0.2)

如果你有自己创建或从其他包中获取的自定义颜色映射,请自行注册。
import seaborn as sns
import matplotlib.cm
import matplotlib.colors

cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["brown", "pink", "limegreen"])
matplotlib.cm.register_cmap("mycolormap", cmap)
cpal = sns.color_palette("mycolormap", n_colors=64, desat=0.2)

这似乎是有效的,但是图现在以某种方式变成了灰度? - Chrisvdberge
很不幸,但是我手头的信息无法解决这个问题。不过,如果您能提供一个问题的最小化完整可复现示例 [mcve],那就随时欢迎。 - ImportanceOfBeingErnest
我已经编辑了问题,包括生成所包含的图形的完整代码。 - Chrisvdberge
1
你可能想使用 desat=1 而不是 desat=0 来查看颜色? - ImportanceOfBeingErnest
糟糕!我太蠢了..将帖子编辑回初始状态,以避免对未来参考造成困惑;谢谢。 - Chrisvdberge
其实,我完全理解你的想法。完全饱和度应该显示颜色,完全去饱和度的颜色会失去它们的颜色信息。将饱和度设置为1相当于去饱和度=0。然而,seaborn在某种程度上使用了不同的推理方式。或者desat中的“de”表示其他含义。谁知道呢。 - ImportanceOfBeingErnest

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