Seaborn的HUSL或HSL颜色调色板无法正常工作:仍然是默认的黑白颜色。

3
我需要一个环形配色图,看到这个答案描述了使用seaborn导入husl系统的方法。我试图复制例子中的简单用法,但是我的图片无法显示颜色。它总是以黑白方式显示(seaborn默认配色方案)。我正在使用ipython,但不在ipython笔记本中。(一些seaborn函数仅适用于ipython notebook -- 我需要的答案不依赖于此。)具体的环境是python 2.7.3,ipython 1.1.0。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

fig = plt.figure()

im = np.random.random((100, 100))
with sns.color_palette("husl", 8):
    plt.imshow(im)

Displays:

http://imgur.com/AC98hmp

2个回答

9
另一个答案(接近正确),但了解为什么会发生这种情况可能会更有帮助。使用“sns.set_palette”和在“with”语句中使用“sns.color_palette”控制matplotlib的颜色循环,(mpl.rcParams["axes.color_cycle"]),在使用plt.plot时用于样式化绘图元素。
相比之下,“imshow”具有默认的“colormap”,它是不同类型的对象(一个是颜色列表,另一个是从标量变量到颜色的连续映射)并且具有不同的默认设置(mpl.rcParams["image.cmap"])。
如@cphlewis所指出的那样,您可以使用由“sns.color_palette”返回的颜色列表来创建一个colormap对象,但我不会完全那样做。如果将colorbar添加到绘图中,则可以看到原因:
import numpy as np
from scipy.ndimage import gaussian_filter
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt

sns.set_style("dark")

img = np.random.normal(size=(100, 100))
img = gaussian_filter(img, 3, 2)

cmap1 = mpl.colors.ListedColormap(sns.color_palette("husl"))

plt.figure()
plt.imshow(img, cmap=cmap1)
plt.colorbar()

enter image description here

在这里,您仅使用6个唯一值来创建一个色图,这将导致数据中丢失许多高频信息。最好使用更多的颜色,256是一个好数字:

cmap2 = mpl.colors.ListedColormap(sns.color_palette("husl", 256))

plt.figure()
plt.imshow(img, cmap=cmap2)
plt.colorbar()

输入图像描述

您可能还想直接使用sns.husl_palette函数,以便可以控制循环开始的位置以及用于亮度和饱和度的级别:

cmap3 = mpl.colors.ListedColormap(sns.husl_palette(256, .33, .85, .6))

plt.figure()
plt.imshow(img, cmap=cmap3)
plt.colorbar()

enter image description here


seaborn的color_palette()可以调用_entry_和_exit_作为上下文使用,是吗?一个包括mpl.rcParams["image.cmap"]但目前没有的上下文?(很棒的演示。具有讽刺意味的是,离散的色条对我来说非常有用,可以突出数据特征。) - cphlewis
1
当然,您可以使用上下文管理器设置默认的 cmap -- 最简单的方法是使用 matplotlib 的 rc_context 函数,但您也可以使用 seaborn 的 axes_style 颜色管理器,因为 image.cmap 在那里定义 -- 但是 seaborn 的颜色调色板和颜色映射是具有不同目的的对象,因此在 color_palette 中这样做是没有意义的。 - mwaskom
1
另外,由于imshow需要一个cmap关键字参数,因此使用上下文管理器而不是直接将色图传递给函数会过于复杂,因此不符合Pythonic的风格。 - mwaskom
我不知道rc_context!太好了。 - cphlewis

4
seamap = mpl.colors.ListedColormap(sns.color_palette("husl"))

imshow(im,cmap=seamap)

enter image description here

链接的答案对我也适用;显然imshow不考虑上下文,而ax.plot则考虑。


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