WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

manuelle yTickLabels für plotyy

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 02.04.2016, 10:30     Titel: manuelle yTickLabels für plotyy
  Antworten mit Zitat      
Hallo goMatlab Forum,

ich versuche gerade eine Funktion zum manuellen Setzen der yticks und ylabels für beide y-Achsen von plotyy zu erstellen. Die Labels sind schon im Fullview je nach Wertebereich recht dünn gesetzt (teilweise nur 3 Labels pro Achse). Zoom man dann noch einen recht kleinen Bereich, kommt es oft vor, dass gar keine Labels mehr angezeigt werden.

Daher möchte entsprechend der y-Limits die ticks und labels manuel setzen. Die Funktion liefert auch wie gewünscht 5 Labels. Doch je nach Zoombereich, passen die Labels der rechten y-Achse nicht zur linken, sprich liegen nicht auf der Höhe der Gridlinien von der linken Achse (siehe Anhang).

Hat vielleicht jemand eine Idee, wie ich die Achsen angleichen kann? Hier meine bisherige Funktion...

Code:

function set_yTickLabels_plotyy(axhYY)
    % get y-axis limits
    ylims1 = get(axhYY(1),'YLim');
    ylims2 = get(axhYY(2),'YLim');
    % create 10 ticks
    ticks1 = linspace(ylims1(1),ylims1(2),5);
    ticks2 = linspace(ylims2(1),ylims2(2),5);    
   
    % delta y = tick range
    dy1 = diff(ticks1(1:2));
    dy2 = diff(ticks2(1:2));
   
    % get precision
    n1 = 0;
    if dy1 < 1
        % get exponent format
        prec = sprintf('%e',dy1);
        idx = strfind(prec,'-');
        % cut exponent from number
        n1 = str2double(prec(idx+1:end));
    end
   
    n2 = 1;
    if dy2 < 1
        % get exponent format
        prec = sprintf('%e',dy2);
        idx = strfind(prec,'-');
        % cut exponent from number
        n2 = str2double(prec(idx+1:end));
    end
   
    % round ticks by precision n
    ticks1 = round(ticks1,n1);
    ticks2 = round(ticks2,n2);
   
    % preallocate
    ticklabels1 = cell(5,1);
    ticklabels2 = cell(5,1);
    % create ticklabels
    for i=1:5
        ticklabels1{i} = num2str(ticks1(i));
        ticklabels2{i} = num2str(ticks2(i));
    end
    % set new ticks
    set(axhYY(1),'YTick',ticks1)
    set(axhYY(2),'YTick',ticks2)
    % and labels
    set(axhYY(1),'YTickLabel',ticklabels1)
    set(axhYY(2),'YTickLabel',ticklabels2)
end
 


Ich habe mich auch im File Exchange nach Funktionen für Ticklabels umgesehen. Leider sind die meisten nur für eine y-Achse ausgelegt, oder verändern lediglich das Format der Labels, nicht aber die Anzahl.

Ich freue mich über eure Hilfe/Ideen.

Gruß DSP

set_plotyy_Labels.png
 Beschreibung:

Download
 Dateiname:  set_plotyy_Labels.png
 Dateigröße:  44.27 KB
 Heruntergeladen:  269 mal
Private Nachricht senden Benutzer-Profile anzeigen


BBecks
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2016, 12:02     Titel:
  Antworten mit Zitat      
Hey DSP,

hast du es schon mit dem Befehl 'linkaxes' probiert?
Ich habe mir mal ein kleines Script geschrieben das die Verwendung zeigen sollte

Code:

clear all
close all
clc

t=0:0.01:10;

y1=sin(t);
y2=0.5*cos(t);

ah = plotyy(t,y1,t,y2);
% ohne linkaxes richtet sich die Skalierung nach den Maximalwerten der jeweiligen Funktion
linkaxes(ah);
% mit linkaxes richtet sich die Skalierung nach den Maximalwerten der ersten Funktion
 


Bin mir nicht ganz sicher, ob ich dein Problem richtig interpretiert habe?

Beste Grüße
BBecks
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 02.04.2016, 12:32     Titel:
  Antworten mit Zitat      
Hallo,

linkaxes macht imho bei plotyy wenig Sinn, gerade dann wenn der y-Wertebereich der beiden Achsen vollkommen unterschiedlich ist. Also z.B. linke Achse liegt im negativen und die rechte Achse im positiven Bereich.

Achte mal im Bild auf die orange Skala und die Gridlinien. Nur das -1 Label passt zur Gridlinie, welche eben nach der linken Achse ausgerichtet werden. Ich hätte gern die Labels auf beiden Seiten an den Gridlinien. Außerdem werden ja jeweils nur 4 Labels angezeigt, obwohl ich 5 manuell erstellt habe.

Vielleicht ist es ja jetzt verständlich.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 02.04.2016, 14:45     Titel:
  Antworten mit Zitat      
Hallo,

