Verfasst am: 26.03.2008, 08:32
Titel: yAchse links und rechts vom Plot skalieren & beschriften
Hallo,
ich würde gerne wissen, wie ich die y-Achse eines Plots auf der linken und rechten Seite des Plots verschieden skalieren und beschriften kann, da ich zwei verschiedene Datensätze mit unterschiedlichen Einheiten in dem gleichen Plot darstellen möchte.
Im Prinzip soll es so sein, wie plotyy, jedoch ist bei mir die eine function mit der bar funktion geplottet. Jemand eine Idee wie man das lösen kann?
Grüße,
fjae
nschlange hat schon zwar die Frage vor mir beantwortet, aber vielleicht kannst du es kombinieren.
Ich hab es damals auch gebraucht und habe es auch mit 2 Axes gelöst.
Ich kannte damals diesen Forum noch nicht musste es selber machen.
Deswegen habe ich damals nicht mit Überdeckung der Axes gelöst, sondern mit einem zusätzlichen ganz schmalen Axes
Habe aus meinem Programm ein kleiner Beispiel gebastelt
vielleicht hilft es dir weiter.
Code:
classnames={'a','b','c','d','e'};
maxSamples= [206,613,1348,1290,3073];
barval=[0.9854, 0, 0;
0.7651, 0.1207, 0.0457;
0.8435, 0.0512, 0.0134;
0.8744, 0.0767, 0.0109;
0.8415, 0.0596, 0.0091];
figure;
%
%%% Erstes Axes so definieren % damit noch einwenig Platz rechts bleibt für 2.Axes
h1=axes('position',[.1 .1 .8 .8]);
barh(h1,barval,'stack');
ylim(h1,[0length(classnames)+1]);
set(h1,'YTick',(1:length(classnames)));
set(h1,'YTickLabel',classnames,'YDir','reverse');
%
%%%% Zweites Axes ganz dünn definieren
h2=axes('position',[.9 .1 .001 .8]);
% Tickposition Rechts set(h2,'YAxisLocation','right');
% gleiche Wert eingabe wie für Erstes Axes ylim(h2,[0length(classnames)+1]);
set(h2,'YTick',(1:length(classnames)));
%
% Neue Ticknamen Setzen set(h2,'YTickLabel',maxSamples,'YDir','reverse');
%
xlim(h1,[01]) set(h1,'XTick',[0 , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]')
Herzlichen dank für Eure Antworten! Hat mir sehr weitergeholfen! Eine kleine Anmerkung noch zu
set(ax2,'YLim',[0 10]);
wichtig war noch, dass ich die X-Achsen beider Plots gleich skaliere, da sonst die beiden Kurven nicht richtig übereinander lagen.
Hi,
ich habe das gleiche Problem, dass ich die rechte Y Achse gern beschriften würde. Jetzt bin ich nach nschlange seinem Tip vorgegangen und es hat auch funktioniert! Vielen Dank erstmal dafür!
Allerdings habe ich noch ein wenig probleme die Funktionen zu halten.
Mein erstes Problem ist, dass über eine Funktion eine Extremstelle in einem gewissen Zeitraum markiert wird. Es wird dann beispielsweise ein maximum markiert. Allerdings verschwindet der Plot "long" dann einfach. Ist natürlich etwas ungünsig Hab schon sämtliche hold befehle ausprobiert, aber entweder ist alles weg oder nur der rote Graph.
Des weiteren ist die Beschriftung der X-Achse zu nahe an der Achse dran.
Ich denke das liegt daran, dass AX2 keinen Xtick hat (da Plot 1 und Plot 2 die gleiche X achse haben), sich die Achsenbeschriftung aber auf Plot2 bezieht. Ich habe schon probiert das irgendwie mit:
set(ax1,'xlabel','...');
zu ändern, bekomme aber immer Fehlermeldungen.
Hat vielleicht jemand einen Tip für mich?
Oder soll ich sogar ganz anders vorgehen?
Habe zwei Messwertreihen.. Beide sollen logarithmisch an der Y achse angezeigt werden und haben auch den gleichen Bereich. An der linken Achse steht lediglich der Zahlenwert, rechts einfach nur eine klassifizierung der Werte. Mehr nicht.
Gruß
Edit: Achso, x und rechte y Achsenbeschriftug verschwindet ebenfalls habe ich gerade gemerkt, sobald die extremwerte markiert werden. Es gibt also allen Anschein nach ein Problem AX2 mit dem Plot zu halten.
So.. Also wie gesagt, klappt erstmal. Das Problem mit der X-Achsenbeschriftung hat sich dadurch erledigt. Das stimmt jetzt soweit.
Allerdings habe ich jetzt nach wie vor das Problem, dass mit "hold on" nur der blaue Graph gehalten wird und der rote verschwindet. Langsam weis ich nicht weiter..
Also grundsätzlich werden beide Graphen geplottet. Nun habe ich allerdings verschiedene Funktionen, wo ich mir zb die Messwerte der letzten 90 Tage anschauen kann. D.h. ich kann immer vor und zurück blättern. An dieser Stelle funktioniert auch alles. Doch sobald ich Extremwerte markieren möchte, tritt dieses Problem auf.
Die Funktionsweise ist an der Stelle recht banal. Es wird in einem gewissen Zeitraum nach dem Maximum gesucht. Es wird also mit dem max() Befehl die Messwerte abgesucht und bei dem Maximum wird der Wert zum gewissen Zeitpunkt mit einem Punkt zusätzlich in subplot(2,1,1) eingetragen. Da passiertes dann, dass ein Graph verschwindet, der andere allerdings noch angezeigt wird.
Hat dann vielleicht jemand irgend einen Tipp?
Gruß
Edit: Achso, rechte Y - Achsenbeschrifung, ytick usw verschwindet dann auch..
Vielen Dank für deine Antwort!
Ich habe auch schon vermutet das die beiden übereinander liegen, daher hab ich es nochmal mit plotyy probiert.
Eigentlich bin ich davon ausgegangen, dass plotyy ein Plot mit 2 Graphen darstellt. In meinem ersten Versuch sah es für mich eher danach aus, dass ich zwei Plots übereinanderlege.
Allerdings ist ja nicht nur das der Graph verschwindet sondern auch alle vorgenommenen Einstellungen zur rechten Y-Achse.
Ich wüsste auch nicht wie ich das anders Skalieren soll, da es sich um zwei Messwertereihen handelt, bei denen zur gleichen Zeit die Leistungsdichte aufgenommen wurde. Lediglich die Frequenz unterscheidet sich.
Hallo, also die Messwerte kann ich nicht ganz so einfach zur Verfügung stellen, da diese aus einer Textdatei gewonnen werden und das hier evtl. den Rahmen sprengen würde. Das sind dann immer maximal 864 Werte für short und long.
Ich werde aber gleich mal ein Script machen, in extrem abgewandelter Form das etwa 10 Manuel generierte Werte zur Verfügung stellt, diese Plotter und auch einen Pushbutton zur Maximafindung beinhaltet.
Ich probiere das so kurz wie möglich zu halten, aber dennoch die Funktionsweise komplett rüberzubringen.
Aber paar Minuten brauche ich noch
So sorry, hat einen Moment gedauert und ist leider doch etwas länger geworden. Aber nun kann man eigentlich jeden Schritt besser erklären und nachvollziehen.
Hier erst einmal der erste Code:
short = [1.04e-08;1.41e-08;1.05e-07;1.18e-06;1.12e-07;1.02e-08;1.04e-09;1.00e-09;1.06e-07;1.74e-08];
long = [1.04e-06;1.41e-04;1.05e-07;1.18e-06;1.12e-06;1.02e-06;1.04e-06;1.00e-07;1.06e-07;1.74e-07];
type = [100];
short und long sind meine Messwerte. Diese habe ich jetzt für das Beispiel manuell generiert. type ist eigentlich erstmal egal.. Ich habe das jetzt auch manuell festgelegt, normalerweise wird diese Variable anhand der verschiedener Parameter ermittelt. Ich habe das jetzt auch nur mit reingenommen, da sich eine IF-Abfrage auf den type bezieht, welche wiederum verschiedene Informationen zum Plot hinzufügt.
Nach dem plotyy -Befehl folgt erstmal hold on, da sonst beim Ausführen des zweiten Codes eine neue Figure erstellt wird, was ja nun nicht das Ziel ist.
annotation(f,'textbox', [.05 .85 .95 .1], 'EdgeColor', 'none', 'Tag' , 'Peakfinder_Headline', 'string',... ['Figure wird über GUI aufgerufen und bietet verschiedene Auswahlmöglichkeiten '...
'Gleichzeitig wird der erste Peak dargestellt']);
Der zweite Code (wieder sehr stark vereinfacht) wird über eine GUI aufgerufen. Es öffnet sich die Figure "Peakfinder", in der man normalerweise verschiedene Auswahlmöglichkeiten hat (next peak, previous peak, cancel).. In dieser Figure wird dann normalerweise auch der Zeitraum der Suche nach dem Maximum angegeben, zu welcher Zeit eins gefunden wurde und mit welcher Leistungsdichte. Aber da habe ich jetzt auch größtenteils drauf verzichtet.
Mein Problem wird allerdings deutlich:
Beim Ausführen des Skriptes wird das Maximum gesucht, gefunden und in figure(1) markiert. Nur verschwindet der benötigte Graph, der andere bleibt allerdings stehen. Die Markierung der Y-Achse.. ytick, yticklabel usw. ist nicht mehr vorhanden.
das liegt an dem zweiten Aufruf des SUBPLOT-Befehls.
Wenn man SUBPLOT nicht die Axes mitteilt, löscht SUBPLOT einfach die zweite Axes.
Auf jedenfall musst dem SUBPLOT dies Axes mitteilen: subplot(AX(1));
Code:
short = [1.04e-08;1.41e-08;1.05e-07;1.18e-06;1.12e-07;1.02e-08;1.04e-09;1.00e-09;1.06e-07;1.74e-08];
long = [1.04e-06;1.41e-04;1.05e-07;1.18e-06;1.12e-06;1.02e-06;1.04e-06;1.00e-07;1.06e-07;1.74e-07];
type = [100];
annotation(f,'textbox', [.05 .85 .95 .1], 'EdgeColor', 'none', 'Tag' , 'Peakfinder_Headline', 'string',... ['Figure wird über GUI aufgerufen und bietet verschiedene Auswahlmöglichkeiten '...
'Gleichzeitig wird der erste Peak dargestellt']);
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.