matplotlib 中 3D 等高线图的非线性颜色图 python
Nonlinear colourmaps for 3D contour plots in matplotlib python
嗨,我有一组数据需要在 3d 中绘制。
我为此使用了 matplotlibs plot_surface,因为我的一些数据价值很大,而大部分数据价值很小。
即最大峰值 0.7 与下一个最大峰值 0.15 相比。
所以我需要使用某种非线性色图,否则小细节会被完全掩盖。
所以我尝试了以下非线性色图创建 source:
class nlcmap(object):
def __init__(self, cmap, levels):
self.cmap = cmap #original colourmap
self.N = cmap.N
self.levels = numpy.asarray(levels, dtype='float64')
self._x = self.levels
self.levmax = self.levels.max()
self._y = numpy.linspace(0.0, self.levmax, len(self.levels))
def __call__(self, xi, alpha=1.0, **kw):
yi = numpy.interp(xi, self._x, self._y)
return self.cmap(yi / self.levmax, alpha)
为 3d 等高线图创建自定义颜色图:
ThreeD_spectrum_figure = matplotlib.pyplot.figure()
ThreeD_spectrum_axis = ThreeD_spectrum_figure.add_subplot(111, projection="3d")
colourmap_levels = [0,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.15,1]
cmap_lin = matplotlib.pyplot.cm.gray
cmap_nonlin = nlcmap(cmap_lin, colourmap_levels)
ThreeD_spectrum_axis.plot_surface(X,Y,Z, rstride=5, cstride=5, cmap=matplotlib.pyplot.cm.gray, linewidth=0, antialiased=True)
但我收到错误:
"raise ValueError("无法识别颜色图 %s" % name)
ValueError:颜色映射 <main.nlcmap object at 0x06E81AF0> 无法识别
好吧,这个自定义颜色图无法正常识别,但我真的不想去更改 matplotlib 代码来强制它接受这个颜色图。
是否有任何其他方法可以获得曲面图的非线性颜色映射?
编辑:
使用标准化和预先存在的颜色图解决了我最初的问题,
但是后来我留下了一个具有很少离散级别的 3d 等高线图。
创建自定义颜色图或使用预先存在的颜色图给我带来了水平离散化问题。
我可以使用标准化:
matplotlib.colors.Normalize(vmin=numpy.amin(Z), vmax=0.05)
在使用灰色颜色图时将非常大的数据值强制为例如白色。
然后剩余的数据点仅使用 6 个离散化级别进行着色,而我至少需要 ~20 个才能使数据清晰。
有什么方法可以更改 3d 等高线图的离散化级别数?
我想你需要创建一个 ColorMap
的实例。
这里有几种可能性。
您可以创建一个新地图,例如更改 gamma
cmap = matplotlib.colors.LinearSegmentedColormap('my_cmap', dictionary, N=256, gamma=1.0)
或使用 [ (value, color), (value,color) ]
列表:
matplotlib.colors.from_list(name, colors, N=256, gamma=1.0)
或使用内置标量映射
cm = matplotlib.cm.ScalarMappable( ... )
使用您自己的 Normalize
函数。
我想这样地图就可以识别了。
嗨,我有一组数据需要在 3d 中绘制。
我为此使用了 matplotlibs plot_surface,因为我的一些数据价值很大,而大部分数据价值很小。 即最大峰值 0.7 与下一个最大峰值 0.15 相比。 所以我需要使用某种非线性色图,否则小细节会被完全掩盖。
所以我尝试了以下非线性色图创建 source:
class nlcmap(object):
def __init__(self, cmap, levels):
self.cmap = cmap #original colourmap
self.N = cmap.N
self.levels = numpy.asarray(levels, dtype='float64')
self._x = self.levels
self.levmax = self.levels.max()
self._y = numpy.linspace(0.0, self.levmax, len(self.levels))
def __call__(self, xi, alpha=1.0, **kw):
yi = numpy.interp(xi, self._x, self._y)
return self.cmap(yi / self.levmax, alpha)
为 3d 等高线图创建自定义颜色图:
ThreeD_spectrum_figure = matplotlib.pyplot.figure()
ThreeD_spectrum_axis = ThreeD_spectrum_figure.add_subplot(111, projection="3d")
colourmap_levels = [0,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.15,1]
cmap_lin = matplotlib.pyplot.cm.gray
cmap_nonlin = nlcmap(cmap_lin, colourmap_levels)
ThreeD_spectrum_axis.plot_surface(X,Y,Z, rstride=5, cstride=5, cmap=matplotlib.pyplot.cm.gray, linewidth=0, antialiased=True)
但我收到错误: "raise ValueError("无法识别颜色图 %s" % name) ValueError:颜色映射 <main.nlcmap object at 0x06E81AF0> 无法识别
好吧,这个自定义颜色图无法正常识别,但我真的不想去更改 matplotlib 代码来强制它接受这个颜色图。
是否有任何其他方法可以获得曲面图的非线性颜色映射?
编辑:
使用标准化和预先存在的颜色图解决了我最初的问题, 但是后来我留下了一个具有很少离散级别的 3d 等高线图。 创建自定义颜色图或使用预先存在的颜色图给我带来了水平离散化问题。 我可以使用标准化:
matplotlib.colors.Normalize(vmin=numpy.amin(Z), vmax=0.05)
在使用灰色颜色图时将非常大的数据值强制为例如白色。 然后剩余的数据点仅使用 6 个离散化级别进行着色,而我至少需要 ~20 个才能使数据清晰。
有什么方法可以更改 3d 等高线图的离散化级别数?
我想你需要创建一个 ColorMap
的实例。
这里有几种可能性。
您可以创建一个新地图,例如更改 gamma
cmap = matplotlib.colors.LinearSegmentedColormap('my_cmap', dictionary, N=256, gamma=1.0)
或使用 [ (value, color), (value,color) ]
列表:
matplotlib.colors.from_list(name, colors, N=256, gamma=1.0)
或使用内置标量映射
cm = matplotlib.cm.ScalarMappable( ... )
使用您自己的 Normalize
函数。
我想这样地图就可以识别了。