ohne den konkreten Aufruf der Funktion ist es schwierig zu erahnen, warum nur vier Ticks gezeichnet werden.
Grundsätzlich sollte es möglich sein, mit den Eigenschaften YLim, YTick, YTickLabel alles anzupassen. Allerdings gibt es miteinander in Konflikt stehende Anforderungen: Ticks an gerundeten Werten und übereinstimmende Tickpositionen. Da muss man wohl Prioritäten setzen, oder auch YLim entsprechend anpassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 03.04.2016, 10:16     Titel:
  Antworten mit Zitat      
Hallo,

die Funktion kann wie folgt getestet werden:

Code:

function TickLabelsTest()
    hfig = figure(1);

    [axhYY,~,~] = plotyy(gca,1:100,randn(100,1)*4,1:100,randn(100,1));    
    grid on

    % set proper yTickLabels
    set_yTickLabels_plotyy(axhYY)

    % get handle
    hZoom = zoom(hfig);            
    % define zoom callback
    set(hZoom,'Enable','on','RightClickAction','InverseZoom','ActionPostCallback',@ZoomAction)

    function ZoomAction(~,~)
        % set proper yTickLabels
        set_yTickLabels_plotyy(axhYY)
    end
end
 


Sicherlich könnte man auf das Runden verzichten, hätte dann aber vor allem bei einem größeren Wertebereich unnötige Kommastellen. Um das zu vermeiden, wollte ich nur so viele Kommastellen anziegen wie notwendig, damit die Ticks immer eine ansteigende Folge haben. Ansonsten würde es ja eine Fehlermeldung geben. Ebenfalls muss ich die Ticks runden und nicht einfach nur bei den Labels die unnötigen Kommastellen abschneiden, denn sonst würden die Labels ja einen falschen Wert anzeigen. Sprich der Tick ist z.B. 2.5 aber das Label zeigt nur 2.

Allerdings fiel mir dann gestern schon auf, dass ich durch das Runden mit dem ersten bzw. letzten tick Wert außerhalb der YLimits landen könnte. Da fällt mir momentan aber noch keine richtige Lösung zu ein.

Auf das Ändern von YLim möchte ich verzichten, da ja der User selbst einen Zoombereich festgelegt hat. Das könnte dann zu Irritationen führen, wenn in der set_yTickLabels_plotyy Funktion auf einmal die Limits geändert werden.

Ich vermute aber mal, dass es kaum möglich sein wird, die beiden Achsen an ein Grid anzupassen. Sonst würde das ja die plotyy Funktion schon selbst liefern. Keine Labels an den Achsen ist aber auch keine Lösung.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.04.2016, 18:39     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Ich vermute aber mal, dass es kaum möglich sein wird, die beiden Achsen an ein Grid anzupassen.

Wenn der Bereich nicht angepasst werden darf und die Ticks nicht an krummen Zahlen sein dürfen, sehe ich das auch so.
Eine Variante wäre, die Ticks auf z.B. 1/100 des sichtbaren Bereichs zu runden. Bei [0, 1] stünde da dann nicht 0.3456, sondern 0.35.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 03.04.2016, 19:26     Titel:
  Antworten mit Zitat      
Hallo Harald,

ehrlich gesagt verstehe ich deinen Vorschlag nicht. Wie kommst du bei den Limits [0 1] auf 0.3456?

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.04.2016, 20:23     Titel:
  Antworten mit Zitat      
Hallo,

sorry, das war nur ein Beispiel.
Etwas ausführlicher: im rechten Koordinatensystem sind die Grenzen [0, 1]. Eine Gitterlinie im linken Koordinatensystem ist nun als Beispiel so platziert, dass das im rechten Koordinatensystem einem Wert 0.3456. Da man den Unterschied aber ohnehin nicht wirklich erkennen kann, könnte man dort 0.35 hinschreiben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 03.04.2016, 21:34     Titel:
  Antworten mit Zitat      
Aber woher weiß ich denn welchen Wert die Gitterlinie von der linken Seite auf der rechten Seite hat?

Wenn ich mich nicht irre, liegen die Ticks links und rechts jeweils an einer Linie, wenn die Schrittweite der Ticks links zu rechts ein ganzes Vielfaches haben. Wenn ich das Runden nämlich weglasse, passen die Ticks immer auf beiden Seiten zu den Gridlinien.

Durch das Runden können unterschiedliche Schrittweiten zwischen den Ticks einer y-Achse entstehen. Vor dem Runden sind sie ja auf Grund von linspace noch äquidistant. Wenn unterschiedliche Schrittweiten vorkommen, passen die Ticks der rechten Seite nicht mehr zu den Gitterlinien.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.04.2016, 21:43     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Aber woher weiß ich denn welchen Wert die Gitterlinie von der linken Seite auf der rechten Seite hat?

Sollte per Interpolation lösbar sein.
Code:
tickvaluesRight = interp1(leftLimits, rightLimits, tickvaluesLeft);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.