python – 如何用更强的对比度为表面着色

前端之家收集整理的这篇文章主要介绍了python – 如何用更强的对比度为表面着色前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Matlab中,我试图用以下代码在2维欧几里德空间上绘制函数
s=.05;
x=[-2:s:2+s];
y=[-1:s:3+s];
[X,Y]=meshgrid(x,y);
Z=(1.-X).^2 + 100.*(Y-X.*X).^2;
surf(X,Y,Z)
colormap jet

这是我的情节:

我希望用更强的对比度为表面着色,就像Wikipedia所示

Wikipedia中的绘图是使用Python代码绘制的:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = Axes3D(fig,azim = -128,elev = 43)
s = .05
X = np.arange(-2,2.+s,s)
Y = np.arange(-1,3.+s,s)
X,Y = np.meshgrid(X,Y)
Z = (1.-X)**2 + 100.*(Y-X*X)**2
ax.plot_surface(X,Z,rstride = 1,cstride = 1,norm = LogNorm(),cmap = cm.jet)

plt.xlabel("x")
plt.ylabel("y")

plt.show()

我的Matlab代码和维基百科Python代码似乎都使用“jet”作为colormap,但它们的高度值与颜色的实际映射是不同的.所以我想知道如何在Matlab中获得类似的着色?

感谢致敬!

解决方法

您可以通过以下方式实现类似的外观

>将曲面对象的'EdgeColor' property设置为“无”以删除边缘着色.
>修改曲面的'CData' property以模仿Python代码中的log-scaling of the color data.

以下是修改代码方法

s = .05;
x = [-2:s:2+s];
y = [-1:s:3+s];
[X,Y] = meshgrid(x,y);
Z = (1.-X).^2 + 100.*(Y-X.*X).^2;
minZ = min(Z(:));  % Find minimum value of Z
maxZ = max(Z(:));  % Find maximum value of Z
C = minZ+(maxZ-minZ).*log(1+Z-minZ)./log(1+maxZ-minZ);  % Create a log-scaled
                                                        %   set of color data
surf(X,C,'EdgeColor','none');
colormap jet

这是由此产生的情节:

对数缩放如何工作……

用于产生颜色数据C的对数缩放的Z数据使得喷射颜色图的红橙色范围被更多的表面点使用,从而改善了该特定表面的对比度.通过这个简单的例子可以看到它的工作方式:

x = 0:5:100;        % Create a range of values from 0 to 100
plot(x,x,'b-*');  % Plot the values as a straight line (y = x) in blue
hold on;            % Add to the plot
plot(x,100.*log(1+x)./log(101),'r-*');  % Plot a log-scaled version of x in red
colorbar            % Display the default jet color map,for comparison

原始蓝点均匀分布在右侧颜色条中对应的颜色范围内.对数缩放时,这些点向上移动到红线.请注意,这会导致较低的蓝绿色范围内的点密度降低,以及红橙色范围内的点密度增加.

一般情况下获得更好的对比

对于此处使用的特定曲面,颜色数据的对数缩放有助于在曲面上的所有点上使用更大范围的颜色映射.由于在较低高度(即颜色指数)值处存在许多点,因此对数比例将这些低点扩展得更多以在表面的大槽中使用更宽范围的颜色.

但是,如果要通过更好地使用颜色贴图的范围来改善任意曲面的对比度,则日志缩放并不总是有效.可能更好的一般解决方案是按升序对表面的所有高度值进行排序,然后将这些值映射到跨越整个颜色映射的线性范围.如果您为上述表面执行此操作,您将获得以下内容

C = Z;
[~,index] = sort(C(:));
C(index) = 1:numel(index);
h = surf(X,'none');
colormap jet
caxis([1 numel(index)]);

这通常应该提供比C = Z默认表面着色更好的对比度.

原文链接:https://www.f2er.com/python/241889.html

猜你在找的Python相关文章