我在做一张海运热图。我使用的是'viridis'
,但我稍微修改了一下,使一些值获得特定的颜色。在我的MWE中,.set_over
用于将90以上的值设置为'black'
,.set_under
用于将10以下的值设置为'white'
。我还屏蔽了部分热图。一切正常。
如何将中间范围值20Map到'orange'
,而不影响当前颜色条的外观?如您所见,.set_over
和.set_under
不会更改颜色条的外观。
import matplotlib
import seaborn as sns
import numpy as np
np.random.seed(7)
A = np.random.randint(0,100, size=(20,20))
mask_array = np.zeros((20, 20), dtype=bool)
mask_array[:, :5] = True
cmap = matplotlib.colormaps["viridis"]
# Set the under color to white
cmap.set_under("white")
# Set the voer color to white
cmap.set_over("black")
# Set the background color
g = sns.heatmap(A, vmin=10, vmax=90, cmap=cmap, mask=mask_array)
# Set color of masked region
g.set_facecolor('lightgrey')
Map value to specific color in seaborn heatmap我看过,但我不确定如何用它来解决我的问题。
4条答案
按热度按时间zaq34kh61#
考虑以下几点:
样品结果:
下面的代码(附加到上面的脚本中)将使颜色条具有可见的轮廓。
带大纲的示例结果:
要遮罩热图的颜色,但不显示更新的颜色条,请设置
cbar=False
,然后附加自定义颜色条,如Standalone colorbar所示。fnvucqvd2#
从this answer中提取,这里有一个使用遮罩而不是自定义颜色条的解决方案:
knpiaxh13#
mask_array
,如果数组仅为int
,则掩码为A == 20
,如果数组为float
,则掩码为20 <= A < 21
。matplotlib.colors.Colormap
仅提供3种设置颜色的方法。set_under
set_over
set_bad
-设置已用于mask_array
**的掩码值的颜色。with_extremes
-将三者合并。cmap = mpl.colormaps['viridis'].with_extremes(bad='orange', under='w', over='k')
导入和样本数据
1.不显示切片列
mask
2.显示所有列
cmap
,并添加自定义颜色条。mask
,或数组中的任何np.nan
值,都用set_bad
着色。vmin
和vmax
,则不会获得正确的值,因为这些选项会更改颜色条的范围。3.让列和坏值共享颜色
57hvy0tb4#
创建自定义颜色Mapmatplotlib.colors.LinearSegmentedColormap.from_list .当使用连续颜色Map(如“viridis”)时,这里没有一种直接方法来将特定值(如20)设置为特定颜色(如橙子)。