如何在 Matlab 中将网格线移动到背景?

How to move grid lines to background in Matlab?

我正在使用 Matlab 绘图。让我们绘制以下两个直方图:

figure;
x = randn(2000,1);
y = 1 + randn(5000,1);
h1 = histogram(x,'FaceAlpha',0.1);
hold on
h2 = histogram(y,'FaceAlpha',0.1);
grid on

网格线并不是真的在背景中。我怎样才能将它们完全移到背景中,以便在条形图顶部看不到网格线?

网格线在背景中,但您可以看到它们,因为绘制的对象具有一定的透明度('FaceAlpha' 小于1)。

为了达到你想要的效果,一个技巧是将每个直方图绘制两次:首先是 'FaceAlpha' 设置为 1'Facecolor' 白色和 'Edgcolor' 相等的版本到'none',覆盖网格线;然后是普通版。

figure;
x = randn(2000,1);
y = 1 + randn(5000,1);
histogram(x,'FaceAlpha',1,'Facecolor','w','Edgecolor','none');
hold on
histogram(y,'FaceAlpha',1,'Facecolor','w','Edgecolor','none');
h1 = histogram(x,'FaceAlpha',0.1);
h2 = histogram(y,'FaceAlpha',0.1);
grid on

网格线有点像在背景中。好吧,几乎:当对象完全不透明时它们会隐藏,当对象完全透明时它们会显示(但不幸的是它们不会像您说的那样显示在对象后面——更像是它们在对象上看起来是禁用的当它不透明时)。

您可以通过创建两个具有相同绘图的轴来欺骗 matlab 来执行您想要的操作,其中前景轴有轴关闭和透明绘图,背景轴有网格线和不透明的白色对象。

示例:(我使用旧语法,因为我的电脑上只有 matlab 2013a)

x = randn(2000,1);
y = 1 + randn(5000,1);
hist(x);
hold on
hist(y);
hs = findobj(gca, 'Type', 'patch')
set(hs(2),'FaceAlpha',0.1)
set(hs(1),'FaceAlpha',0.1)
axis off
ax_front = gca;

ax_back = axes;
hist(x);
hold on
hist(y);
hs = findobj(gca, 'Type', 'patch')
set(hs(1), 'faceColor', 'w')
set(hs(2), 'faceColor', 'w')
grid on

axes(ax_front)

或者,您始终可以创建自己的自定义 'gridlines' 函数,以完全控制您的网格线及其在绘图中的位置。