FontSize für die Legende des Bildes in Matlab

  • Ich habe den folgenden Code:

     X = 0:pi/100:0.25*pi;
    Y1 = sin(X);
    Y2 = cos(X);
    Y3 = tan(X);
    fh = figure('toolbar','none','menubar','none','Units','characters');
    Pan1 = uipanel(fh,'Units','normalized','Position',[0 0 0.5 1],'title',...
      'Panel1');
    Pan2 = uipanel(fh,'Units','normalized','Position',[0.5 0 0.5 1],'title',...
      'Panel2');
    haxes = axes('Parent',Pan2,'Units', 'normalized','Position',...
    [0.125 0.1 0.75 0.75]);
    hplot = plot(haxes,X,Y1,X,Y2,X,Y3);
    xlabel(haxes,'Time (second)');
    ylabel(haxes,'Amplitude (meter)');
    title(haxes,'Trigonometric functions');
    Ley = {'Sine function','Cosine function','Tangent function'}; %# legend's strings values
    legend(haxes,Ley,'Location','SouthOutside');
    [FileName,PathName,FilterIndex] = uiputfile('*.bmp;*.png;*.jpg;*.tif','Save as');
    ftmp = figure('Menu','none','Toolbar','none','Units','normalized',...
      'Position',[-1000 -1000 1 1]);
    set(gcf,'PaperPositionMode','auto');
    set(gcf,'InvertHardcopy','off');
    new_axes = copyobj(haxes, ftmp);
    legend(new_axes,Ley,'Location','SouthOutside','FontSize',8);
    set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);
    fmtgraf = {'-dbmp','-dpng','-djpeg','-dtiff'};
    fmt = fmtgraf{FilterIndex};
    print(ftmp,fmt,FileName,'-r0');
    delete(ftmp);
    delete(fh);
     

    Wie im Code zu sehen, die Legende der Befehlszeile

    (new_axes, Ley, 'Location', 'SouthOutside', 'FontSize', 8);

    wird vor der Befehlszeile ausgeführt.

      set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);
     

    Aus diesem Grund erscheint das Bild, wie unten gezeigt, durch den unteren Teil geschnitten (unabhängig davon, ob die Eigenschaft / der Wert 'FontSize' vorhanden ist oder nicht.) FontSize für die Legende des Bildes in Matlab

    Wenn die Befehlszeile

    ist
      legend(new_axes,Ley,'Location','SouthOutside','FontSize',8);
     

    wird nach der Befehlszeile ausgeführt

      set(new_axes,'Units','normalized','Position',[0.1 0.1 0.8 0.8]);
     

    Das Bild wird jetzt durch den unteren Teil geschnitten, aber in diesem Fall ist weder der Text für die x-Beschriftung noch das Legendenfeld (wie unten zu sehen) FontSize für die Legende des Bildes in Matlab

    zu sehen

    Wenn 'FontSize',8 unterdrückt wird, ist alles in Ordnung. Wie kann ich das beheben, wenn die Legende eine geringere Größe haben soll?

    23 November 2011
    julianfperez
2 answers
  • Es funktioniert auch für mich ... Sie müssen verstehen, dass LEGEND grundsätzlich eine andere Achseninstanz in der Figur erstellt.

    Jetzt platzieren Sie sie mit 'SouthOutside' Position, es wird also versucht, die Größe der vorhandenen Achse zu ändern, um sich darunter zu platzieren. Wenn Sie nicht genügend Platz lassen, passt sie möglicherweise nicht, vor allem, weil Sie 'normalized' -Einheiten verwenden, durch die die Achsen automatisch skaliert werden

    Versuchen Sie, die Hauptploteachse im Voraus vertikal zu verkleinern, um der Legende mehr Platz zu geben ...

    Auch die Reihenfolge der Befehle spielt eine Rolle. Vergleichen Sie dies:

     new_axes = copyobj(haxes, ftmp);
    legend(new_axes, Ley, 'Location','SouthOutside', 'FontSize',8);
    set(new_axes, 'Units','normalized', 'Position',[0.1 0.1 0.8 0.8]);
     

    dagegen:

     new_axes = copyobj(haxes, ftmp);
    set(new_axes, 'Units','normalized', 'Position',[0.1 0.1 0.8 0.8]);
    legend(new_axes, Ley, 'Location','SouthOutside', 'FontSize',8);
     

    BEARBEITEN:

    Wie bereits erwähnt, erstellt LEGEND nur eine weitere Achse. Für die endgültige Kontrolle können Sie daher alle Achsen manuell in der Abbildung positionieren (geben Sie die tatsächlichen Positionen an, anstatt sich auf "außerhalb" -Werte für die 'Location' -Eigenschaft zu verlassen, die von der Funktion legend verfügbar gemacht wird). Hier ein Beispiel zur Veranschaulichung:

     %# create a normal plot
    clf
    hAx = axes();
    plot(hAx, rand(10,3))
    xlabel(hAx, 'xlabel'), title(hAx,'title')
    
    %# add a legend on the inside and record the axis outerposition (in pixels)
    hLgnd = legend(hAx, {'1' '2' '3'}, 'Location','South', 'FontSize',8);
    set(hLgnd, 'Units','pixels')
    op = get(hLgnd,'OuterPosition');
    set(hLgnd, 'Units','normalized')
    
    %# resize the plot axis vertically to make room for the legend
    set(hAx, 'Units','pixels')
    pos = get(hAx,'Position');
    ins = get(hAx,'TightInset');
    set(hAx, 'Position',[pos(1) pos(2)+op(4) pos(3) pos(4)-op(4)])
    set(hAx, 'Units','normalized')
    
    %# move the legend to the bottom in the free space
    set(hLgnd, 'Units','pixels')
    set(hLgnd, 'OuterPosition',[op(1) (pos(2)-ins(2))/2 op(3) op(4)])
    set(hLgnd, 'Units','normalized')
     

    FontSize für die Legende des Bildes in Matlab

    Probieren Sie es für verschiedene Figurengrößen aus und führen Sie den Code erneut aus. Beachten Sie, dass Sie die Größe der Achsen automatisch anpassen müssen, wenn Sie die Größe der Figur ändern, wenn Sie möchten, dass die Achsen die gleiche Größe haben wie der obige Code im 'ResizeFcn' Ereignishandler der Figur, dh:

     set(gcf,'ResizeFcn',@myEventHandler)
     
    23 November 2011
    Amrouser1132254
  • Es funktioniert gut für mich:

    FontSize für die Legende des Bildes in Matlab

    Ich habe festgestellt, dass unsere Screenshots unterschiedliche Seitenverhältnisse haben . Vielleicht hat Ihr Monitor ein Breitbild-Seitenverhältnis? Mit der Option 'units' 'normalized', die Sie auf die neuen Achsen anwenden, werden deren Abmessungen relativ zum Monitor festgelegt, auf dem sie angezeigt werden. Wenn Sie eine breitere Figur erstellen, schneidet MATLAB die Legende möglicherweise von unten (die Grafiken sind nicht perfekt).

    Mein Rat wäre, vielleicht die Achseneinheiten direkt einzustellen Verwenden Sie 'units' 'pixels' mit einem quadratischeren Seitenverhältnis.

    Eine andere Option könnte die Legende mit 'orientation' 'horizontal' erstellen, wodurch die Elemente verteilt werden weniger Höhe, oder um es in der Grafik zu platzieren, vielleicht 'SouthEast'.

    22 November 2011
    Sam Roberts