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

Plot: Drei Graphen, Zwei verschiedene Y-Achsen ?!

 

Mandel
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2013, 14:59     Titel: Plot: Drei Graphen, Zwei verschiedene Y-Achsen ?!
  Antworten mit Zitat      
Hallo zusammen,

Ich möchte eine einzige Grafik/Figure erstellen, in welche drei verschiedene Graphen eingetragen werden sollen.
Zwei davon sollen zu einer Y-Achse am linken Rand gehören und einer soll eine eigene Y-Achse rechts an der Grafik haben. Die X-Achse soll die gleiche sein. Irgendwie bekomm ich das nicht hin Sad

Vielen Dank schon mal für euere Hilfe! Smile
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.03.2013, 16:43     Titel: Re: Plot: Drei Graphen, Zwei verschiedene Y-Achsen ?!
  Antworten mit Zitat      
Hallo Mandel,

Was hast Du denn bisher versucht und was hat nicht funktioniert?
es ist immer viel leichter einen Verbesserungsvorschlag zu machen, als den ganzen Code zu erstellen und dabei zu erraten, wie Deine Inputs aussehen könnten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.03.2013, 17:42     Titel:
  Antworten mit Zitat      
ich kenn mich mit Matlab nur recht wenig aus. Gerade die Darstellung der Ergebnisse lief bei mir immer recht einfach.
Code:
und gut war Very Happy

Ich hab als einfache Lösung plotyy gefunden, aber da kann ich keine zwei Graphen auf eine Seite nehmen und einen dritten auf die andere.

Das einzige, was ich mir selbst versucht habe zusammen zu basteln, funktioniert nicht und sieht so aus:
Code:
   f=figure(1);
   a1 = axes('YAxisLocation','left');
   h=plot(a1,x,f1,x,f2);
   axis(Axis);
   hold on
   a2 = axes('YAxisLocation','right');
   h2=plot(x,f2./f1);
   axis([Axis(1) Axis(2) 0 1]);
   set(a2,'YAxisLocation','right');
Funktioniert nicht heißt, dass das ich nur die dritte Funktion (f2./f1) sehe. Zwar mit der Achse auf der richtigen/rechten Seite, aber die beiden anderen Funktionen seh ich nicht Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.03.2013, 18:10     Titel:
  Antworten mit Zitat      
Hallo Mandel,

PLOTYY kann auch zwei Graphen auf der einen und einen dritten auf der anderen Y-Achse darstellen.

Auf http://www.mathworks.com/help/matla.....ultiple-x-and-y-axes.html wird erklärt, wie man die Handles der beiden AES-Objekte erhält und dann z.B. per LINE() weitere Objekte in eines der AXES zeichnen kann. Zudem kann man bei den Inputs von PLOTYY (und auch PLOT) auch ein Array angeben:
Code:
x = rand(5,5);
t = 1:5;
plot(t, x);

Hier werden 5 Linien gleichzeitig gezeichnet.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.03.2013, 15:56     Titel:
  Antworten mit Zitat      
Vielen Dank! Das hat mir sehr geholfen Smile

Jetzt steh ich aber auch schon vor dem nächsten Problem. Folgender Code macht eigentlich genau was er soll:
Code:
   [AX,H1,H2]=plotyy(x(1:X),F1,x(1:X),F2);
    set(AX(1),'XLim',[Axis(1) Axis(2)])
    set(AX(1),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(1),'YLim',[minF1 maxF1])
    set(AX(1),'YTick',[minF1:TickY:maxF1])
   
    set(AX(2),'XLim',[Axis(1) Axis(2)])
    set(AX(2),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(2),'YLim',[minF2 maxF2])
    set(AX(2),'YTick',[minF2:0.1:maxF2])
    set(AX(2),'YColor','k');
   
    set(gcf, 'PaperUnits','centimeters')
    set(gcf, 'PaperSize',[SizeX SizeY])
   
    xl = xlabel (stringX); yl = ylabel(stringY);
    set(gca,'FontSize',10,'FontWeight','normal')
    set(xl,'fontsize',12)
    set(yl,'fontsize',12)
   

    set(H1(1),'Linewidth',2,'Color','blue','LineStyle','--')
    set(H1(2),'Linewidth',2,'Color','red','LineStyle','-')
    set(H2,'Linewidth',2,'Color','green','LineStyle','-.')
   
    set(gca,'Xcolor',[gc gc gc]);
    set(gca,'Ycolor',[gc gc gc]);
    grid on
    c_axes = copyobj(gca,gcf);
    set(c_axes, 'color', 'none', 'xcolor', 'k', 'xgrid', 'off', 'ycolor','k', 'ygrid','off');
   
    print('-depsc2','-r300',Filename);
