图片缩略图

西蒙赫宁/传奇

版本3.0.0.1 (50.9 KB) 西蒙·海宁
创建具有指定列数的图例
4.4
71评级

83下载

更新2020年1月08

从GitHub

查看版本历史记录

在GitHub上查看许可证

编者按:该文件被选为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)。检索

评论和评级(192

MN米

它不能工作

亚当Danz

从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);

约恩·沃格桑

Marko斯佩里奇

有人能解决这个问题吗?(这个问题已经被一些用户贴在这里了)

索引超出矩阵维度。
columnlegend错误(第110行)
sheight=顶点_1(2,2)-顶点_1(1,2);

西蒙·范佩梅尔

安德里亚·尼格伦

谢谢你!

K W

我建议修复错误
位置=低(变长度输入宗量{i + 1});

正如Sarah Pasternak(2017年11月30日)所指出的,目前不允许将“南方”写成“南方”。
否则,感谢你伟大的屈服。

延斯•林达尔

伟大的助手!但是,在更改填充时,图例框似乎没有正确渲染。

延斯•林达尔

@明选:使用参数“fontname”(应该是小写)

明轩

如何更改fontname

凯文Gautier

你用MatlabR2017B救了我实习生的命^^

mathwork

嗨,这真是太棒了。但我觉得有个问题。它不能与错误栏一起使用。

SC0TT1E94

这个函数将得到5颗星,唯一的问题是您不能轻易地改变列之间的间距。请问可以添加这个功能吗?

曼努埃尔·库德

乔纳森

琼马克·罗德里格斯

Baolei吴

@Simon谢谢你的回复。
我认为“填充”输入只是为了减少条目之间的垂直间距。
实际上,我想减少每个条目中标记和说明文本之间的空间。
这可能吗?
谢谢你!

西蒙·海宁

@宝蕾

有一个“填充”输入选项,允许您在图例元素之间添加一些额外的填充。您可以使用负填充将条目拉近。

Baolei吴

它真的很有用!谢谢你,西蒙。
有没有办法减少符号和文本之间的间距和/或列之间的间距?这将是非常有用的,因为大多数人使用这个columnlegend来保存页面布局。

期待您的回复。

西蒙·海宁

@GreenPiece

当传递额外的输入参数时,这似乎是legend函数的一个错误。在<2017a版本中,fontsize不呈现,图例对象的句柄丢失。我建议在调用函数后修改字体大小。喜欢的东西:

地块(兰德(10,5));
[处理,legend_objects] = columnlegend (3, cellstr (num2str ([1:5] ')));
暂停(0.1);%<-注意这里的停顿。需要确保图例已完全渲染
集合(findall(图例对象,'type','text'),'fontsize',20);

希望这有帮助

GreenPiece

@西蒙·海宁
我使用的是Matlab 2016a。

西蒙·海宁

@GreenPiece

我似乎无法重现这个问题:

地块(兰德(10,5));
柱状图例(3,cellstr(num2str([1:5]),“位置”,“西南”,“字体大小”,30);

对我来说没问题。你用的是什么版本的MATLAB ?

GreenPiece

我认为问题出在这一行:
如果~ 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);

卢卡斯Hagmeyer

你好,西蒙。干得好,但是我觉得字体大小不正常,或者只是我的错……
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'});

mg

嗨,西蒙,
我想这是因为我用的是误差条而不是绘图。在情节上,它是完全正常的。有没有可能用误差条代替绘图?
谢谢,劳拉=)

内森德Kerpel

嗨,西蒙,

谢谢你的代码。它非常适合我的目的。我注意到一个小错误或者可能是因为我在Matlab R2011中工作。当使用saveas命令时,可以正确地保存使用此命令制作的图和图例,但当手动保存为jpg文件时,图例将重新垂直排列。一个简单的解决方法是以编程方式保存图形,但我只是想告诉您关于代码的(小)问题。

亲切的问候,
内森

PS:简单的例子:
情节(魔法(3));
柱状图例(3,{'Plot A','Plot B','Plot C'})
saveas (gcf Trial1.jpg);

手动保存与Trial2.jpg相同的图形显示了我所说的差异。

内森德Kerpel

布莱恩·刘

@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 {:});

项怡君

Auryn_

谢谢!

西蒙·海宁

@Frederick, @Auryn_

我已经更新了该函数以支持errorbar绘图,并允许图例支金宝app持的可选输入,例如“fontsize”。
例如:

误差条(兰特(10,5),兰特(10,5));
柱状图例(3,{'1','2','3','4','5','location','northoutside','fontsize',18);

Auryn_

这就跟你问声好!
我试图用函数错误条绘制多条线(它工作)。然后我想使用多列图例,但这行不通。如果我使用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)]);

谢谢,
塞利姆

库尔德普·乔杜里

工作很好;令人惊叹的谢谢

Negin Nazarian

嗨,西蒙,
您知道如何避免以下错误吗?
名称' 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 Rajuli

谢谢你西蒙

西蒙·海宁

@Amra

您可以直接传递前两个图例项:

