Matlab:.eps轴大小的子图[关闭]

Posted

技术标签:

【中文标题】Matlab:.eps轴大小的子图[关闭]【英文标题】:Matlab: subplot to .eps axis size [closed] 【发布时间】:2013-06-19 19:29:22 【问题描述】:

在 Matlab 中,我有两个要包含在乳胶文档中的图。我可以使用以下代码更改每个单独绘图的大小和其他所有内容:

set(1, 'units', 'centimeters', 'position', [0 0 10 8]);
set(get(gca,'xlabel'),'string','cutoff','fontsize',14,'fontname','Bitstream Vera Serif');
set(get(gca,'ylabel'),'string','F-score','fontsize',14,'fontname','Bitstream Vera Serif');
set(gca,'fontsize',14,'fontname','Bitstream Vera Serif');
print(1,'-depsc','-r300',[dir_name filenamesf methodm '_comb']);

这会将我的绘图保存到正确大小的 .eps 文件中,并在乳胶中以正确大小完美加载。但是,我希望在保持轴大小的同时将两个图都放在子图中。上面的代码不起作用,因为打印的子图似乎忽略了轴的大小,并且在乳胶中总是以相同的大小显示(不管我为轴设置的数字有多大,都没有关系)。

如何确保 Matlab 以正确的尺寸打印子图?也许值得注意:子图的大小在生成图时确实会在屏幕上发生变化,但乳胶会忽略这一点,即使在不使用子图时它也能正常工作。

--编辑--

经过一番折腾,我能够为我拥有的代码提供一个最小的工作示例。

X1 = sort(rand(30,1));
Y1 = sort(rand(30,1));

X2 = sort(rand(30,1));
Y2 = sort(rand(30,1));

subplot(2,1,1)
 plot(X1,Y1,'gs','LineWidth',0.5,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',2)
axis([0 1 0 1]);
highX = X1(:,1)>=0.8;
for K = 1 : size(X1,1)
    if highX(K) == 1
        line(X1(K,1),Y1(K,1),'color',[.5 .5 .5],'marker','o','linestyle','none','markersize',9,'MarkerEdgeColor','k');
    end
end
set(1, 'units', 'centimeters', 'position', [2 2 15 15]);

subplot(2,1,2)
plot(X2,Y2,'gs','LineWidth',0.5,'MarkerEdgeColor','k','MarkerFaceColor','g','MarkerSize',2)
axis([0 1 0 1]);
highX = X2(:,1)>=0.8;
for K = 1 : size(X2,1)
    if highX(K) == 1
        line(X2(K,1),Y2(K,1),'color',[.3 .5 .7],'marker','o','linestyle','none','markersize',9,'MarkerEdgeColor','k');
    end
end
set(1, 'units', 'centimeters', 'position', [2 2 15 15]);

print(1,'-depsc','-r300','test');

这会产生 2 个标有一些坐标的图。在乳胶中,我像这样加载文件:

\documentclassarticle
\usepackagegraphicx,epstopdf
\begindocument
    \beginfigure[H]
        \centering
        \includegraphics[width=1\linewidth]test.eps
        \captionCaption
        \labelfig:label
    \endfigure
\enddocument

【问题讨论】:

您提供的代码不足以重现您的问题,更不用说部分不相关(当问题出在轴上时,为什么要包含标签膨胀)。 @OlegKomarov 因为准确地重现问题需要超过 500 行代码。您真正需要的唯一东西是带有绘图的图形窗口。即使像y=x 这样的情节也足够了。 这正是我的要求,提供一个最小的工作示例来重现您的问题,而不是 500 行代码。我应该能够复制粘贴代码并查看问题所在。相反,我想知道您的意思(和其他许多人一样)。 我不能给出一个最小的工作示例,因为我的情节包含很多不同的东西;我有一个从矩阵(X 和 Y)构建的基本绘图,其中一些坐标(基于某些条件)必须通过在原始绘图顶部添加一个线图来标记,该线图在坐标周围创建一个圆圈。不知道如何给出一个最小的例子,除了包括整个矩阵。 一个最小的工作示例(MWE)应该重现问题而不是情节。如果您对轴有疑问,请创建一个仅包含轴设置的示例。通常,创建 MWE 的工作可以准确地找出问题所在,从而找到解决方案并提高对语言的理解。 【参考方案1】:

我不知道诸如 plot 或 subplot 之类的状态函数来执行您所要求的操作,但是,如果您愿意直接使用数据对象,那么您可以直接对轴进行更改对象。就个人而言,我认为经过一些练习后,您可以通过直接操作它们获得更好的结果。

Axis 对象是图形的一部分,它处理在大多数人通常使用的函数的背景中绘制绘图的工作,例如 plotscatter。当我需要按照您的要求执行操作时,我会执行以下操作。

% Get the image objects
f = figure();
a1 = axes('Parent', f);
a2 = axes('Parent',f);

% Use builtins to make the plots
plot(a1, [1:10]);
plot(a2, [1:10], [1:5,4:-1:1]);

% I think that it is best to add labels and titles here too
% That way you can make sure that everything fits correctly

% Make everything fit
% Position is [left, bottom, width, height]
set( a1, 'units', 'centimeters', 'position', [1, 1,10, 8] );
set( a2, 'units', 'centimeters', 'position', [1,10,10, 8] );
set(  f, 'units', 'centimeters', 'position', [0, 0,12,19] );

【讨论】:

我了解您想要做什么以及它为什么有效。我无法完全按照我想要的方式获取所有内容,但它确实在乳胶中正确显示。【参考方案2】:

问题

如果图形包含子图,则在使用print() 打印到 .eps 时不会保留图形的大小,除非您指定:

set(gcf, 'PaperPositionMode','auto')

【讨论】:

以上是关于Matlab:.eps轴大小的子图[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中绘制一个有很多子图的大图

MATLAB如何画两个子图共用一个Y轴标签?

具有不同颜色图matlab的子图

如何将 R Plotly 中的子图之间的轨迹与共享的 Y 轴链接起来,以便 hoverinfo 出现在两者上?

DBSCAN 参数迭代的子图

如何在 matplotlib 子图图像轴之间强制相同大小