您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

5b51 2022/1/14 8:22:10 python 字数 5079 阅读 530 来源 www.jb51.cc/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中的绘图是使用P

概述

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认表面着色更好的对比度.

总结

以上是编程之家为你收集整理的python – 如何用更强的对比度为表面着色全部内容,希望文章能够帮你解决python – 如何用更强的对比度为表面着色所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