如何更改图例的外观(文本颜色,线宽等)?

时间:2017-05-02 03:37:00

标签: matlab plot legend

我尝试了以下代码:

x = [1 2];
y = [32 38];
x1 = [1 2];
y1 = [23 27];
x2 = [1 2];
y2 = [30 36];
x3 = [1 2];
y3 = [25 29];
p1=plot(x,y,'-rd','LineWidth',2,'MarkerEdgeColor','k',...
                  'MarkerFaceColor','r','MarkerSize',10);
hold all
p2=plot(x1,y1,'-gp','LineWidth',2,'MarkerEdgeColor','k',...
                    'MarkerFaceColor','g','MarkerSize',10);
p3=plot(x2,y2,'-cs','LineWidth',2,'MarkerEdgeColor','k',...
                    'MarkerFaceColor','c','MarkerSize',10);
p4=plot(x3,y3,'-m^','LineWidth',2,'MarkerEdgeColor','k',...
                    'MarkerFaceColor','m','MarkerSize',10);
xlim([0 3]);
ylim([0 40]);
ax = gca;
c = ax.Color;
ax.YGrid = 'on';
set(gca,'XTick',[0 1 2]);
hYLabel=ylabel('US$');
hXLabel = xlabel('Test');
hTitle=title('Test');
h = get(gca,'Children');
M = {'L1', 'L1 a1 a2', 'L1 b1 b2', 'L1 c1 c2', 'L1 d1 d2'};
hLegend=legend(h,M(2:5),'Location','NorthEast');
set([gca,hTitle,hXLabel,hYLabel,hLegend], 'FontName', 'Helvetica','FontSize', 8); 
set(hTitle,'FontSize', 11); 

但它并没有给我我想要的结果。这就是我要做的事情:

  1. 我想更改图例的文字颜色,并增加图例之间的间距。
  2. 是否有可能更改标记边线的宽度?
  3. 修改

    根据您的建议,我编辑了以上代码:

    clear all;clf;
    
    x = [1 2];
    y = [32 38];
    x1 = [1 2];
    y1 = [23 27];
    x2 = [1 2];
    y2 = [30 36];
    x3 = [1 2];
    y3 = [25 29];
    plot(x,y,'-r','LineWidth',2);
    p1=plot(x,y,'-rd','LineWidth',1,'MarkerEdgeColor','k',...
                      'MarkerFaceColor','r','MarkerSize',10);
    hold all
    plot(x1,y1,'-gp','LineWidth',2);
    p2=plot(x1,y1,'-gp','LineWidth',1,'MarkerEdgeColor','k',...
                        'MarkerFaceColor','g','MarkerSize',10);
    plot(x2,y2,'-cs','LineWidth',2);
    p3=plot(x2,y2,'-cs','LineWidth',1,'MarkerEdgeColor','k',...
                        'MarkerFaceColor','c','MarkerSize',10);
    plot(x3,y3,'-m^','LineWidth',2);
    p4=plot(x3,y3,'-m^','LineWidth',1,'MarkerEdgeColor','k',...
                        'MarkerFaceColor','m','MarkerSize',10);
    xlim([0 3]);
    ylim([0 40]);
    ax = gca;
    c = ax.Color;
    ax.YGrid = 'on';
    set(gca,'XTick',[0 1 2]);
    hYLabel=ylabel('US$');
    hXLabel = xlabel('Test');
    hTitle=title('Test');
    h = get(gca,'Children');
    M = {'L1','L1 a1 a2', 'L1 b1 b2',   'L1 c1 c2', 'L1 d1 d2'};
    [hLegend, hObjects] = legend(h, M(2:5), 'Location', 'NorthEast');
    pos = get(hLegend, 'Position');
    set(hLegend, 'Position', pos+[-0.02 -0.1 0.02 0.1]);
    set(hObjects(6:2:12), 'LineWidth', 1);
    set(hObjects(1:4), {'Color'}, {'m'; 'c'; 'g'; 'r'});
    set([gca,hTitle,hXLabel,hYLabel,hLegend], 'FontName', 'Helvetica','FontSize', 8); 
    set(hTitle,'FontSize', 11); 
    

    但传说搞砸了。代码有什么问题?我绘制了两次,并将第一行的线宽更改为第二行的宽度,将第二行的线宽更改为标记边缘。

    enter image description here

1 个答案:

答案 0 :(得分:2)

首先,如果要更改绘图中标记边缘的宽度,则必须调整'LineWidth' property。这会影响标记边缘的厚度以及绘制线条的粗细。如果您希望将这些设置为不同的厚度,则必须将每一行绘制两次:一次没有标记('Marker' property设置为'none',默认值),一次仅使用标记({ {3}}设置为'none')。如果您只想更改图例的线宽,但图,请参见下文。

您可以通过捕获图例中从'LineStyle' property函数返回的对象的句柄,轻松更改图例的各个方面。您可以将上面创建图例的代码中的行更改为:

[hLegend, hObjects] = legend([p1 p2 p3 p4], M(2:5), 'Location', 'NorthEast');

请注意,我没有传递axis子句柄的向量,而是显式传递了从'plot'命令返回的句柄的向量。如果图例中还有其他您不想要的绘图对象,并且可以更好地控制图例中对象的顺序,则必须这样做。

现在您拥有图例对象的句柄,您可以更改图例的各个方面。例如,这会使图例变大并更改文本颜色(请注意颜色顺序与传递给legend的行句柄向量的顺序相匹配):

pos = get(hLegend, 'Position');
set(hLegend, 'Position', pos+[-0.02 -0.1 0.02 0.1]);
set(hObjects(1:4), {'Color'}, {'r'; 'g'; 'c'; 'm'});

此外,如果要更改图例标记的边缘厚度,而不是图形标记,则可以执行以下操作:

set(hObjects(6:2:12), 'LineWidth', 1);

这是您从上面得到的样本图像(分别绘制线条和标记以相应地调整线宽):

legend