Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何给对比度更强的表面上色_Python_Matlab_Plot - Fatal编程技术网

Python 如何给对比度更强的表面上色

Python 如何给对比度更强的表面上色,python,matlab,plot,Python,Matlab,Plot,在Matlab中,我试图用以下代码在二维欧几里德空间上绘制一个函数 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中的绘图使用Python代码绘制: from mpl_toolkits.mplot3d import Axes3D fr

在Matlab中,我试图用以下代码在二维欧几里德空间上绘制一个函数

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中的绘图使用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, Y, Z, rstride = 1, cstride = 1, norm = LogNorm(), cmap = cm.jet)

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

plt.show()
我的Matlab代码和wikipediapython代码似乎都使用“jet”作为颜色映射,但它们的高度值到颜色的实际映射是不同的。所以我想知道如何在Matlab中得到类似的颜色


谢谢和问候

您可以通过以下方式获得相似的外观:

  • 将曲面对象的颜色设置为
    'none'
    以删除边着色
  • 在Python代码中修改曲面的形状以模拟曲面的形状
以下是如何修改代码:

s=.05;
x=[-2:s:2+s];
y=[-1:s:3+s];
[X,Y]=网格网格(X,Y);
Z=(1.-X)。^2+100.*(Y-X.*X)。^2;
minZ=min(Z(:);%求Z的最小值
maxZ=max(Z(:);%求Z的最大值
C=minZ+(maxZ-minZ)。*log(1+Z-minZ)。/log(1+maxZ-minZ);%创建一个按比例缩放的日志
%颜色数据集
surf(X,Y,Z,C,'EdgeColor','none');
彩色喷流
下面是结果图:


日志缩放是如何工作的。。。 用于生成颜色数据
C
的对数缩放
Z
数据导致更多曲面点使用jet颜色贴图的红橙色范围,从而提高此特定曲面的对比度。通过以下简单示例,可以直观地了解其工作方式:

x=0:5:100;%创建一个从0到100的值范围
绘图(x,x,'b-*');%将值绘制为蓝色的直线(y=x)
等一下;%添加到绘图中
绘图(x100.*log(1+x)。/log(101),'r-*');%以红色绘制x的对数比例版本
colorbar%显示默认的jet颜色贴图,以供比较

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


总的来说,对比度更好。。。 对于此处使用的特定曲面,颜色数据的日志缩放有助于在曲面上的所有点上使用更大范围的颜色贴图。由于在较低的高度(即颜色指数)值处有许多点,因此对数缩放会将这些低点扩展得更广,以便在曲面的大槽中使用更宽的颜色范围

但是,如果希望通过更好地利用颜色贴图的范围来提高任意曲面的对比度,则日志缩放并不总是有效的。一个更好的通用解决方案是按升序对曲面的所有高度值进行排序,然后将这些值映射到跨越整个颜色贴图的线性范围。如果你在地表以上进行此操作,你会得到以下结果:

C=Z;
[~,索引]=sort(C(:);
C(指数)=1:numel(指数);
h=表面(X,Y,Z,C,'边缘颜色','无');
彩色喷流
caxis([1努美尔(指数)]);


这通常应该比默认的表面着色提供更好的对比度。

直接从colormap的帮助页面:

“颜色”文件夹中的文件会生成许多颜色贴图。每个文件都接受colormap大小作为参数。比如说,

彩色地图(hsv(128)) 创建具有128种颜色的hsv颜色贴图。如果未指定大小,将创建与当前颜色贴图大小相同的颜色贴图


我已使用此功能更改颜色范围,以便更好地利用可用光谱。

@gnovice:谢谢!我想知道从Matlab脚本中的高度数据Z中获取颜色数据C的基本原理是什么?你怎么知道它是Python脚本中用于颜色规格化的呢?@Tim:使用MATLAB(这似乎与Python相同),默认情况下,将使用Z数据中的值绘制三维曲面,以确定曲面的颜色。如果不希望使用此默认颜色,则可以提供自己的颜色数据,可以是高度数据Z的缩放版本,甚至是缩放版本。Python似乎为您提供了在调用
plot\u surface
时应用规范化函数的选项,而您必须自己在MATLAB中将其应用于数据。@gnovice:谢谢!我想知道为什么“C=maxZ.*log(1+Z)。/log(1+maxZ);”可以使颜色具有强烈的对比度?你怎么知道这是Python脚本中“norm=LogNorm()”所使用的方式?@Tim:我不知道Python中的
LogNorm
是如何做到的,但一般来说,如果你取一个大于1的数字范围的日志,那么较大的数字比较小的数字缩小的幅度要大得多。例如,
log(10)=2.3026
log(1000)=6.9078
。这意味着Z值越大,C中的值就越小,当用作jet colormap中的索引时,会导致红橙色范围被拉长很多。您可以通过执行
surf(X,Y,C)将其可视化并注意到较大值的下降速度要慢得多。@gnovice:谢谢!因此,当使用C中的值而不是Z中的值作为jet colormap的索引时,索引不是变得更接近了,它们索引的颜色也更接近了吗?为什么效果正好相反,颜色会分散开来?