seaborn husl 或 hsl 调色板不工作:保持默认的黑白颜色
seaborn husl or hsl color palette is not working: remains default black and white colors
我需要一个圆形颜色图,遇到了 this answer,它描述了使用 seaborn 导入 husl 系统。我试图复制示例演示的简单用法,但我无法让我的图像以彩色显示。它总是以黑白显示(seaborn 默认调色板)。我在 ipython 中工作,但不在 ipython 笔记本中工作。 (一些 seaborn 函数只在 ipython notebook 中工作——我需要一个不依赖于它的答案。)特别是 python 2.7.3,ipython 1.1.0.
MWE:
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)
显示:
seamap = mpl.colors.ListedColormap(sns.color_palette("husl"))
imshow(im,cmap=seamap)
链接的答案也适用于我;显然 imshow 不是上下文意识的, ax.plot 是。
另一个答案是(接近)正确的解决方案,但它可能有助于理解为什么会发生这种情况。 sns.set_palette
并在 with
语句中使用 sns.color_palette
控制 matplotlib color cycle, (mpl.rcParams["axes.color_cycle"]
),用于设置绘图样式使用 plt.plot
.
时的元素
相比之下,imshow
有一个默认的colormap,这两者都是不同种类的对象(一个是颜色列表,另一个是连续映射从标量变量到颜色)并具有不同的默认设置(mpl.rcParams["image.cmap"]
)。
正如@cphlewis 指出的那样,您可以使用 sns.color_palette
返回的颜色列表来制作颜色图对象,但我不会那样做。你可以看到为什么如果你在图中添加一个颜色条:
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()
这里你只是制作了一个有 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()
我需要一个圆形颜色图,遇到了 this answer,它描述了使用 seaborn 导入 husl 系统。我试图复制示例演示的简单用法,但我无法让我的图像以彩色显示。它总是以黑白显示(seaborn 默认调色板)。我在 ipython 中工作,但不在 ipython 笔记本中工作。 (一些 seaborn 函数只在 ipython notebook 中工作——我需要一个不依赖于它的答案。)特别是 python 2.7.3,ipython 1.1.0.
MWE:
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)
显示:
seamap = mpl.colors.ListedColormap(sns.color_palette("husl"))
imshow(im,cmap=seamap)
链接的答案也适用于我;显然 imshow 不是上下文意识的, ax.plot 是。
另一个答案是(接近)正确的解决方案,但它可能有助于理解为什么会发生这种情况。 sns.set_palette
并在 with
语句中使用 sns.color_palette
控制 matplotlib color cycle, (mpl.rcParams["axes.color_cycle"]
),用于设置绘图样式使用 plt.plot
.
相比之下,imshow
有一个默认的colormap,这两者都是不同种类的对象(一个是颜色列表,另一个是连续映射从标量变量到颜色)并具有不同的默认设置(mpl.rcParams["image.cmap"]
)。
正如@cphlewis 指出的那样,您可以使用 sns.color_palette
返回的颜色列表来制作颜色图对象,但我不会那样做。你可以看到为什么如果你在图中添加一个颜色条:
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()
这里你只是制作了一个有 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()