【问题标题】:Secondary axes get displaced when resizing figure调整图形大小时,辅助轴会移位
【发布时间】:2018-08-21 16:18:36
【问题描述】:

我正在尝试在图的底部和顶部绘制一个带有两个 X 轴的 Matlab (R2017a) 图(填充轮廓 + 颜色条),具有相同的比例,但刻度线和标签不同。按照herehere 的建议,我已经实现了,但是当我尝试手动调整图形窗口大小或打印设置某些与默认比例不同的比例时,例如:

set(gcf,'PaperUnits','centimeters','PaperPosition',[0 0 30 15])
print(gcf,'-dpng',path,'-r300')

新轴被移位:

我已经用 Matlab 中的 peaks 示例数据重现了我的问题:

contourf(peaks)
ax1=gca;
colorbar
set(ax1,'box','off','color','none') % get rid of the box in order not to have duplicated tick marks
ax1_pos = ax1.Position; % position of first axes
ax2 = axes('Position',ax1_pos,... % set the new pair of axes
    'XAxisLocation','top',...
    'YAxisLocation','Right',...
    'Color','none');
set(ax2, 'XLim', get(ax1, 'XLim'), 'YLim', get(ax1, 'YLim')); % set same limits as for ax1
set(ax2, 'XTick', 0:14:42, 'XTickLabels', {'a','a','a','a'},... % set new tick marks and labels for the top X axis.
    'YTick', get(ax1, 'YTick'), 'YTickLabels', []);

奇怪的是,如果我删除 colobar 命令并仅绘制填充轮廓,则该图形的行为正确:

有谁知道为什么会发生这种情况(以及如何解决)?我也愿意通过其他方式实现两个 X 轴绘图。

【问题讨论】:

  • 我一般建议export_fig保存。 MATLAB 的函数非常糟糕。
  • @AnderBiguri 嗨,安德,感谢您的提示,但我所描述的行为在手动调整图形窗口大小时也会发生(我将编辑帖子以澄清这一点)所以我很害怕在使用export_fig() 导出之前设置我想要的高度/宽度比例不起作用。
  • 非常奇怪的是,当我使用您的最小示例时,我得到的图看起来完全没问题。您是否尝试过将调整大小命令尽可能上移(尽快使用)?
  • @FlorisSA 尝试在提供 MCVE OP 后手动调整图形大小

标签: matlab resize matlab-figure axis colorbar


【解决方案1】:

您的问题是一个轴有一个颜色条而另一个没有,即使您将一个颜色条添加到两个轴上,也可能会发生很多自动的事情,这些事情会以不同的方式调整您的轴的大小。

但是,我们可以添加一个事件监听器并定义一个函数来操作使两个轴相同。侦听器将确保它捕获事件(调整大小)并调用我们定义的函数。这是我为此编写的代码:

%% this creates the listener for change of size in the figure
f = figure('SizeChangedFcn',@(src,evn) fixaxis(src));
%% this is your code
contourf(peaks)
ax1=gca;
colorbar
set(ax1,'box','off','color','none') % get rid of the box in order not to have duplicated tick marks
ax1_pos = ax1.Position; % position of first axes
ax2 = axes('Position',ax1_pos,... % set the new pair of axes
    'XAxisLocation','top',...
    'YAxisLocation','Right',...
    'Color','none');
set(ax2, 'XLim', get(ax1, 'XLim'), 'YLim', get(ax1, 'YLim')); % set same limits as for ax1
set(ax2, 'XTick', 0:14:42, 'XTickLabels', {'a','a','a','a'},... % set new tick marks and labels for the top X axis.
    'YTick', get(ax1, 'YTick'), 'YTickLabels', []);

%% this will resize the axis if 2 of them exist
function fixaxis(src)
  ax=findall(src,'Type','Axes');
  if length(ax)==2
  ax(2).Position=ax(1).Position;
  end
end

【讨论】:

  • 有效!我不知道这可以做到。我会尝试从中学习。非常非常感谢您的帮助(并为我的延迟回答道歉)。
  • @Markel 不用担心。是的,这根本不是使用 MATLAB 的标准方式;)
【解决方案2】:

也尝试将'PaperPositionMode' 设置为'auto'

set(gcf,'PaperUnits','centimeters','PaperPosition', [0 0 30 15], 'PaperPositionMode', 'auto');
% then print
print(gcf, '-dpng', 'myFile', '-r300')

以上命令对我有用。产生以下结果:

【讨论】:

  • 我担心这不是我想要的。设置'PaperPositionMode', 'auto' 确实会产生您显示的结果,但会覆盖之前的'PaperPosition', [0 0 30 15],理想情况下,我想要一个具有一定比例的图形,而不是方形,因为我要绘制的实际数据主要分布在X 轴。
猜你喜欢
  • 2016-04-13
  • 2014-04-03
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多