仅删除坐标轴线,不影响刻度和刻度标签

9
有没有一种方法可以在Matlab图中仅删除轴线,而不影响刻度和刻度标签。
我知道box可以切换上部和右部的轴线和刻度,这对我来说非常完美。 但我的问题是,我想要消除底部和左侧线(只有线!),同时保留刻度和刻度标签。
有什么诀窍吗?
4个回答

10
Yair Altman的未记录的Matlab演示了一种更清晰的方法,使用未记录的轴标尺来实现:
plot(x,y);
ax1 = gca;
yruler = ax1.YRuler;
yruler.Axle.Visible = 'off';
xruler = ax1.XRuler;
xruler.Axle.Visible = 'off'; %// note you can do different formatting too such as xruler.Axle.LineWidth = 1.5;

这种方法的一个好处是你可以分别格式化x轴和y轴线。

1
谢谢你的回答。对于那些像我一样为了弄清楚带有“bar”的轴的“XRuler”为什么不消失而苦苦挣扎的人们:似乎“bar”有一个必须关闭的“ShowBaseLine”属性。 - Ayberk Özgür

8

Matlab R2014b版本之前的解决方案

您可以引入一个新的白色边框并将其放在最上面。

// example data
x = linspace(-4,4,100);
y = 16 - x.^2;

plot(x,y); hold on
ax1 = gca;
set(ax1,'box','off')  %// here you can basically decide whether you like ticks on
                      %// top and on the right side or not

%// new white bounding box on top
ax2 = axes('Position', get(ax1, 'Position'),'Color','none');
set(ax2,'XTick',[],'YTick',[],'XColor','w','YColor','w','box','on','layer','top')

%// you can plot more afterwards and it doesn't effect the white box.
plot(ax1,x,-y); hold on
ylim(ax1,[-30,30])

重要的是要停用第二个轴的刻度,保留第一个轴的刻度。

enter image description here

Luis Mendo的解决方案中,如果您之后更改轴属性,则绘制的线条将保持固定并保持其初始位置。这里不会发生,它们会根据新的限制进行调整。为每个命令使用正确的句柄,就不会有太多问题。 Dan's solution 更简单,但不适用于R2014b之前的Matlab版本。

我只需要为y轴做这个,感谢Undocumented Matlab提供了一种简洁的方法:https://dev59.com/moPba4cB1Zd3GeqPrmMO#32073460 - Dan
1
@Dan,这太棒了!+1 - 新的图形引擎使一切变得如此简单。我只希望有一天它能被记录下来。 - Robert Seifert
1
@hyiltiz 你认为这值得一个踩吗?尤其是因为我的回答也适用于旧版本的Matlab,而丹的回答则不适用!请先了解一下踩的作用! - Robert Seifert
@hyiltiz "我只是为了让 Dan 的答案得到更多的投票而进行的反对投票" ,但这正是不能这样操作的原因。每个回答都应该独立获得投票,与其他答案无关。如果你认为一个答案很好,就给它点赞;如果你认为它不好,就给它反对票。就我所知,你认为这个答案还不错,虽然有更好的答案,那就给两个答案都点赞吧!而且 OP 不会注意到你的投票,而他作为第一次提问者,可能也不会很快再回来。我真的不在乎得票数,只是不接受你的反对票理由。 - Robert Seifert
1
好的,它们应该独立评估。虽然我仍然认为你的解决方案太复杂了,但它是通用的,并且可以直接应用于任何图形系统,而不需要了解这些图形系统的工作方式(例如,知道一些秘密的未记录功能)。因此,就独立考虑而言,我会给你点赞。感谢你的教育! - hyiltiz
显示剩余2条评论

7

有另一种未记录的方法(适用于MATLAB R2014b及更高版本),可以通过将标尺的'LineStyle'更改为'none'来删除行。

示例:

figure;
plot(1:4,'o-');  %Plotting some data
pause(0.1);      %Just to make sure that the plot is made before the next step
hAxes = gca;     %Axis handle
%Changing 'LineStyle' to 'none'
hAxes.XRuler.Axle.LineStyle = 'none';  
hAxes.YRuler.Axle.LineStyle = 'none';
%Default 'LineStyle': 'solid', Other possibilities: 'dashed', 'dotted', 'dashdot'

output


这与丹的回答不同,后者使用标尺的'visible'属性。


2
您可以通过在轴线上绘制白色线条来“擦除”它们:
plot(1:4,1:4) %// example plot

box off %// remove outer border
hold on
a = axis; %// get axis size
plot([a(1) a(2)],[a(3) a(3)],'w'); %// plot white line over x axis
plot([a(1) a(1)],[a(3) a(4)],'w'); %// plot white line over y axis

结果:

在这里输入图片描述


正如@SardarUsama所指出的,在最近的Matlab版本中,您可能需要调整线宽以覆盖坐标轴:

plot(1:4,1:4) %// example plot

box off %// remove outer border
hold on
a = axis; %// get axis size
plot([a(1) a(2)],[a(3) a(3)],'w', 'linewidth', 1.5); %// plot white line over x axis.
                                                     %// Set width manually
plot([a(1) a(1)],[a(3) a(4)],'w', 'linewidth', 1.5); 

太棒了……我正在搜索属性,但找不到任何方法将网格颜色与轴线分开。 - Hoki
酷点子。向 @Luis Mendo 和 thewaywewalk 致敬。 - Denny Alappatt
1
顺便说一下,@thewaywewalk,你的线条颜色太棒了。能否分享一下用于线图的颜色方案的详细信息? - Denny Alappatt
@DennyAlappatt:阅读此文或等待下一个Matlab版本。;) - Robert Seifert
1
@SardarUsama 谢谢你提醒。我在 R2015b 中得到了与你相同的结果。我回答中的图可能是使用 R2010b 得到的。在 R2015b 中,宽度为 1.5 似乎可以正常工作(尽管这可能取决于系统)。我已经更新了回答。 - Luis Mendo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接