Matlab 着色面与着色面之间的打印边差异
我有一个关于用颜色条绘制2D地图的问题。在我的应用程序中,我有一个地图大小等于258x98的数据 如果我用surf和Matlab 着色面与着色面之间的打印边差异,matlab,plot,Matlab,Plot,我有一个关于用颜色条绘制2D地图的问题。在我的应用程序中,我有一个地图大小等于258x98的数据 如果我用surf和着色interp绘制这些数据,一切都很好 但如果我用着色面绘制它们,则地图上部水平部分的不同行似乎丢失了 上边框最初不是像着色interp中那样的红色版本 我找到了谈论这个问题的人;它可能来自shading faceted默认行为 有人能确认打印时缺少行吗?我如何修复它,以便所有边界数据都使用着色面绘制 MCVE 我试图用一个简单的例子来重现这个问题。下面是一个简单的Matla
着色interp
绘制这些数据,一切都很好
但如果我用着色面绘制它们,则地图上部水平部分的不同行似乎丢失了
上边框最初不是像着色interp中那样的红色代码>版本
我找到了谈论这个问题的人;它可能来自shading faceted
默认行为
有人能确认打印时缺少行吗?我如何修复它,以便所有边界数据都使用着色面绘制
MCVE
我试图用一个简单的例子来重现这个问题。下面是一个简单的Matlab脚本:
x_dim=256;
y_dim=96;
[X Y]=meshgrid(0:x_dim+1,0:y_dim+1);
Z = abs(X-x_dim/2).*abs(Y-y_dim/2);
Z(1:5,:)=x_dim*y_dim/2;
Z(end-4:end,:)=x_dim*y_dim/2;
surf(X,Y,Z);
view([0,0,1]);
hc=colorbar;
set(hc,'position',[0.932 0.3 0.02 0.6]);
xlim([0 x_dim+1]);
ylim([0 y_dim+1]);
xlabel('x domain');
ylabel('y domain');
%shading interp;
以及带有着色面的图形(默认选项):
您可以看到上面的红色矩形比下面的矩形厚。具有着色界面代码>如下所示,差异不太明显,可能会重现我的问题,即问题的第一部分
带有着色interp的图形代码>
我做的第一件事是放大以查看特写时的渲染效果
图形顶部的缩放
您可以看到的是,您看到的颜色出血发生在网格线之间。Z的值以整数间隔定义。插值渲染中的扩展红色发生在整数网格线之间的间隔内
刻面版本显示整个间隔的一个值,那么它选择哪个值呢?较低或较高整数网格线处的值?使用数据光标或通过检查矩阵值(即显示(Z(93,1))
),我们可以看到刻面的颜色由下边缘的值决定
确认此行为:
着色平面
每个网格线段和面都有一个恒定的颜色
由线段端点处的颜色值或
具有最小索引的面角
着色面
叠加黑色网格线的平面着色。
这是默认的着色模式
因此,与平面着色一样,面着色从具有最小索引或网格线的面端点处的颜色值开始
作为
shading interp
通过以下方式改变每个线段和面中的颜色
跨直线内插颜色贴图索引或真彩色值
或者脸
这就是为什么在着色面设置中,图形底部有一个更宽的红色带,因为较低的索引网格线决定了面的颜色
图形底部的缩放
由于这是有据可查的,着色面
的预期行为。要获得所需的渲染效果,您必须跳出框框进行思考
解决方案1:imagesc
如果您只想绘制曲面的顶部(视图([0,0,1]
),请使用imagesc(Z)
。这将以像素的形式绘制Z中的每个元素,而不是将像素放在Z元素之间。整体外观类似于着色面
,但索引会移到像素的中间。例如
[X, Y] = meshgrid(0:2, 0:2);
Z = magic(3);
figure;
colormap('jet');
subplot(1, 3 ,1);
imagesc(Z);
axis xy
yticklabels({'0', '1', '2'})
yticks(1:3)
xticklabels({'0', '1', '2'})
xticks(1:3)
title('imagesc(Z)');
subplot(1,3,2);
surf(X, Y, Z);
shading faceted;
view([0,0,1]);
yticks(0:3)
xticks(0:3)
title('surf(X, Y, Z); shading faceted;');
subplot(1,3,3);
surf(X, Y, Z);
shading interp;
view([0,0,1]);
yticks(0:3)
xticks(0:3)
title('surf(X, Y, Z); shading interp;');
您可以看到,使用imagesc
从“鸟瞰视图透视图”渲染边缘值比使用shading faceted
更好
老实说,从其他角度来看,着色interp
更直观。这是与上面旋转相同的曲面
您可以看到,通过着色interp
,高点和低点的颜色更直观
解决方案2:添加另一行和列
如果出于某种原因确实需要使用shading Faced
。您可以通过向数据中添加另一行和列来欺骗可视化。从顶部看,它将按照您想要的方式显示。警告:这将更改曲面的形状
首先将X、Y轴网放大,并复制Z轴的最后一行和最后一列
[X_extend, Y_extend] = meshgrid(0:3, 0:3);
Z_extend = [Z, Z(:, end);];
Z_extend = [Z_extend; Z_extend(end, :)];
这是明暗处理的切面
图,从上方和稍微旋转
上面的视图是我们想要的,但在旋转视图中,曲面发生了变化。此旋转与前一张图片中的旋转类似,但您可以看到复制行和列的形状通过在该侧的每一条边上添加矩形面改变了曲面的边
仅当边缘的3D形状对确认此行为不重要时,才使用此方法。有必要进行验证。您应该尝试使用玩具数据再现此效果,并将生成玩具数据图形的代码作为编辑添加到此帖子中,然后我们才能帮助您。-@Cecilia您可以获得更多信息在我的更新1中,请使用另一个colormap T.T-@Ander Biguri你是说colorbar的其他限制吗?我真的不想下载并打开一个随机数据文件。你能使用toy Z数据重现相同的结果吗,例如,Z=abs(Y-50)
?那么,在绘图时,使两个水平红色条具有相同宽度的解决方案是什么?@youpilat13我添加了两种可能的解决方案。
[X, Y] = meshgrid(0:2, 0:2);
Z = magic(3);
figure;
colormap('jet');
subplot(1, 3 ,1);
imagesc(Z);
axis xy
yticklabels({'0', '1', '2'})
yticks(1:3)
xticklabels({'0', '1', '2'})
xticks(1:3)
title('imagesc(Z)');
subplot(1,3,2);
surf(X, Y, Z);
shading faceted;
view([0,0,1]);
yticks(0:3)
xticks(0:3)
title('surf(X, Y, Z); shading faceted;');
subplot(1,3,3);
surf(X, Y, Z);
shading interp;
view([0,0,1]);
yticks(0:3)
xticks(0:3)
title('surf(X, Y, Z); shading interp;');
[X_extend, Y_extend] = meshgrid(0:3, 0:3);
Z_extend = [Z, Z(:, end);];
Z_extend = [Z_extend; Z_extend(end, :)];