另一个答案是(接近)正确的解决方案,但了解为什么会发生这种情况可能会有所帮助。 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 返回的颜色列表来制作颜色图对象,但我不会那样做。如果您在绘图中添加颜色条,您可以了解原因:
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()