Seaborn颜色调色板作为Matplotlib的调色板。

62

Seaborn提供了一个名为color_palette的函数,它允许您轻松创建用于绘图的新调色板。

colors = ["#67E568","#257F27","#08420D","#FFF000","#FFB62B","#E56124","#E53E30","#7F2353","#F911FF","#9F8CA6"]

color_palette = sns.color_palette(colors)

我希望将color_palette转化为一个可以在matplotlib中使用的cmap,但是我不知道如何实现。

遗憾的是,像"cubehelix_palette"、"light_palette"等函数都有一个"as_cmap"参数,而"color_palette"没有,不幸的是。

5个回答

59

您需要将Seaborn调色板中的颜色列表转换为Matplotlib的颜色映射(感谢@RafaelLopes提出的更改):

import seaborn as sns
import matplotlib.pylab as plt
import numpy as np
from matplotlib.colors import ListedColormap

# construct cmap
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
my_cmap = ListedColormap(sns.color_palette(flatui).as_hex())

N = 500
data1 = np.random.randn(N)
data2 = np.random.randn(N)
colors = np.linspace(0,1,N)
plt.scatter(data1, data2, c=colors, cmap=my_cmap)
plt.colorbar()
plt.show()

输入图片描述


2
如果我错了,请纠正我,但这似乎不是将seaborn color_palette转换为matplotlib cmap的转换,而是关于如何使用matplotlib创建colormap的另一种解决方案。 如果我从您的代码中删除 sns.set_palette(flatui) 什么都不会改变。尽管如此,感谢您展示这个matplotlib功能。 - Dremet
4
这个答案从功能上来说是正确的,但请不要使用离散的颜色集来映射连续变化的数据,这样会非常误导。 - mwaskom
3
基于@Corrumpo的回答,您可以使用cmap = ListedColormap(sns.color_palette().as_hex())进行编码。 - RafaelLopes
@RafaelLopes 谢谢您的评论!这非常有帮助,可以直接在 matplotlib 中使用几乎所有 seaborn 调色板! :) - chAlexey
1
请注意,此答案从颜色列表创建了一个matplotlib colormap。这里完全没有必要使用seaborn,上面的代码可以完全不使用seaborn来完成。似乎此答案的原始版本实际上就是这样做的,使用my_cmap = ListedColormap(flatui) - ImportanceOfBeingErnest

42

Seaborn大多数生成调色板的方法都有一个可选参数as_cmap,默认值为False。您可以使用它直接获取Matplotlib调色板:

大多数Seaborn方法来生成颜色调色板都有一个可选的参数as_cmap,默认为False。您可以使用它来直接获取Matplotlib的颜色映射:

import seaborn as sns
import matplotlib.pylab as plt
import numpy as np

# construct cmap
my_cmap = sns.light_palette("Navy", as_cmap=True)

N = 500
data1 = np.random.randn(N)
data2 = np.random.randn(N)
colors = np.linspace(0,1,N)
plt.scatter(data1, data2, c=colors, cmap=my_cmap)
plt.colorbar()
plt.show()

输入图像描述信息


30

第一个答案在某种程度上是正确的,但过长且包含大量不必要的信息。正确而简短的答案是:

将任何 sns.color_palette() 转换为 matplotlib 兼容的 cmap 需要两行代码

from matplotlib.colors import ListedColormap
cmap = ListedColormap(sns.color_palette())

3
相反的情况呢?是否有类似的代码可以将matplotlib的colormap(如[0.0,'rgb(30,136,229)'][0.01,'rgb(30,135,228)']等)转换为与seaborn兼容的调色板? - Kristada673

12

仅提供一个额外的提示 - 如果想要连续的色条/调色板,将所需的颜色数从Seaborn的颜色方案中增加256会非常有帮助。

cmap = ListedColormap(sns.color_palette("Spectral",256))   

1
Pandas绘图(即matplotlib绘图)需要使用ListedColormap来定义颜色列表。如果它们是使用as_cmap=True参数创建的seaborn调色板,则可以直接使用它们。
创建一个样本数据集。
import pandas
import seaborn
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
df = pandas.DataFrame({'x':range(0,30), 'y':range(10,40)})
df.set_index('x', inplace=True)
df["z"] = 39
df["a"] = 10

使用一个简单的颜色列表来绘制3个数据框列(这不需要seaborn)。
df.plot(colormap=ListedColormap(["red","green","orange"]), figsize=(3,3))
plt.show()

plot illustrating a change in palette

使用带有as_cmap=True参数定义的seaborn调色板:
palette = seaborn.color_palette("rocket_r", as_cmap=True)
df.plot(colormap=palette, figsize=(3,3))
plt.show()

enter image description here

感谢Serenity、Generic Wevers和Ramon Crehuet的回答。

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