具有色阶和一种颜色的色标表示不需要的值



我想在 3D 中绘制一个包含 3 个变量(相同的最小值、相同的最大值、相同的间距(的网格,我希望网格上的每个点都有特定的颜色根据函数 f 作为这 3 个变量的函数,除非函数的值优于我为其分配另一种颜色的特定阈值。

下面的代码是我到目前为止尝试过的:

from mpl_toolkits.mplot3d import axes3d
import matplotlib.colors
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
import math
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
%matplotlib notebook
x = np.arange(0.001, 0.175, 0.01)
y = np.arange(0.001, 0.175, 0.01)
z = np.arange(0.001, 0.175, 0.01)
X, Y, Z = np.meshgrid(x, y, z)
def function(X,Y,Z):
   '''function of (X,Y,Z) going from 0 to high values'''
   return(f)
f=function(X,Y,Z)
#flatten the f array (I think there is a function to flatten an array but I have seen it to late)
fflat=[]
for l in f:
    for p in l:
        for t in p:
            fflat.append(t) 
#masking high values with the highest interesting value: maxV              
mfflat = ma.masked_greater(fflat, maxV)
mfflat = mfflat.filled(maxV)
#normalizing values and mapping to veridis cmap:
cmap = matplotlib.cm.get_cmap('viridis')
norm = matplotlib.colors.Normalize(vmin=min(mfflat), vmax=maxV) #(vmax=maxV=max(mfflat))
colors = [cmap(norm(value)) for value in mfflat]
#plot
ax.scatter(X, Y, Z, color=colors, s=10, alpha=1)
cax, _ = matplotlib.colorbar.make_axes(ax)
cbar = matplotlib.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm)

问题是现在所有"不需要的高值",即 maxV>值与我的"最大想要值"(即 maxV (具有相同的颜色

......

我希望我所有的"不需要的值"都在我的veridis色阶之外,并赋予它们另一种独特的颜色。

感谢您的帮助!干杯

感谢ImportantOfBeingErnest的回答,我只需要使用: cmap.set_over,这是更正后的代码:

x = np.arange(0.001, 0.175, 0.01)
y = np.arange(0.001, 0.175, 0.01)
z = np.arange(0.001, 0.175, 0.01)
X, Y, Z = np.meshgrid(x, y, z)
def function(X,Y,Z):
   '''function of (X,Y,Z) going from 0 to high values'''
   return(f)
f=function(X,Y,Z)
#flatten the f array (I think there is a function to flatten an array but I have seen it to late)
fflat=[]
for l in f:
    for p in l:
        for t in p:
            fflat.append(t) 
cmap = plt.cm.get_cmap('viridis')
cmap.set_over(color=(0,0,0), alpha=0.5)
norm = matplotlib.colors.Normalize(vmin=minV, vmax=maxV)
colors = [cmap(norm(value)) for value in fflat]
#plot
ax.scatter(X, Y, Z, color=colors, s=10, alpha=1)
cax, _ = matplotlib.colorbar.make_axes(ax)
cbar = matplotlib.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm)

与此同时,我找到了一种解决方法,即有选择地创建"颜色"列表,这当然不如使用cmap.set_over干净:

colors=[]
for value in fflat:
    if minV <= value <= maxV:
        colors.append(cmap(norm(value)))
    else:
        colors.append((255/258,255/258,255/258,0))

最新更新