Line_handles = plot(rand(100,10));
columnlegend ({' a ', ' b '});%这只会将前两行添加到图例中。

Amra Rajuli

亲爱的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])),“位置”,“东北外”);

有人能帮我解决这个问题吗?

托马斯Debarre

嗨,西蒙,
非常感谢这段代码!不过我有一个问题:当使用fplot而不是plot时,object_h只有numlines元素,因此代码会崩溃。不确定是否有很多人使用fplot,只是想让您知道。
最好的
托马斯

麦斯Søndergaard拉森

亲爱的西蒙:,

我发现了错误,所以你得担心。我忘记了{'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)]。颜色α]);结束

besty456

嗨,这段代码很棒,但我想知道是否有办法在图例中加入部分透明的颜色。在我的柱状图中,我有一些特定颜色的柱状图,还有一些相同颜色的柱状图,但是‘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));

Jamesa斯托克斯

这就跟你问声好!这是太棒了!一个简单的问题:它有跳过图例条目的功能吗?例如,如果我已经绘制了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)$'},'位置','东北');

埃桑

Guilherme

谢谢你分享这段代码。
不过我好像发现了一个小虫子。
在第41行中,for循环中的步骤不应该是1而不是2?在需要的情况下包括这两个跳转。
例如,“boxon”和“boxoff”并不要求步长为2。

还有,关于如何为传奇加入乳胶口译员有什么建议吗?

谢谢

IvetteRodriguez

谢谢你分享代码

Jiangpeng崔

Jiangpeng崔

谢谢你的代码。
我想把这个传说放在西南,你能像这样列出传说的对象吗:

9 10
5 6 7 8
1 2 3 4

更好的李

在第138行有错误,' There is no ydata property on the Group class',在我的图中有scatter和plot

水晶Hovland

嗨,西蒙,

我似乎在文件交换的任何地方都找不到你的函数。除了这个页面,还有什么地方可以找到它吗?

谢谢,乔夫

Gavin Osterhoudt

该功能似乎与使用散点产生的数字不兼容。

莎拉·帕斯捷尔纳克

谢谢你的代码!

小错误修复:
当前代码只接受小写'south'的位置,不像' legend '命令不区分大小写。
要更正,请将第171行从“if strfind(位置,'south'),”更改为“if strfind(位置,'south'),”

Yimao太阳

谢谢你的工作。但是有一些未知的原因使得它在Matlab 2017中不能很好地工作。定位和框设置不起作用。
谢谢你!

vprithiv

有没有办法控制柱之间的水平间距?

斯蒂芬妮·威尔斯

完美的。这正是我需要的谢谢。

@西蒙·海宁
这是一个非常有用的代码,非常感谢。
但我发现当我选择酒吧的“历史”时,它不起作用,为什么?下面是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行?

丹尼尔花呢

Palash Sinha

非常感谢,这个很容易使用.....

一个问题,当使用savefig('filename.fig')保存图形时,列合并成一个!寻找解决方案…

帕博达

谢谢你的盛情款待。我想知道是否有改变图例的背景颜色。谢谢。

安东Kuznetcov

您好,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);

如果有帮助请告诉我!

卡西姆Manzoor

@西蒙,
谢谢您的快速回复。通过将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')

卡西姆Manzoor

有没有办法把翻译器改成乳胶的?图例条目的字体大小?

Gustavo罗德里格斯

嗨,不幸的是这里没用。这是我收到的错误消息:

试图访问顶点_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)版本。我的建议是,如果你想使用这个功能,可以升级或降级。

凯文·J·德莱尼

这是一个很棒的函数;我一直在用它,它让情节看起来更专业。

但我得到错误与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);

Tamilpalani

嗨,西蒙,
非常感谢您的快速回复。这解决了我的问题。

西蒙·海宁

@A。这个版本中还没有实现“最佳”位置。但是,你可以使用任何传统的室外位置(例如:室外南,室外东北)。

Tamilpalani

是否可以使用columnlegend将图例放置在plot之外?一个例子
图;
子地块(211)%参考地块
情节(rand (100 2));
传奇(“Test1”、“Test2”,“位置”,“bestoutside”);
次要情节(212);%测试图
情节(rand (100 2));
columnlegend({‘Test1’,‘Test2},“位置”,“bestoutside”);

Hyunseong敏

DomJung

西蒙·海宁

@萨沃斯

抢手货。我将在以后的更新中添加这个选项。现在这里有一个简单的解决方法:

图;情节(rand (100 2));[~ h] = columnlegend({‘test_1’,‘test_2});
drawnow;
集(findall (h,“类型”、“文本”),“翻译”,“没有一个”);%使用图例对象更改所有文本对象的解释器

Sawoth

嗨,西蒙,

祝贺这个很棒的功能,但是解释器不能关闭,这导致在使用下划线时显示讨厌的图例。

谢谢!

dhaba印度

西蒙·海宁

@克莱尔

该函数目前不适用于条形图。

克莱尔·哈内特

你好,

我一直得到以下错误:

