Matlab - 使用补丁突出显示特定间隔

Matlab - highlight a specific interval using patch

我想突出显示情节中的特定间隔。我找到了一种使用补丁对象的方法。 问题是每当我使用它时,我的布局都会变得混乱。

这是一个情节示例:

x = 1:0.05:25;
plot(x,sin(x)+sin(100*x)/3);
xlabel('x axis');
ylabel('y axis');
title('\Omega \Delta test');
legend('sin \Sigma')

并突出显示句点:

yl = ylim;
patch([5 5 10 10],[yl(1) yl(2) yl(2) yl(1)],'k',...
    'facecolor',[.4 .6 .4],'edgecolor',[.4 .6 .4],...
    'facealpha',0.3,'edgealpha',0.3)

我使用和不使用补丁命令的结果:

正常:

凌乱:

查看字体和图例块。关于如何解决这个问题的任何想法?

有没有更好的方法来突出显示间隔?我需要选择颜色和设置透明度。

还有一个问题:如果没有应用第三个输入(颜色),为什么我必须使用它?

提前致谢!

(注意:此答案仅在您使用 OpenGL 渲染器时才有意义。)

如果是这样,那么这就是

的症状之一

a bug in MATLAB 6.5 (R13) and later versions in the way that axes are rendered in hardware accelerated OpenGL, when transparency is used

如前所述here

最简单的解决方法是在软件模式下强制 OpenGL 运行,方法是包含以下行:

opengl software

Apparently, this only works under Windows and Linux. For other symptoms of the problem and different approaches to solutions have a look at this related question.

关于您的其他问题:

不确定这是否是更好的方法,但这是另一种选择:您可以使用这样的 area-plot:

opengl software
figure

x = 1:0.05:25;
ax = plot(x,sin(x)+sin(100*x)/3);

hold on
basevalue = -2;
areaAx = area([5,10],[2,2], basevalue);
set(areaAx, 'FaceColor', [.4 .6 .4])
alpha = get(areaAx, 'Children');
%make area plot transparent
set(alpha, 'FaceAlpha', 0.5);
set(areaAx, 'EdgeColor', 'none');

xlabel('x axis');
ylabel('y axis');
title('\Omega \Delta test');
legend('sin \Sigma')

xlim('auto')
ylim('auto')
hold off

但是,OpenGL 渲染器也会在这里引起问题,所以这不是修复,只是另一种选择。

最后,我不确定您所说的未使用颜色是什么意思。 'facecolor' 被使用,这就是为什么你的情节是绿色的。当您逐步完成上面的 area-选项时,您会看到您首先获得纯色。稍后,使用 'facealpha' 选项添加透明度。

编辑: 此答案仅对 2014b 之前的 Matlab 版本有效,因为非常有用的 erasemode 属性 已被删除来自更高版本 Matlab 上的所有 HG2 图形对象。


我 运行 无数次陷入这个问题,我不得不学会忍受它。大多数时候我可以接受 OpenGL 渲染器的故障,如果它能给我带来不错的 t运行sparency 效果,但在某些情况下,这是不可接受的。

我在许多应用程序中使用 patch 对象来突出显示间隔,通常是在多条曲线上。当 t运行sparency 不是一个选项时,您可以使用一个技巧,它是补丁对象的 EraseMode 属性。如果你设置 EraseMode 属性 到 'xor' 补丁将不会是 t运行sparent,但是补丁下的任何东西都会 xor 补丁像素颜色所以你仍然可以看到补丁下的曲线。

这不是 t运行sparency 渲染,您可以使用默认的 painter 渲染器并避免 OpenGL.

的所有偶然故障

因此,例如您的数据:

hp = patch([5 5 10 10],[yl(1) yl(2) yl(2) yl(1)],'k',...
    'facecolor','g','edgecolor','g',...
    'erasemode','xor') ;


这个技巧的好处是它适用于单色 display/prints。如果你不能使用多种颜色,你可以只使用一种颜色(例如,如果你计划黑白打印用于出版)

hpx = patch([5 5 10 10],[yl(1) yl(2) yl(2) yl(1)],'b',...
    'facecolor','b','edgecolor','b',...
    'erasemode','xor') ;