Matlab:保存后翻转图例顺序和图例重叠图

yqyhoc1h  于 2023-10-23  发布在  Matlab
关注(0)|答案(2)|浏览(261)

我试图根据reverse ordering of legend colors in matlab bar plot反转图例条目的顺序,但在我的情况下似乎不起作用。
基本上我有一个指南图,它画了很多图,并能够保存到.png文件。效果如下所示:

我已经通过上下翻转图例成功更改了文本顺序,但无法更改图例颜色顺序。这是我得到的

[a b] = legend(legenda);

map = colormap; % current colormap

n = size(b,1);

z = linspace(size(map,1),1,n/3); % there is 1 text and 2 line elements for every data series, so I divide by 3

z = round(z); %otherwise matlab gets angry that indices must be real integers or logicals

MAP = map(z(:),:); % gets elements specified by linspace from colormap

到目前为止一切正常。
两个序列的B向量看起来像这样(从2.0开始,因为它是反向的):

Text    (P+C 200 2.0.dpt)
Text    (P+C 200 1.0.dpt)
Line    (P+C 200 2.0.dpt)
Line    (P+C 200 2.0.dpt)
Line    (P+C 200 1.0.dpt)
Line    (P+C 200 1.0.dpt)

所以我想出来了(基于链接的代码),我必须为每一行条目更改颜色变量。

for k = (n/3 + 1):n
   a1 = get(b(k),'Children');
   set(a1,'FaceColor',MAP(ceil((k - n/3)/2), :));
end

单元格和除以2得到相同的索引两次。
然而,这段代码什么也不做。
我已经检查了翻转图例向量是否可能是问题的根源,但颜色顺序保持不变。我也试过Map矢量-没有运气。
当我在a1 =..在for循环中,我得到:

a1 = 

  0x0 empty GraphicsPlaceholder array.

我怎么才能让它工作?
还有,有没有什么好的方法可以让图例在保存后不覆盖图(见上面链接的图片)?
我保存它的方法是通过创建一个临时的数字与'可见' '关闭'和做一个copyobj的轴和图例,然后保存。否则,它会保存整个图形。

qgzx9mmu

qgzx9mmu1#

reverse ordering of legend colors in matlab bar plot的答案中提供的代码在您的情况下不起作用的原因是因为在这种情况下(bar图表的图)图例中的对象是patches,而在您的图中它们是lines
FaceColor仅适用于修补程序,而不适用于lines
解决问题的最简单方法应该是颠倒“从一开始”绘制线条的顺序,这样做,直接使用从colormap中提取的颜色集。
然而,如果你想在绘制图形后使用legend,除了修改legend中的项目外,如果你想使用从colormap中提取的颜色集,你还必须改变图中线条的颜色(目前在你的图片中,有些线条共享相同的颜色)。
可以通过两个步骤来解决这个问题:

  • 恢复图例中的字符串并更改图中线条的颜色
  • 相应地更新图例中线条的颜色

这两个步骤是必需的,因为当您更改图中线条的颜色时,图例中的项目将自动更新。
关于你发布的代码:你可以通过数组b访问图例的字符串和线条的颜色。
您可以访问绘制的线的句柄,如下所示:

p_h=get(gca,'children')

由于您已经绘制了10条线,因此数组b构建如下:

  • B(1:10)包含string的句柄
  • B(11:2:30)包含lines的句柄
  • B(12:2:30)包含markers的句柄

要更改图例位置,可以设置其location属性:要将其放在axes之外,您可以将其设置为:

'NorthOutside'       outside plot box near top
    'SouthOutside'       outside bottom
    'EastOutside'        outside right
    'WestOutside'        outside left
    'NorthEastOutside'   outside top right (default for 3-D plots)
    'NorthWestOutside'   outside top left
    'SouthEastOutside'   outside bottom right
    'SouthWestOutside'   outside bottom left

在下面的代码中,您可以找到实现上述建议的代码。

figure
% Initial plot
h_p=plot(0:.1:2*pi,bsxfun(@plus,sin([0:.1:2*pi]),[3:3:30]'),'linewidth',3)
% Initial legend
[h_leg,b]=legend(cellstr(strcat(repmat('sin(x)+',10,1),num2str([3:3:30]'))))
%
% YOUR CODE TO GENERATE NTHE NEW COLORS
%
map = colormap; % current colormap
n = size(b,1);
z = linspace(size(map,1),1,n/3); % there is 1 text and 2 line elements for every data series, so I divide by 3
z = round(z); %otherwise matlab gets angry that indices must be real integers or logicals
MAP = map(z(:),:); % gets elements specified by linspace from colormap
%
% Reverse the legend strings
%
rev_str=flipud(get(b(1:10),'string'))
%
% Get the handles of the lines in the legend
%
b1=b(11:2:30)
%
% Revere the string in the legend
% and update the color of the lne in the plot using the colors defined in
% MAP
%
p_h=get(gca,'children')
for i=1:10
   set(b(i),'string',rev_str{i})
   set(p_h(i),'color',MAP(i,:),'linewidth',3)
end
%
% Reverse the color of the lines in the legend
for i=1:10
   set(b1(i),'color',MAP(i,:),'linewidth',3)
end
%
% Move the legend outside the axes
%
set(h_leg,'location','NorthEastOutside')

原创剧情

更新的图

希望这对你有帮助。

gxwragnw

gxwragnw2#

从R2023b开始,图例有一个“方向”属性,允许您反转图例的条目。还有一个额外的功能,默认情况下将反转某些图表的图例,如面积图和堆叠条形图:

bar(magic(5), 'stacked');
l = legend;

相关问题