使用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)

荣府

无法将传奇置于南方之外

Erkan Polat

当我保存图像为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])

Christoph Hachmann

嗨,西蒙,

有没有办法改变图例框的背景颜色?

西蒙·海宁

@Daniel, @Mikkel
谢谢你的反馈。我已经更新了提交,添加了这个能力,使它与2015b兼容

麦克尔- Gryning

作为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'的实例来说是不可访问的属性。

有线索吗?

谢谢,
了雯雯

Sebastien马丁

设计布局做得很好。

可以做一些修改来处理散点图,在图例中只包含一个元素(linenum = linenum+1;)
我没有尝试过其他类型的情节

非常好!

阿尔丘科斯塔酒店

非常有用和简单的使用。

塔玛拉Schapitz

这太棒了!我唯一想要改变的是,图例也可以位于图表之外(例如。“southwestoutside”)

目前唯一可能的值是:'NorthWest', 'NorthEast', 'SouthEast', 'SouthWest'
有人能帮我一下吗,在哪一点上我必须修改代码?

君君

托马斯·范迪克

亲爱的读者:,

我试图绘制准确的代码,因为你写它,但得到错误:未定义函数'columnlegend'输入参数的类型'cell'。

测试错误(第9行)
柱状图例(3,图例_str,'Location','NorthWest','boxon');

有人有什么建议吗?
谢谢!

马修

对于相对简单的需求来说,这是一个很好的工具,但我马上发现我不能做太多额外的图例定制
Set (lh,'fontsize',8)导致我的图例恢复到单一列。你能添加更多的输入选项吗?或者让图例在改变其他属性时不会影响布局?

laoya

太好了!非常感谢。
我希望它也支持“最佳”位置,如金宝appMatlab的传奇。

Jhabriel

它很适合我,我强烈推荐使用export_fig打印绘图。我认为如果我们可以选择一个“北”位置,那将是一个很好的改进,因为如果你需要将图形放在中间,你必须通过get 'Position'和设置'Position'移动图例。西蒙问好。

Morten

@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'的输入参数。

Sebastien角落

我忘记了,您还需要到print函数,突出显示print并按ctrl+D并注释第293行
% pj = restore(pj, h);

Sebastien角落

对于那些在更改图例时遇到打印问题的人,我找到了一个解决方案。
将其插入到函数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”,……
“可见”、“关于”);

麦克指标Mø望远镜

嘿。很好的功能。这正是我需要的。
有没有办法让它不透明?我的图表使文字有点难以辨认。

Wasim马利克

我得到这个错误(使用Matlab R2013a):

使用hg.hggroup/get时出错
名称'xdata'对于类'hggroup'的实例来说是不可访问的属性。

列图例中的错误(第61行)
扩展数据=获取(对象_h(numlines+1),“扩展数据”);

有线索吗?谢谢!

嗨,非常好的部分代码!但图例的列是放在一起的。eps数字是打印出来的。你知道怎么修吗?

谢谢,
卢卡斯

Thomine Stolberg-Rohr

Ligong汉

非常有用

我想把图例的字体大小改为14,可以吗?
在文档中,文本太小了。

比尔

我发现了这个程序的一个bug。例如,当您尝试将1_by_2图例更改为2_by_1时,此程序将无法运行。因为numpercolumn是1,col总是-1。

替换的代码

如果国防部(我,numpercolumn) = = 1,
坳=坳+ 1;
结束



如果numpercolumn > 1,
如果国防部(我,numpercolumn) = = 1,
坳=坳+ 1;
结束
其他的
col=i-1;
结束

杀死这个虫子。

比尔

杜尔迦Lal Shrestha

columnlegend隐藏图例周围的方框,因为不可能强制方框小于
原来的高度。解决显示框的方法是使用注释。

下面的代码可以添加在"columnlegend"的末尾,以显示legend周围的框:

Pos = get(legend_h, 'position');
高度=位置(4);
位置(4)=组织高度/数量线*数量柱;
位置(2)=位置(2)+高度位置(4);
注释(“矩形”,pos)

哈维尔Pacheco-Labrador

嗨,西蒙,

我把线图和散点图混在一起,真是小菜一碟。

不管怎样,这个功能很好。

谢谢。

哈维尔

西蒙·海宁

@哈维尔

不幸的是,此时此脚本仅适用于直线图,例如通过plot命令创建的直线图。您可能试图在条形图或其他不典型的matlab图形对象上使用脚本。

最好的
西蒙

哈维尔Pacheco-Labrador

你好,

我的一个图表出了问题:

???使用==> 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).

马赛厄斯Vanwolleghem

不兼容eps格式。
所以在生成乳胶文件....中包含的数字是没有用的

Aslak Grinsted

好的,有用的,紧凑的代码!如果我能给它一个句柄列表,放在图例中,那就太好了。

西蒙·海宁

谢谢你的评论,这个问题已经解决了。

艾米

很好,但是如果你用过记号笔就不行了。

camra data

天才

MATLAB版本兼容性
创建R2008b
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始打猎吧!