Matlab:子图到.eps轴大小

时间:2013-06-19 19:29:23

标签: matlab latex save subplot

在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 filenames{f} method{m} '_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个图,其中标记了一些坐标。在乳胶中我加载文件如下:

\documentclass{article}
\usepackage{graphicx,epstopdf}
\begin{document}
    \begin{figure}[H]
        \centering
        \includegraphics[width=1\linewidth]{test.eps}
        \caption{Caption}
        \label{fig:label}
    \end{figure}
\end{document}

2 个答案:

答案 0 :(得分:2)

我不知道类似于状态的函数,例如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] );

答案 1 :(得分:1)

问题

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

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