Bis auf einen Schönheitsfehler:
Die x- bzw. y-Beschriftung passt nicht mehr auf's Bild Very Happy
Hab mir gedacht, ich versetz die Achsenbeschriftung einfach ein wenig. Aber wenn ich
Code:
set(xl,'fontsize',12,'Position',[1.495 7 0])
einsetze statt der Originalzeile, hab ich plötzlich zwei Beschriftungen im Bild.

Was mach ich falsch, und wie mach ich's richtig?!
Vielen Dank schon mal!

2.png
 Beschreibung:
Mit "set(xl,'fontsize',12,'Position',[1.495 7 0])"

Download
 Dateiname:  2.png
 Dateigröße:  19.14 KB
 Heruntergeladen:  1221 mal
1.png
 Beschreibung:
Original

Download
 Dateiname:  1.png
 Dateigröße:  18.78 KB
 Heruntergeladen:  1179 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.03.2013, 11:28     Titel:
  Antworten mit Zitat      
Keiner ne Idee ? Rolling Eyes
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2013, 14:12     Titel:
  Antworten mit Zitat      
Bin langsam echt ein wenig am Verzweifeln Sad
Hab am WE viel rumprobiert und es wurde eher alles schlimmer statt besster Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 11.03.2013, 15:28     Titel:
  Antworten mit Zitat      
Hallo Mandel,

Das PNG-Bild sieht wirklich sher merkwürdig aus: Der X-Label ist nicht nur doppelt, einer davon ist auch noch grau.
"copyobj(gca,gcf)" ist eine sehr ungewöhnliche Operation: Da wird die aktuelle AXES in die aktuelle FIGURE kopiert, aber laut Definition muss die aktuelle AXES immer im aktuellen FIGURE liegen. Wozu ist dies dann nützlich?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2013, 17:04     Titel:
  Antworten mit Zitat      
Gute Frage Rolling Eyes
Das hab ich mir mehr oder weniger aus Beispielen zusammen gebastelt...

Das es aber an "copyobj(gca,gcf)" glaub ich mittlerweile nicht.
Wenn ich den Achsenskalierungsteil raus nehme, also
Code:
  set(AX(1),'XLim',[Axis(1) Axis(2)])
    set(AX(1),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(1),'YLim',[minF1 maxF1])
    set(AX(1),'YTick',[minF1:TickY:maxF1])
   
    set(AX(2),'XLim',[Axis(1) Axis(2)])
    set(AX(2),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(2),'YLim',[minF2 maxF2])
    set(AX(2),'YTick',[minF2:0.1:maxF2])
    set(AX(2),'YColor','k');
weg lasse, sieht alles so aus, wie es aussehen soll. Nur die Axen sind nicht so skaliert, wie ich sie gern hätte Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.03.2013, 00:05     Titel:
  Antworten mit Zitat      
Hallo Mandel

Glaubst Du, dass COPYOBJ nich verantwortlich ist, oder weißt Du es?
Immerhin erstellt es eine Kopie eines Grafik-Objektes, und Du hast eine Kopie eines Grafik-Objektes zu viel in Deiner Figure.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 11:45     Titel:
  Antworten mit Zitat      
Da von wirklich wissen zu sprechen ist überrieben...
Aber Fakt ist, wenn ich den genannten Teil und NICHT COPYOBJ raus nehme ist die Schrift nicht so verschoben. Nur eben die Achsen sind nicht mehr wie sie sein sollten... Sad
Wenn ich stattdessen COPYOBJ raus nehme, sind die Achsen wie sie sein sollten, aber meine Achsenbeschriftungen fehlen Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Mandel
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 57
Anmeldedatum: 30.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.03.2013, 12:01     Titel:
  Antworten mit Zitat      
