Verfasst am: 02.04.2016, 10:30
Titel: manuelle yTickLabels für plotyy
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...
% 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.
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
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.
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.
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.
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.
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.
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.
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
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.