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

Posted

技术标签:

【中文标题】是否可以在Matlab中将图例输入行分为两部分【英文标题】:Is it possible to separate the legend entry line into two parts in Matlab 【发布时间】:2017-09-09 17:42:24 【问题描述】:

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

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

对于 4 条曲线,这没有多大意义。但有时我必须放置 6 或 8 条曲线,然后图例太大而无法将其放在图中的某个位置......

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

我发布一张图片来说明我想要什么(请注意,它可能是另一种方式,一条线有两种样式而不是两种颜色):

【问题讨论】:

【参考方案1】:

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

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',colorsjj,'LineStyle',stylesii)
    end
end
% generate handles for the legend
h = [];
for ii = numel(colors):-1:1
    h(numel(styles)+ ii) = plot(0,0,'Color',colorsii,'LineStyle','-');
end
for ii = numel(styles):-1:1
    h(ii) = plot(0,0,'Color','k','LineStyle',stylesii);
end
hold off
legend(h,[styleNames colorNames]);

【讨论】:

【参考方案2】:

对于 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',linestyles1,'color',linecolors1); 
plot(x,x.^3,'linestyle',linestyles1,'color',linecolors2);    
plot(x,x.^4,'linestyle',linestyles2,'color',linecolors1); 
plot(x,x.^5,'linestyle',linestyles2,'color',linecolors2);
% 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', linestyles1, 'color', linecolors1, 'textcolor', 'k', 'headstyle', 'none', ...
    'string', 'Even functions ')
annotation('textarrow', [x+dx + 0.005,x+2*dx + 0.005], [y,y], ...
    'linestyle', linestyles2, 'color', linecolors1, 'textcolor', 'k', 'headstyle', 'none')
annotation('textarrow', [x,x+dx], [y-dy,y-dy], ...
    'linestyle', linestyles1, 'color', linecolors2, 'textcolor', 'k', 'headstyle', 'none', ...
    'string', 'Odd functions ')
annotation('textarrow', [x+dx + 0.005,x+2*dx + 0.005], [y-dy,y-dy], ...
    'linestyle', linestyles2, 'color', linecolors2, 'textcolor', 'k', 'headstyle', 'none')

结果:

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

【讨论】:

有没有办法知道图例本身的属性?例如,图例中绘制的线条的大小,图例的周围框与线条本身之间的空间,......这样的事情,这样我至少可以得到一个位置来绘制像你这样的注释做过。我自己找不到,但我想我对 matlab 有太多不了解的地方,所以一定有办法找到这些参数。 总之,我不这么认为。

以上是关于是否可以在Matlab中将图例输入行分为两部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中将图例条目强制为 10 的幂

matlab中如何调整legend的位置?

基于caffe与MATLAB接口的回归分析与可视化

matlab怎么在图上添加图例

如何在matlab中将L*a*b*转换为灰度

如何在绘图本身中添加 Matlab 中的图例元素