Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
更改Matlab默认的x限制行为_Matlab_Plot_Matlab Figure_Default - Fatal编程技术网

更改Matlab默认的x限制行为

更改Matlab默认的x限制行为,matlab,plot,matlab-figure,default,Matlab,Plot,Matlab Figure,Default,如果我跑 plot(1:1001) Matlab自动将x范围设置为1:1200。我知道存在xlim([11001]),但我不想每次使用plot时都添加这一行 是否有一种方法可以改变Matlab的行为,以便plot在默认情况下将x限制设置为等于数据范围,而不是每次都必须手动执行?(例如,我可以在脚本顶部设置一个标志) 或者,我可以将一个参数传递到plot以实现这一点?Matlab使用内部算法来确定轴刻度的最佳间隔。我怀疑你能操纵它,即使这是可能的,我建议你不要这样做。这样的操作将改变您自己的Ma

如果我跑

plot(1:1001)
Matlab自动将x范围设置为
1:1200
。我知道存在
xlim([11001])
,但我不想每次使用
plot
时都添加这一行

是否有一种方法可以改变Matlab的行为,以便
plot
在默认情况下将x限制设置为等于数据范围,而不是每次都必须手动执行?(例如,我可以在脚本顶部设置一个标志)


或者,我可以将一个参数传递到
plot
以实现这一点?

Matlab使用内部算法来确定轴刻度的最佳间隔。我怀疑你能操纵它,即使这是可能的,我建议你不要这样做。这样的操作将改变您自己的Matlab安装的行为,但是其他使用您的代码的人可能会偶然发现一个不同的轴标签,这可能不符合您的目的

继续手动定义记号,或者将自己的通用逻辑实现到一个单独的函数中,您可以将该函数与脚本一起发布。展示了如何实现一个,可以为您提供一个良好的起点

如果您想让事情变得更简单,请创建
plot
函数的包装器,如下所示:

h = plot_wrapper(true,1:101,1:101);

function varargout = plot_wrapper(fix_limits,varargin)

    han = plot(varargin{:});

    if (fix_limits)
        x = get(han,'XData');
        xlim(gca,[min(x) max(x)]);

        y = get(han,'YData');
        ylim(gca,[min(y) max(y)]);
    end

    if (nargout)
        varargout{1} = han;
    end

end
h = plot(1:1001); % h is a line object
h.Parent.XLim = [min(h.XData) max(h.XData)]; % set x-axis limits as per the line data
您希望x轴限制与数据紧密匹配。如果您不介意y轴也有这种行为,您可以简单地使用

plot(1:1001)
axis tight

轴紧
将轴限制设置为数据范围


如果希望仅将x轴拧紧,可以按如下方式手动执行

h = plot_wrapper(true,1:101,1:101);

function varargout = plot_wrapper(fix_limits,varargin)

    han = plot(varargin{:});

    if (fix_limits)
        x = get(han,'XData');
        xlim(gca,[min(x) max(x)]);

        y = get(han,'YData');
        ylim(gca,[min(y) max(y)]);
    end

    if (nargout)
        varargout{1} = han;
    end

end
h = plot(1:1001); % h is a line object
h.Parent.XLim = [min(h.XData) max(h.XData)]; % set x-axis limits as per the line data
请注意,第二行使用的是R2014b。对于较旧的Matlab版本,请使用
set
/
get


或者,您可以通过将轴的看似未记录的
'XLimSpec'
属性设置为
'tight'
自动执行

plot(1:1001)
set(gca, 'XLimSpec', 'tight')
至少在R2017a中,
axis-tight
内部就是这样做的(对于x、y和z轴)。

您可以为轴设置

set(0,'defaultAxesXLimSpec', 'tight')
然后,当您打印时,它将为每个新打印使用X轴紧设置

关闭并重新启动Matlab后,这将恢复正常。但是,您可以将其添加到启动脚本中,以便始终应用它


这满足了您的一些要求,我看到您在评论中提到不要使用包装器,尽量减少在调用
plot

后运行额外命令。我没有考虑更改Matlab的内部结构,我更多考虑的是在脚本顶部设置一个标志,或者我可以直接传递到
绘图
中的标志。我将更新问题以反映这一点。好的,谢谢更新。实际上,我的答案仍然提供了一个很好的解决方案,它包括创建plot函数的包装器,您可以在其中添加一个参数,即您的标志,它告诉脚本是否必须更改限制。我会更新我的代码给你看。好的,回答编辑。告诉我这对你来说是否是一个好的解决方案。谢谢你的更新+1是一个高质量的答案,但我不会将其标记为已解决,因为它更多的是一种变通方法,而不是解决方案。我希望删除额外的代码行,但这并不是真的,使用它意味着在我的所有项目中拖出一个额外的绘图包装器,这会降低可读性。