是否可以在Matlab中将图例输入行分为两部分

时间:2017-04-13 14:30:30

标签: matlab plot matlab-figure legend legend-properties

我想知道是否可以将线条与图例条目分成两种不同类型的线条。

示例:假设您有4条曲线:纯黑色,纯红色,黑色虚线,红色虚线。黑色曲线描述黑色现象,红色曲线描述红色现象。实线确定我们是否添加除固体之外的其他贡献,虚线表示我们添加一些虚线贡献。在我的情节传说中,我只想要两个条目:黑色现象或红色现象。但我希望每个条目的图例线分为两部分:前半部分是实体,下半部分是虚线。以同样的方式,是否可以反过来做(一半是纯黑色,另一半是纯红色,另一半是半黑色,半红色)。

对于4条曲线,这没有多大意义。但是我有时候必须放6条或8条曲线,而传说太大了,无法将它放在图中的某个位置......

目前我使用此行添加我的图例: legend({str1,str2},'Interpreter','latex') 但是我不知道说这是否相关。

我发布了一张图片来说明我想要的内容(注意它可能是另一种方式,一行代替两种颜色而不是两种颜色):enter image description here

2 个答案:

答案 0 :(得分:0)

它并不完全符合您的要求,但它是另一种方法:

styles = {'-','--'};
colors = {'r','g','b'};
colorNames = {'red','green','blue'};
styleNames = {'normal','dashed'};
hold on
% plot many lines
for ii = 1:numel(styles)
    for jj = 1:numel(colors)
        plot((1:10) + jj + ii*numel(colors),'Color',colors{jj},'LineStyle',styles{ii})
    end
end
% generate handles for the legend
h = [];
for ii = numel(colors):-1:1
    h(numel(styles)+ ii) = plot(0,0,'Color',colors{ii},'LineStyle','-');
end
for ii = numel(styles):-1:1
    h(ii) = plot(0,0,'Color','k','LineStyle',styles{ii});
end
hold off
legend(h,[styleNames colorNames]);

enter image description here

答案 1 :(得分:0)

没有内置的能力为Matlab传奇做到这一点。您可以通过手动绘制线条来实现类似的功能。这使用annotation arrow功能作为数字:

% plot some dummy data (not connected to the manual legend!
x = linspace(-1,1);
clf; hold on; grid on
% Set up linestyles and linecolors here so that they can be (at least
% slightly) linked between the plot and the manual legend.
linestyles = {'-', '--'};
linecolors = {'k', 'r'};
% plots
plot(x,x.^2,'linestyle',linestyles{1},'color',linecolors{1}); 
plot(x,x.^3,'linestyle',linestyles{1},'color',linecolors{2});    
plot(x,x.^4,'linestyle',linestyles{2},'color',linecolors{1}); 
plot(x,x.^5,'linestyle',linestyles{2},'color',linecolors{2});
% scale the plot within the figure to leave room for legend
plotsize = [0.06, 0.20, 0.9, 0.75];
set(gca,'position', plotsize)
% x and y are original positions for the lines
x = 0.4; y = 0.1;
% dx and dy are length and vertical spacing of lines respectively
dx = 0.1; dy = 0.05;

% The main event: drawing (headless) text arrows, so that one of them can have 
% a string properly which is your legend entry label. Use x,y,dx,dy for positioning
annotation('textarrow', [x,x+dx], [y,y], ...
    'linestyle', linestyles{1}, 'color', linecolors{1}, 'textcolor', 'k', 'headstyle', 'none', ...
    'string', 'Even functions ')
annotation('textarrow', [x+dx + 0.005,x+2*dx + 0.005], [y,y], ...
    'linestyle', linestyles{2}, 'color', linecolors{1}, 'textcolor', 'k', 'headstyle', 'none')
annotation('textarrow', [x,x+dx], [y-dy,y-dy], ...
    'linestyle', linestyles{1}, 'color', linecolors{2}, 'textcolor', 'k', 'headstyle', 'none', ...
    'string', 'Odd functions ')
annotation('textarrow', [x+dx + 0.005,x+2*dx + 0.005], [y-dy,y-dy], ...
    'linestyle', linestyles{2}, 'color', linecolors{2}, 'textcolor', 'k', 'headstyle', 'none')

结果:

plot

请注意,定位是使用标准化(0到1之间)值完成的,因此它们会随图形一起拉伸。如果您的绘图具有固定大小,则可以更容易地进行像素处理,这可以通过在调整大小时更改各种图形对象的units参数来完成(请参阅上面链接的注释箭头文档)。