是否可以在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中将图例输入行分为两部分的主要内容,如果未能解决你的问题,请参考以下文章