So... Hab noch bisschen rumgespielt...
Das COPYOBJ hat scheinbar die Funktion, dass ich das Grid in Grau färben kann, meine Achsen aber schwarz bleiben. Anbei ein Bild mit COPYOBJ und ohne. Hab den Quelltext mal bisschen umarrangiert:
Code:
f=figure(1);
    [AX,H1,H2]=plotyy(x(1:X),F1,x(1:X),F2);
   
   
    %axis(Axis)
    %set(gca,'XTick',Axis(1):0.5:Axis(2))
    set(AX(1),'XLim',[Axis(1) Axis(2)])
    set(AX(1),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(1),'YLim',[minF1 maxF1])
    set(AX(1),'YTick',[minF1:TickY:maxF1])
   
    set(AX(2),'XLim',[Axis(1) Axis(2)])
    set(AX(2),'XTick',[Axis(1):0.5:Axis(2)])
    set(AX(2),'YLim',[minF2 maxF2])
    set(AX(2),'YTick',[minF2:0.1:maxF2])
    set(AX(2),'YColor','k');
   
    %# figure size printed on paper
    set(gcf, 'PaperUnits','centimeters')
    set(gcf, 'PaperSize',[SizeX SizeY])
    set(gcf, 'PaperPosition',[SizeX/2*3 SizeY/2*3 SizeX*1.056 SizeY])
    if strcmp(string1,'')==0
        legend(h,string1,string2, 'Location', 'NorthWest')
    end;

    set(H1(1),'Linewidth',2,'Color','blue','LineStyle','--')
    set(H1(2),'Linewidth',2,'Color','red','LineStyle','-')
    set(H2,'Linewidth',2,'Color','green','LineStyle','-.')
   
    set(gca,'Xcolor',[gc gc gc]);
    set(gca,'Ycolor',[gc gc gc]);
    grid on
    c_axes = copyobj(gca,gcf);
    set(c_axes, 'color', 'none', 'xcolor', 'k', 'xgrid', 'off', 'ycolor','k', 'ygrid','off');
   
    xl = xlabel (stringX); yl = ylabel(stringY);
    set(xl,'FontSize',12,'FontWeight','normal','Color',[0 0 0])
    set(yl,'FontSize',12,'FontWeight','normal','Color',[0 0 0])
   
    set(yl,'Position',get(yl,'Position')+[0.1 0 0])
    set(xl,'Position',get(xl,'Position')+[0 0.1 0])
Dadurch, dass ich die Xlabel-Sachen jetzt hinten dran habe, scheine ich was bewegen zu können. Die Schrift kann ich jetzt ohne seltsame Kopien in der figure verrücken. Das ist schon mal gut, ABER:
Ich kann das y-Label nicht so weit nach rechts rücken wie ich wöllte, da ich sonst in die Achsenbeschriftung rein komme. Die weicht nicht aus Wink
Wie kann ich das GANZE im sichtbarren Bereich nach rechts verrücken?

CopyObohne.png
 Beschreibung:
ohne COPYOBJ

Download
 Dateiname:  CopyObohne.png
 Dateigröße:  30.88 KB
 Heruntergeladen:  1135 mal
CopyOb.png
 Beschreibung:
mit COPYOBJ

Download
 Dateiname:  CopyOb.png
 Dateigröße:  35.48 KB
 Heruntergeladen:  1148 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.03.2013, 16:39     Titel:
  Antworten mit Zitat      
Hallo Mandel,

Ganz im Ernst: Das COPYOBJ ist hier vollkommen überflüssig. Es kopiert das aktuelle AXES Objekt in die aktuelle Figure, wo es aber breits existiert. Da das an Magie grenzt, empfehle ich dringed, es wegzulassen und stattdessen den Code ordentlich zu reparieren.
Es lohnt sich beim Programmieren nie, einen Flicken auf einen Flicken zu setzen, und noch einen obendrauf. Im Gegensatz zu Hosen kann man Matlab Code so reparieren, dass er hinterher nahtlos in Ordnung ist.

Was bisher im Code passiert:
Mache das XGrid und YGrid grau ("set(gca,'Xcolor',[gc gc gc]);"), schalte das Grid ein, kopiere die AXES auf sich selbst oben drauf, mache das Grid schwarz, schalte das X/YGrid wieder aus.
Das ist total vermodelt und es wundert mich nicht, dass nicht das erwartete herauskommt.

Statt:
Code:
grid on
    c_axes = copyobj(gca,gcf);
    set(c_axes, 'color', 'none', 'xcolor', 'k', 'xgrid', 'off', 'ycolor','k', 'ygrid','off');

also besser:
Code:
   c_axes = copyobj(gca,gcf);
    set(gca, 'color', 'none', 'xcolor', 'k', 'xgrid', 'off', 'ycolor','k', 'ygrid','off');


Die beste Idee wäre es aber, den gesamten Code nochmal von vorne zu schreiben.

Gruß, Jan
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.