编者按:该文件被选为MATLAB Central推荐商品
从Matlab 2018a开始,legend()现在支持列,所以函金宝app数将不再维护://www.tatmou.com/help/matlab/ref/legend.html#d117e809522
16年9月8日更新:增加了新的传奇位置(例如东北外)和更好的定位。
用法:
numlines = 5;
numlines r =兰特(10日);
情节(r);
柱状图例(2,cellstr(num2str([1:numlines])),“位置”,“东北外”);
打印:如果你想打印图形,你必须使用命令行打印机(例如export_fig),因为图形中嵌入的File-> print选项会重置图形属性,包括图例
西蒙•海宁(2021)。西蒙赫宁/传奇GitHub (https://github.com/simonhenin/columnlegend)。检索.
它不能工作
从Matlab r2018a开始,Matlab的内置图例功能支持多列图例。金宝app
要了解如何在r2018a之前的Matlab版本中编辑此函数生成的图例的属性,请参阅下面的链接。特别感谢Simon Henin在多列图例方面的领导。
//www.tatmou.com/matlabcentral/answers/499402-legend-properties-of-columnlegend#answer_409211
最后我发现了错误;当图例中有补丁对象时,它不工作。
@Hamdullah
对我来说似乎很好:
图;6)情节(兰德(10日);
传奇();
savefig(“test.fig”);
关
h = openfig(“test.fig”、“可见”);
hleg=findobj(h,'Type','Legend');
str=hleg.String;
柱状图例(3,str);
仅供参考。从Matlab 2018a开始,legend()现在支持列,因此我金宝app将不再维护此代码:
//www.tatmou.com/help/matlab/ref/legend.html#d117e809522
它不能处理图形;它是传奇的延伸而不是分裂……
例子:
h=openfig('3503_rhv.fig','visible');
hleg=findobj(h,'Type','Legend');
str=hleg.String;
柱状图例(3,str);
有人能解决这个问题吗?(这个问题已经被一些用户贴在这里了)
索引超出矩阵维度。
columnlegend错误(第110行)
sheight=顶点_1(2,2)-顶点_1(1,2);
谢谢你!
我建议修复错误
位置=低(变长度输入宗量{i + 1});
正如Sarah Pasternak(2017年11月30日)所指出的,目前不允许将“南方”写成“南方”。
否则,感谢你伟大的屈服。
伟大的助手!但是,在更改填充时,图例框似乎没有正确渲染。
@明选:使用参数“fontname”(应该是小写)
如何更改fontname
你用MatlabR2017B救了我实习生的命^^
嗨,这真是太棒了。但我觉得有个问题。它不能与错误栏一起使用。
这个函数将得到5颗星,唯一的问题是您不能轻易地改变列之间的间距。请问可以添加这个功能吗?
@Simon谢谢你的回复。
我认为“填充”输入只是为了减少条目之间的垂直间距。
实际上,我想减少每个条目中标记和说明文本之间的空间。
这可能吗?
谢谢你!
@宝蕾
有一个“填充”输入选项,允许您在图例元素之间添加一些额外的填充。您可以使用负填充将条目拉近。
它真的很有用!谢谢你,西蒙。
有没有办法减少符号和文本之间的间距和/或列之间的间距?这将是非常有用的,因为大多数人使用这个columnlegend来保存页面布局。
期待您的回复。
@GreenPiece
当传递额外的输入参数时,这似乎是legend函数的一个错误。在<2017a版本中,fontsize不呈现,图例对象的句柄丢失。我建议在调用函数后修改字体大小。喜欢的东西:
地块(兰德(10,5));
[处理,legend_objects] = columnlegend (3, cellstr (num2str ([1:5] ')));
暂停(0.1);%<-注意这里的停顿。需要确保图例已完全渲染
集合(findall(图例对象,'type','text'),'fontsize',20);
希望这有帮助
@西蒙·海宁
我使用的是Matlab 2016a。
@GreenPiece
我似乎无法重现这个问题:
地块(兰德(10,5));
柱状图例(3,cellstr(num2str([1:5]),“位置”,“西南”,“字体大小”,30);
对我来说没问题。你用的是什么版本的MATLAB ?
我认为问题出在这一行:
如果~ isempty (extravars),
[legend_h,object_h,plot_h,text_strings] = legend(str, extrars {:});
例如,如果我设置
legend_h = legend(str, extrars {:},'FontSize',22);
我可以更改字体大小,但如果
[legend_h,object_h,plot_h,text_strings]=legend(str,extravars{:},'FontSize',22);
这是行不通的。你能解释一下原因吗?
@卢卡斯
只需将fontsize作为名称-值参数传递给函数:
l=柱状图例(2,str,'fontsize',18);
你好,西蒙。干得好,但是我觉得字体大小不正常,或者只是我的错……
L = columnlegend(2, str);
l.FontSize = 18;
列将扩大大小,但FontSize并不真正改变..
@马修
您需要从命令行(print('myfigure.png','-dpng')或其他命令行打印机(如export_fig)使用print命令。使用文件->另存为会导致奇怪的渲染问题。
就像对我上一条评论的编辑一样,LiveFigure没有显示图例有两列,但是如果我从.m文件运行脚本,输出结果与保存的图是一样的(两列间距差)。此外,看起来‘boxon’参数将盒子放到了正确的位置,但legend条目却没有……
西蒙,
我刚刚意识到,当我保存图形时,图例有两列(间距很小)。但是,仅查看图形它没有两列。
https://drive.google.com/open?id=13EtSGPEyS7thXUbFpNTCWnEUD0-gnRas
最好的
马修
@马修
你有代码样本和/或结果的图像吗?我不是很明白这个问题,所以一些示例代码会很有帮助。
@King
你在用文字翻译吗?这可能会覆盖fontwieight属性。
嗨,西蒙,
这段代码看起来正是我想要的,但当我尝试实现它时,图例似乎在一列上移动,但没有一个条目占用第二列的空间。我尝试过进行一些调试,但似乎找不到需要修复的地方。在“line”类型中,对象x/ydata正在更新,但没有移动s
有什么帮助吗?
最好的
马修
嗨,西蒙,
我忘了说,我以前也尝试过您的建议:columnlegend2(2, legend,'fontweight','bold','boxon'),其中legend是单元格中我的名字列表。然而,图例仍然显示为没有字体粗细。从逻辑上讲,我知道这是可行的,但我还是想不出这是什么原因。你还能想到其他解决这个问题的方法吗?
谢谢!
@King
简单地将其作为参数传递。该函数接受与常规图例相同的名称-值对。所以,
Columnlegend (2, {'label1', 'label2', 'label3'}, 'fontweight', 'bold');
你好,我不能改变图例的字体粗细。我使用set函数为legend_h: set(legend_h, 'FontWeight', 'bold')分配字体权重。它没有工作。
我还在代码的开头定义了字体粗细作为一个case,但它仍然没有发生。你能给我一些提示吗?这样我才能改一下字体的粗细。
谢谢!
@丽莎
我刚刚更新了脚本,以处理这种混合行/错误条图的特殊情况。希望对你有用。
嗨,西蒙,
很好的插件!不幸的是,当我结合一个错误栏图和一些正常的图,它不为我工作,我得到错误消息:
索引超出数组边界。
columnlegend错误(第119行)
child2 = child2 (2);
我哪里做错了?
------------------------------------------------------------------------------
我的示例代码:
x = 1:10;
y1=x.^2;
y2 = repmat (y1,元素个数(x) 1);
leg_str =细胞(元素个数(x) 1);
图(22)
误差条(x,y1,sqrt(y1));
leg_str{1}='errorbar';
等等
i = 1:元素个数(x)
图(x,y2);
leg_str{i+1}=sprintf('plot%u',i);
结束
leg_str columnlegend (2)
------------------------------------------------------------------------------
嗨,Simon,如果我在Live Script中使用你的函数,它不会工作,但如果我剪切并粘贴代码(或使用你的函数注释示例)到命令窗口,它会工作。
绘图(bsxfun(@times,[0:9],[1:10]);
柱状图例(3,cellstr(num2str([1:10]),“位置”,“西北”);
@M G(劳拉)
它也应该适用于错误条图。举个例子,试试:
图;
Errorbar (1:3, rand(3,1), rand(3,1));抓住;
Errorbar (1:3, rand(3,1), rand(3,1));
columnlegend(2, {'ErrorBar 1', 'ErrorBar 2'});
嗨,西蒙,
我想这是因为我用的是误差条而不是绘图。在情节上,它是完全正常的。有没有可能用误差条代替绘图?
谢谢,劳拉=)
嗨,西蒙,
谢谢你的代码。它非常适合我的目的。我注意到一个小错误或者可能是因为我在Matlab R2011中工作。当使用saveas命令时,可以正确地保存使用此命令制作的图和图例,但当手动保存为jpg文件时,图例将重新垂直排列。一个简单的解决方法是以编程方式保存图形,但我只是想告诉您关于代码的(小)问题。
亲切的问候,
内森
PS:简单的例子:
情节(魔法(3));
柱状图例(3,{'Plot A','Plot B','Plot C'})
saveas (gcf Trial1.jpg);
手动保存与Trial2.jpg相同的图形显示了我所说的差异。
@Simon,太棒了,再次感谢!
非常感谢,西蒙!
@Brain
固定的错误。您可以重新下载功能版本。
顺便说一下,Matlab版本是2017b。
谢谢
嗨,西蒙,谢谢你提供代码。然而,这似乎不起作用……
> >的情节(bsxfun (@times,[0:9]、[1:10]));
柱状图例(3,cellstr(num2str([1:10]),“位置”,“西北”);
来自非单元格数组对象的单元格内容引用。
columnlegend错误(第67行)
[legend_h,object_h,plot_h,text_strings] = legend(str, extrars {:});
谢谢!
@Frederick, @Auryn_
我已经更新了该函数以支持errorbar绘图,并允许图例支金宝app持的可选输入,例如“fontsize”。
例如:
误差条(兰特(10,5),兰特(10,5));
柱状图例(3,{'1','2','3','4','5','location','northoutside','fontsize',18);
这就跟你问声好!
我试图用函数错误条绘制多条线(它工作)。然后我想使用多列图例,但这行不通。如果我使用plot而不是errorbar,它就可以工作。
这是我在使用columnlegend时收到的错误(当使用plot而不是errorbar时有效):
使用matlab.graphics.primitive.Group/get时出错Group类上没有顶点属性。columnlegend(第97行)顶点_1=get(子“顶点”)中出错;
你好,有没有办法调整columnlegend中的字体大小?
我已经解决了,西蒙,我只是将“填充”设置为零:)
功能完美,非常感谢分享
@Selim
您似乎使用了一个函数(maxfig),它最大化图形窗口中的轴。如果你不使用maxfig,它能工作吗?
你好,西蒙。
当将“位置”设置为“南外”时,我的部分图例不会显示出来,因为它低于图形限制。在x轴的底部和我的图例的顶部之间也有一个很大的空白间隙。你能帮忙吗?
非常感谢
维克多
嗨,西蒙,
我正在使用Matlab2017b
最大值(V_rT,1)
组(0 ' CurrentFigure V_rT);
柱状图例(6,图例_str,'Location','Southoutside');
我的错误是:
错误使用matlab.graphics.axis.Axes /组
设置类“Axes”的属性“Position”错误:
宽度和高度必须大于或等于0
columnlegend错误(第205行)
集(gca,“位置”,[fig_pos] - [0 pos (4) 0 pos (4)]);
谢谢,
塞利姆
工作很好;令人惊叹的谢谢
嗨,西蒙,
您知道如何避免以下错误吗?
名称' vertex '对于类'hggroup'的实例来说是不可访问的属性。
谢谢,
尼金
@Tiago
我似乎无法重现你的问题。如果我做的事:
plot(rand(100,5));[legend_h,object_h]=columnlegend(3,{'h_1''h_2''h_3''h_4''h_5'},'Location','Southoutside');
看起来很好。你用的是什么版本的MATLAB ?MATLAB的准确误差是多少?是否有关于图例条目的任何细节,例如,它们是很长的文本,或包括特殊字符?
亲爱的西蒙:,
我得到了一个函数,可以用我想要的格式绘制图。
函数out = plotgeral(Y,Y1,Y2,Y3,Y4,Y5, eixx,eixoY,titulo,legenda,legenda1,legenda2,legenda3,legenda4,legenda5)
其中legenda to legenda 5是每个Y I图的传奇名称。
我做了:
legend([out out1 out2 out3 out4 out5],legenda,legenda1,legenda2,legenda3,legenda4,legenda5,'Location','SouthOutside','Orientation','Vertical');
但它太大了,我把它改为水平,它是大的,所以我想把图例放在2或3列下。
所以在我的函数中,我调用了你的函数,但它不起作用,我写了以下内容:
str ={︰,legenda1、legenda2 legenda3, legenda4, legenda5}
柱状图例(3,str,'Location','Southoutside','boxon');
我得到一个错误,说位置值必须在0和1之间。
谢谢你西蒙
@Amra
您可以直接传递前两个图例项:
Line_handles = plot(rand(100,10));
columnlegend ({' a ', ' b '});%这只会将前两行添加到图例中。
亲爱的Simon,如何在这个函数上使用子集条目图例?例如,我只想在图例条目中显示L1和L2。我用这个:
柱状图例(2,[L1 L2 L3 L4 L5],{'a','b','c','d','e','Location','northeast');…但这不起作用。谢谢
@迪帕克
现在不是,但是你可以通过设置当前的焦点到坐标轴来做同样的事情。例如轴(AX);cloumnlegend(…);
@纳米拉
您需要传递图例字符串的单元格数组:columnlegend(2,{'a','b','c','d','e','f','g','h','i','j','location','northeastoutside')
亲爱的西蒙:,
有没有办法将输入参数设置为特定轴。我想给特定的轴添加图例,比如“图例(目标,u u)”。我正在使用“绘图(AX…)”将绘图绘制到带有手柄AX的轴中。非常感谢。
@亲爱的西蒙,
非常感谢。现在的工作。我是新的Matlab。我还有一个问题。我有10个图。例如,当我试图在代码中使用列图例时
columnlegend (a, b, c, d, e, f, g, h,“我”、“j”,“位置”,“northeastoutside”)
它只显示了图中的第一个图例。
你能帮我解决这个问题吗?
@Namira
您的脚本无法找到该函数。columnlegend的地方。m在你的MATLAB路径中的某个地方(例如在与script相同的文件夹中)
我使用的是R2016b。当我尝试使用这个命令时,它显示错误
未定义函数或变量'columnlegend'。
无题错误(第4行)
柱状图例(2,cellstr(num2str([1:numlines])),“位置”,“东北外”);
有人能帮我解决这个问题吗?
嗨,西蒙,
非常感谢这段代码!不过我有一个问题:当使用fplot而不是plot时,object_h只有numlines元素,因此代码会崩溃。不确定是否有很多人使用fplot,只是想让您知道。
最好的
托马斯
亲爱的西蒙:,
我发现了错误,所以你得担心。我忘记了{'object1,object2}——对象周围的蛤蜊。22:00:D在MATLAB中工作时愚蠢
太棒了,谢谢!
顺致敬意,
麦斯
@Janine
在更改解释器之前,请使用drawnow以确保所有内容都已完成渲染:
情节(rand (100 4));[legend_h, object_h] = columnlegend (2, {h_1的h_2的‘h_3’‘h_4});
drawnow;
Set (findall(object_h, 'type', 'text'), 'interpreter', 'none')
亲爱的西蒙:,
我如何设置解释器为'none'?无论我做什么,我似乎都无法关闭特克斯翻译器。
这背后的原因是我有带下划线的图例条目,下划线被解释为下标。
典型的方法不起作用:set(图例、解释器、无)
我不知道为什么。另一种方法是:legend(str,'Interpreter', 'none')
但是你的代码不起作用。
提前感谢,感谢这个功能。
@贝琪456
这似乎是MATLAB内置的legend函数的一个bug。当返回句柄时,它会删除所有的alpha格式。
例如,try(第二个图例调用不会呈现alpha透明度):
----
图形;绘图(1:10,rand(10,5),‘color’,[100.1]);图例({'1','2','3','4','5'});
vs。
图;Plot (1:10, rand(10,5), 'color', [1 0 0 0.1]);[a,b,c]=legend({'1', '2', '3', '4', '5'});
-----
我将在下一版本的函数中进行变通。现在,如果您使用的是公共alpha值,这里有一个快速的解决方法:
用直线绘制一个图
α= 0.1;
图;Plot (1:10, rand(10,5), 'color', [1 0 0 alpha]);
[legend_h, object_h] =传奇({' 1 ',' 2 ',' 3 ',' 4 ',' 5 '});
%使用图例句柄,并对直线对象应用alpha
bb=findall(对象“类型”、“线”);
For i=1:length(bb), set(bb(i), 'color', [bb(i)]。颜色α]);结束
嗨,这段代码很棒,但我想知道是否有办法在图例中加入部分透明的颜色。在我的柱状图中,我有一些特定颜色的柱状图,还有一些相同颜色的柱状图,但是‘FaceAlpha’的颜色是0.5,所以它们是部分透明的。在传说中,这两种颜色都以全色出现,有什么办法补救吗?
谢谢
@琳达
就像内置的legend命令一样:
%图4线
情节(rand (100 4));
%添加自定义标签的图例
columnlegend (2, {' x ', ' 4 ', ' g ', ' 6 '});
你如何得到你自己的输入参数,使它在de legend中不显示:1,2,3,4,5......比如x 4 g 6
@贾梅萨
您只需要传递您想在图例中使用的行对象的句柄。例如:
%绘制8个不同的行并返回句柄
H = plot(rand(100,8));
% add columnlegend并提供行对象5-8的句柄
columnlegend (2 h (8));
这就跟你问声好!这是太棒了!一个简单的问题:它有跳过图例条目的功能吗?例如,如果我已经绘制了8条线,但我只想为最后4条线使用图例条目/符号?
对于那些有兴趣为传奇获得Latex翻译。改变行
[legend_h, object_h plot_h text_strings] =传奇(str);
到
[legend_h,object_h,plot_h,text_strings]=图例(str,'explorer','latex','FontSize',12);
并在拨打电话时将$$放在适当的位置,例如。,
柱状图例(2,{'$f(z)$'},'位置','东北');
谢谢你分享这段代码。
不过我好像发现了一个小虫子。
在第41行中,for循环中的步骤不应该是1而不是2?在需要的情况下包括这两个跳转。
例如,“boxon”和“boxoff”并不要求步长为2。
还有,关于如何为传奇加入乳胶口译员有什么建议吗?
谢谢
谢谢你分享代码
谢谢你的代码。
我想把这个传说放在西南,你能像这样列出传说的对象吗:
9 10
5 6 7 8
1 2 3 4
在第138行有错误,' There is no ydata property on the Group class',在我的图中有scatter和plot
嗨,西蒙,
我似乎在文件交换的任何地方都找不到你的函数。除了这个页面,还有什么地方可以找到它吗?
谢谢,乔夫
该功能似乎与使用散点产生的数字不兼容。
谢谢你的代码!
小错误修复:
当前代码只接受小写'south'的位置,不像' legend '命令不区分大小写。
要更正,请将第171行从“if strfind(位置,'south'),”更改为“if strfind(位置,'south'),”
谢谢你的工作。但是有一些未知的原因使得它在Matlab 2017中不能很好地工作。定位和框设置不起作用。
谢谢你!
有没有办法控制柱之间的水平间距?
完美的。这正是我需要的谢谢。
@西蒙·海宁
这是一个非常有用的代码,非常感谢。
但我发现当我选择酒吧的“历史”时,它不起作用,为什么?下面是Matlab 2017a中的一个例子:
Y = [2 2 3;2 5 6;2 8 9;2 11 12];
h =栏(y,‘嘘’)
柱状图例(3,cellstr(num2str([1:3]),“位置”,“东外”);
好的代码。为了使图例更紧凑,我使用一种稍微粗糙的方法减少了行长和文本空间:
Line 98: line_width = (xdata(2)-xdata(1))*rescale/L_R;%重新缩放线宽以匹配原始
第99行:spacer = xdata(1)*rescale/L_R;
%将管路和垫片减少L_R=2.7
%减少列之间的空格
第45行:set(object_h(linenum), 'xdata', [col/numcolumns/St_R+spacer col/numcolumns/St_R+spacer+line_width]);
设置(对象_h(linenum+1),'ydata',[height-(position-1)*sheight height-(position-1)*sheight]);
set(object_h(linenum+1), 'xdata', [col/numcolumns/St_R+spacer*3.5 col/numcolumns/St_R+spacer*3.5]);
设置(对象h(labelnum),‘位置’,[col/numcolumns/St_R+间隔条*2+线宽高度-(位置-1)*sheight]);
%改变了标准和标准以适应
你好,
我正在尝试R2015b函数。我得到以下错误:
使用matlab.graphics.primitive.Group/get时出错
Group类上没有顶点属性。
columnlegend错误(第97行)
Vertices_1 = get(child, 'vertices');
这个问题有解决方案吗?
这是一个很棒的程序,但是如何改变前面的尺寸呢?
嗨,工作很好,但是否可能设置每列的行数?比如,如果我有13个元素想要3列4 4 5行?
非常感谢,这个很容易使用.....
一个问题,当使用savefig('filename.fig')保存图形时,列合并成一个!寻找解决方案…
谢谢你的盛情款待。我想知道是否有改变图例的背景颜色。谢谢。
您好,Simon,非常感谢您提供的功能。不过,我遇到了一个问题。如果我使用下面的方法更改字体大小,当我尝试手动移动图形中的对象时,它将重置为默认值。您对如何处理这个问题有何想法?谢谢。
@Roger
看看6月5日与卡西姆的对话。这样你的问题就解决了。
我喜欢这个,它工作得非常好,除了我不能设置图例字体的大小。有什么办法可以这样做吗?或者将其作为参数添加到代码中?
@卡西姆
实际上,我得到了启发,在函数中添加了一个额外的选项,即“padding”选项,它可以在legend条目之间添加额外的空间(以标准化单位,例如1 = 100%额外的padding)。所以类似:
r=兰特(10,5);
情节(r);
(h, obj) = columnlegend (2, {h_1、h_2,‘h_3’,‘h_4’,‘h_5},“位置”,“东南”、“填充”,1);
如果有帮助请告诉我!
@西蒙,
谢谢您的快速回复。通过将fontname属性(\{times new roman})添加到提供给columnlegend的字符串单元格,我获得了同样的效果。还将字体更改为更大的数字,如果放置东南或西南,将导致图例线重叠。我想知道如何在不同的图例行之间增加更多的空间。如果我能解决这个问题,那么一切都很完美。谢谢你的帮忙。
@卡西姆
当然您只需格式化返回的文本对象:
情节(r);
(h, obj) = columnlegend (2, {h_1、h_2,‘h_3’,‘h_4’,‘h_5},“位置”,“northeastoutside”);
drawnow;%确保所有渲染都完成
Set (findall(obj, 'type', 'text'), 'fontsize', 18, 'interpreter', 'tex')
有没有办法把翻译器改成乳胶的?图例条目的字体大小?
嗨,不幸的是这里没用。这是我收到的错误消息:
试图访问顶点_1(2,2);索引超出范围,因为
大小(vertices_1) =[1, 2]。
出错在==> columnlegend在92
sheight=顶点_1(2,2)-顶点_1(1,2);
错误==>39时的比较
columnlegend (6 legend_str“东北”);
这是一个伟大的功能,但不幸的是,它不支持补丁:金宝app
> > h =补丁(“FaceColor”,[1 0 0],“EdgeColor”,“黑色”);
>>柱状图例(h,1,'TEST','location','northeast','boxoff');
这是未来可以添加的内容吗?
谢谢!
@Kevin德莱尼
这似乎是R2016b中的一个bug,我似乎无法解决。它不会发生在以前的版本(R2016a)或最新的(R2017a)版本。我的建议是,如果你想使用这个功能,可以升级或降级。
这是一个很棒的函数;我一直在用它,它让情节看起来更专业。
但我得到错误与R2016b如果我调整轴包含columnlegend:
来自非结构数组对象的结构内容引用。
错误matlab.graphics.illustration.Legend / doMethod > doUpdateCompatible
matlab.graphics.illustration.Legend/doMethod中存在错误
在matlab.graphics.illustration.Legend / doUpdate错误
有人有解决办法吗?我已经向MathWorks提交了一份bug报告,但他们说这是“第三方软件”,因此不是他们的问题。
你好,
“我的图例”条目有多行(字符串中的换行字符),但使用此项只能为每个条目分配一行。是否有方法更改此项?
谢谢!
@yangyang
你可以改变字体大小和类型使用这个简单的代码:
leg_str={'\fontname{Times New Roman}\fontsize{13} data 1','\fontname{Times New Roman}\fontsize{13} data2')
h = columnlegend (2, leg_str);
嗨,西蒙,
非常感谢您的快速回复。这解决了我的问题。
@A。这个版本中还没有实现“最佳”位置。但是,你可以使用任何传统的室外位置(例如:室外南,室外东北)。
是否可以使用columnlegend将图例放置在plot之外?一个例子
图;
子地块(211)%参考地块
情节(rand (100 2));
传奇(“Test1”、“Test2”,“位置”,“bestoutside”);
次要情节(212);%测试图
情节(rand (100 2));
columnlegend({‘Test1’,‘Test2},“位置”,“bestoutside”);
@萨沃斯
抢手货。我将在以后的更新中添加这个选项。现在这里有一个简单的解决方法:
图;情节(rand (100 2));[~ h] = columnlegend({‘test_1’,‘test_2});
drawnow;
集(findall (h,“类型”、“文本”),“翻译”,“没有一个”);%使用图例对象更改所有文本对象的解释器
嗨,西蒙,
祝贺这个很棒的功能,但是解释器不能关闭,这导致在使用下划线时显示讨厌的图例。
谢谢!
@克莱尔
该函数目前不适用于条形图。
你好,
我一直得到以下错误:
使用matlab.graphics.primitive.Group/get时出错
Group类上没有xdata属性。
columnlegend错误(第72行)
Xdata = get(object_h(numlines+1), ' Xdata ')
我试着把条形图的图例分成几列。有人有什么建议吗?谢谢。
@Chocolateee
更新了“南外”位置选项
嗨Simon,我在指定图例位置为“southoutside”时遇到了一个小问题:图例太靠近x轴,因此与日期格式的x标记重叠。当使用“legend”命令时,我没有这个问题。
@Patrick
刚刚上传了一个新版本,有新的图例位置,包括外部图例。
不适合外部的传奇人物…
你好,
我在输入参数上有问题。我使用MatlabR2012b,我一直得到错误:未定义函数'columnlegend'输入参数的类型'cell'。
即使我运行示例代码。我得到这个错误:(,有什么建议吗?
你好,麦克尔- Gryning
不管我输入的是什么数字,代码都将字体大小更改为9。
你好,麦克尔- Gryning
你的方式根本没有改变。我使用的是2016a
@Daniel
设置字体大小的按钮不工作。它改变了方框的大小,但字体大小保持不变。
我使用的是2016a
@Padraig
你可以试着这样做:
3)图(兰德(10日);
leg_str={'\fontname{WingDings}文本A','文本B','文本C'};
leg_str h = columnlegend(3日);
显然,更改为系统支持的字体并应用于所有图例条目。金宝app
嗨,西蒙,
有办法设置FontName吗?这似乎对我不起作用:
leg_str={'Text A'、'Text B'、'Text C'};
leg_str h = columnlegend(3日);
集(h,“位置”,(0.15,0.85,0.75,0.1),字体名,Times New Roman)
无法将传奇置于南方之外
当我保存图像为Matlab图形和重新打开它,列格式消失。
伟大的功能。对于想要使用“NorthOutside”位置的人,只需在switch lower(location)中添加以下代码(即在第124行):
情况下{' northoutside '}
集(legend_h,“位置”,[pos (1) pos (2) + pos (4) pos (3) 0.05]);
拖动时是否可以移动图例?
谢谢你!
@克里斯托夫
当然,您可以在创建图例之后尝试应用样式。例如:
> >的情节(兰德(10,3));H =columnlegend(2, {'1' '2' '3'});
>> set(h,'box', 'on', 'color',[10 0 0])
嗨,西蒙,
有没有办法改变图例框的背景颜色?
@Daniel, @Mikkel
谢谢你的反馈。我已经更新了提交,添加了这个能力,使它与2015b兼容
作为Daniel评论(01/09/2015)的延伸,这对我在2015a并不适用。
如果你像他建议的那样补充道:
例“字形大小”
fsize=varargin{i+1};
我=我+ 2;
到开关回路,但是加上,
%创造传奇
[legend_h, object_h plot_h text_strings] =传奇(str);
legendT=findobj(object_h,'Type','Text');
设置(legendT,'FontSize',fsize);
这对我很有效。他们肯定在2015年改变了访问模式。
希望它能帮助到别人:)
麦克尔-
一些帖子询问了字体大小的调整,我也要求这样做。我添加了一个简单的变通方法(这有点困难,但适合我的目的)。你可以在第一个switch循环中添加一个搜索条件:
例“字形大小”
fsize=varargin{i+1};
我=我+ 2;
然后,您可以在构建基础图例后设置fontsize:
%创造传奇
[legend_h, object_h plot_h text_strings] =传奇(str);
集(legend_h,字形大小,fsize);
您可以使用其他fontsize规范正常调用修改后的函数:
柱状图例(2,legstr,'location','NorthWest','boxoff','fontsize',20);
丹尼尔
你好,
我将此函数称为columnlegend(2,legendNames,'Location','NorthWest');但是,我得到了如下错误。
使用hg.hggroup/get时出错
名称'xdata'对于类'hggroup'的实例来说是不可访问的属性。
有线索吗?
谢谢,
了雯雯
设计布局做得很好。
可以做一些修改来处理散点图,在图例中只包含一个元素(linenum = linenum+1;)
我没有尝试过其他类型的情节
非常好!
非常有用和简单的使用。
这太棒了!我唯一想要改变的是,图例也可以位于图表之外(例如。“southwestoutside”)
目前唯一可能的值是:'NorthWest', 'NorthEast', 'SouthEast', 'SouthWest'
有人能帮我一下吗,在哪一点上我必须修改代码?
亲爱的读者:,
我试图绘制准确的代码,因为你写它,但得到错误:未定义函数'columnlegend'输入参数的类型'cell'。
测试错误(第9行)
柱状图例(3,图例_str,'Location','NorthWest','boxon');
有人有什么建议吗?
谢谢!
对于相对简单的需求来说,这是一个很好的工具,但我马上发现我不能做太多额外的图例定制
Set (lh,'fontsize',8)导致我的图例恢复到单一列。你能添加更多的输入选项吗?或者让图例在改变其他属性时不会影响布局?
太好了!非常感谢。
我希望它也支持“最佳”位置,如金宝appMatlab的传奇。
它很适合我,我强烈推荐使用export_fig打印绘图。我认为如果我们可以选择一个“北”位置,那将是一个很好的改进,因为如果你需要将图形放在中间,你必须通过get 'Position'和设置'Position'移动图例。西蒙问好。
@Aslak Grinsted
我想给它一个句柄向量,就像你在legend函数中做的一样,这是columnlegend.m中的一个小改动
首先给它一个额外的输入,例如第1行中的“hdl”:
函数legend_h,object_h,plot_h,text_strings] = columnlegend(numcolumns, hdl, str, varargin)
然后将第49行也更改为:
[图例、对象、绘图、文本字符串]=图例(hdl、str);
嘿,
在编写了一个脚本来制作一些自定义条形图之后,我今天重新访问了这个函数。无论如何,我试着运行这个函数来创建一个2列的图例,但是遇到了一个错误。然后,我运行了上面提供的简单代码,并遇到了相同的错误,即:
使用hg.hggroup/get时出错
名称'xdata'对于类'hggroup'的实例来说是不可访问的属性。
列图例中的错误(第61行)
Xdata = get(object_h(numlines+1), ' Xdata ')
明天我可能会尝试做更多的修改,但这只是一个方便的问题,可以让情节变得更漂亮,所以如果没有简单的修复方法,我就不必担心响应了。
谢谢!
@巴甫洛夫
如您所知,当无法在其路径中找到函数时,此错误是一个一般的MATLAB错误。之所以为“double”,是因为columnlegend的第一个参数是转换为double的图形句柄。
最好的
西蒙
我从试验和错误中知道,这个错误只与指向matlab中正确的文件夹有关,但不清楚这与double格式有什么关系。我知道double与matlab如何保存或读取信息有关,但double到底是什么或者至少何时/为什么需要这种格式对我来说仍然是个谜。
实际上,这是我的错误:
"未定义函数'columnlegend',用于输入类型为'double'的参数。:
我不清楚是什么使输入参数('leg_str')成为双类型变量。我也尝试了num2str(leg_str)。
新的matlab这里,但这个函数将是非常方便的我使用。我得到以下错误是否我复制/过去你的代码在这里,或使用我自己的str调用函数:
未定义函数'columnlegend'作为类型'cell'的输入参数。
我忘记了,您还需要到print函数,突出显示print并按ctrl+D并注释第293行
% pj = restore(pj, h);
对于那些在更改图例时遇到打印问题的人,我找到了一个解决方案。
将其插入到函数columnlegend中创建的图例之后
pt = getprinttemplate (gcf);
cd(“C: \ Program Files \ MATLAB \ R2012a \ MATLAB工具箱\ \图形\私人的)
ptpreparehg (pt, gcf);
cd (link0)
复制传奇命令
Lin0是您的主目录。
你也可以以管理员的身份运行Matlab。
打印时图例被修改的原因是因为打印功能将设置图例内文本的前重(名称)。如果这是修改图例,请返回其原始位置。
试试这个
集(legend_h1“字体名”,“Helvetica”)
您将看到图例将重置。
我还修改了函数,以便在脚本中创建图例,并将其作为参数插入函数中。我在创建plot和调用columnfunction之间插入了3行解。
如果你有什么问题,我很乐意帮忙
@臭鼬
谢谢你的评论。文档中未包含函数返回图例对象句柄的事实。因此,您可以自行更改这些属性。
就像这样:
[legend_h, object_h plot_h text_strings] = columnlegend(…);
集(legend_h,“盒子”,“上”,…
‘颜色’、‘y’、。。。
“ycolor”、“m”,…
“xcolor”、“b”,……
“可见”、“关于”);
嘿。很好的功能。这正是我需要的。
有没有办法让它不透明?我的图表使文字有点难以辨认。
我得到这个错误(使用Matlab R2013a):
使用hg.hggroup/get时出错
名称'xdata'对于类'hggroup'的实例来说是不可访问的属性。
列图例中的错误(第61行)
扩展数据=获取(对象_h(numlines+1),“扩展数据”);
有线索吗?谢谢!
嗨,非常好的部分代码!但图例的列是放在一起的。eps数字是打印出来的。你知道怎么修吗?
谢谢,
卢卡斯
非常有用
我想把图例的字体大小改为14,可以吗?
在文档中,文本太小了。
我发现了这个程序的一个bug。例如,当您尝试将1_by_2图例更改为2_by_1时,此程序将无法运行。因为numpercolumn是1,col总是-1。
替换的代码
”
如果国防部(我,numpercolumn) = = 1,
坳=坳+ 1;
结束
”
与
”
如果numpercolumn > 1,
如果国防部(我,numpercolumn) = = 1,
坳=坳+ 1;
结束
其他的
col=i-1;
结束
”
杀死这个虫子。
columnlegend隐藏图例周围的方框,因为不可能强制方框小于
原来的高度。解决显示框的方法是使用注释。
下面的代码可以添加在"columnlegend"的末尾,以显示legend周围的框:
Pos = get(legend_h, 'position');
高度=位置(4);
位置(4)=组织高度/数量线*数量柱;
位置(2)=位置(2)+高度位置(4);
注释(“矩形”,pos)
嗨,西蒙,
我把线图和散点图混在一起,真是小菜一碟。
不管怎样,这个功能很好。
谢谢。
哈维尔
@哈维尔
不幸的是,此时此脚本仅适用于直线图,例如通过plot命令创建的直线图。您可能试图在条形图或其他不典型的matlab图形对象上使用脚本。
最好的
西蒙
你好,
我的一个图表出了问题:
???使用==> get时出错
在hggroup类中没有'xdata'属性。
==>columnlegend在42处出错
扩展数据=获取(对象_h(numlines+1),“扩展数据”);
我不知道原因。该函数与上的示例一起工作http://blogs.mathworks.com/pick/2011/02/11/create-multi-column-plot-legends/
更新:问题可能与子地块无关(在一个简单的示例中尝试过)。错误消息:
???索引超出矩阵维度。
==>columnlegend在77处出错
集(object_h (linenum)、“ydata”,[(高度-(位置1)* sheight)
(高度-(位置1)* sheight)]);
太棒了,正是我需要的。但是,子地块有问题。
@Mathias
请参阅完整的文件描述。要导出到矢量图形文件,使用高级的图形导出(我推荐export_fig,//www.tatmou.com/matlabcentral/fileexchange/23629).
不兼容eps格式。
所以在生成乳胶文件....中包含的数字是没有用的
好的,有用的,紧凑的代码!如果我能给它一个句柄列表,放在图例中,那就太好了。
谢谢你的评论,这个问题已经解决了。
很好,但是如果你用过记号笔就不行了。
天才