Verfasst am: 14.10.2014, 12:37
Titel: plotyy plottet bei der 2. Achse nur den ersten Graph
Hi Leute,
ich habe mir eine Schleife programmiert, in der ich BodeDiagramme plotten möchte. Die erste Achse, also der Betrag, plottet, Legende ist auch da, alles super. Bei der zweiten Achse wird jedoch komischerweise nur der erste Graph geplottet. Kann mir vielleicht jemand weiterhelfen? Hier mein Code:
Code:
for zaehlerfigImp=1:anzFigImp
%Ploteinstellungen
YACHSENTITEL='Z''''';
XACHSENTITEL='Z''';
FontSizeTitle=20;
FigureImp=figure(zaehlerfigImp);
set(FigureImp, 'Position', [50100800400])
%Schleifendurchlauf, der immer die Anzahl der vorher definierten Graphen in
%eine Figure plottet
for p=1:laengeReihe; %Plotten aller gefundenen Dateien mit Dateiname als Legende
subplot(211) plot(Datenbank(:,uebersichtzaehler+zaehlerplot+p), Datenbank(:,uebersichtzaehler+zaehlerplot+(p+1)), 'Color',Colour(p*200,:), 'LineWidth',2,'DisplayName',[Uebersicht{uebersichtzaehler+p,1} ' ' Uebersicht{uebersichtzaehler+p,2} ' ' Uebersicht{uebersichtzaehler+p,3} ' ' Uebersicht{uebersichtzaehler+p,4} ' ' Uebersicht{uebersichtzaehler+p,5}]);
grid on
legend('-DynamicLegend');
set(gca,'YDir','reverse'); % Y-Achse invertieren ylabel(YACHSENTITEL, 'FontSize',15) xlabel(XACHSENTITEL, 'FontSize',15) hold on;
subplot(212)
zbetrag(:,p)=sqrt((Datenbank(:,uebersichtzaehler+zaehlerplot+p)).^2+(Datenbank(:,uebersichtzaehler+zaehlerplot+(p+1))).^2);
hilfsvarphase(:,p)=(Datenbank(:,uebersichtzaehler+zaehlerplot+(p+1)))./(Datenbank(:,uebersichtzaehler+zaehlerplot+p));
phase(:,p)=atand(hilfsvarphase(:,p));
[AX,H1,H2]=plotyy(f_bereich(:,1),zbetrag(:,p),f_bereich(:,1),phase(:,p),'plot');
grid on
set(H1,'DisplayName', [ 'Z:' Uebersicht{uebersichtzaehler+p,2} ' ' Uebersicht{uebersichtzaehler+p,3} ' ' Uebersicht{uebersichtzaehler+p,4} ' ' Uebersicht{uebersichtzaehler+p,5}]) set(H2, 'DisplayName' , 'H2 Legende') set(get(AX(1),'Ylabel'),'String','Z') set(get(AX(2),'Ylabel'),'String','Phase') xlabel('Frequenz','FontSize',FontSizeTitle) hold on;
%legend('-DynamicLegend');
zaehlerplot=zaehlerplot+1;
holdall;
end set(AX,'XScale','log');
legend('location', 'SouthEast'); % Legende günstig platzieren
%title(['Impedanzspektren von:' ' ' Uebersicht{uebersichtzaehler+p,2} ' mit ' Uebersicht{uebersichtzaehler+p,3}]); %Bei Bedarf Diagrammtitel
hold off;
set(gcf,'Name',['Imp: ' Uebersicht{uebersichtzaehler+p,2} '_' Uebersicht{uebersichtzaehler+p,3}]);
%Abspeichern der Figure als jpg
%print( FigureImp, '-djpeg' , ['diagramme\' 'imp_' Uebersicht{uebersichtzaehler+p,2} '_' Uebersicht{uebersichtzaehler+p,3}]);
%print( FigureImp, '-depsc2' , ['diagramme\' 'imp_' Uebersicht{uebersichtzaehler+p,2} '_' Uebersicht{uebersichtzaehler+p,3}]);
uebersichtzaehler= uebersichtzaehler+laengeReihe;
end
auch keine Besserung. Aus dem zweiten Datensatz für die rechte Y-Achse wird lediglich der letzte Wert dargestellt, vermutlich werden alle vorherigen überschrieben...
Verfasst am: 17.10.2014, 23:20
Titel: Re: plotyy plottet bei der 2. Achse nur den ersten Graph
Hallo DerLola,
Dein Code ist sehr unübersichtlich. Ich habe es mal ein klein wenig aufgehübscht, vielleicht fällt es dann leichter nachzuvollziehen, was der Code macht:
Code:
for zaehlerfigImp=1:anzFigImp
YACHSENTITEL='Z''''';
XACHSENTITEL='Z''';
FontSizeTitle=20;
FigureImp=figure(zaehlerfigImp);
%Schleifendurchlauf, der immer die Anzahl der vorher definierten Graphen in
%eine Figure plottet
for p=1:laengeReihe; %Plotten aller gefundenen Dateien mit Dateiname als Legende
subplot(211) plot(Datenbank(:,iOverview+iPlot+p), Datenbank(:,iOverview+iPlot+(p+1)), ...
'Color',Colour(p*200,:), 'LineWidth',2,'DisplayName', ... sprintf('%s %s %s %s %s', Uebersicht{iOverview+p, 1:5}));
grid on
legend('-DynamicLegend');
set(gca,'YDir','reverse'); % Y-Achse invertieren ylabel(YACHSENTITEL, 'FontSize',15) xlabel(XACHSENTITEL, 'FontSize',15) hold on;
subplot(212)
zbetrag(:,p)=sqrt((Datenbank(:,iOverview+iPlot+p)).^2+(Datenbank(:,iOverview+iPlot+(p+1))).^2);
hilfsvarphase(:,p)=(Datenbank(:,iOverview+iPlot+(p+1)))./(Datenbank(:,iOverview+iPlot+p));
phase(:,p)=atand(hilfsvarphase(:,p));
[AX,H1,H2]=plotyy(f_bereich(:,1),zbetrag(:,p),f_bereich(:,1),phase(:,p),'plot');
grid on
set(H1, 'DisplayName', sprintf('Z:%s %s %s %s', Uebersicht{iOverview+p,2:5});
set(H2, 'DisplayName' , 'H2 Legende') set(get(AX(1),'Ylabel'),'String','Z') set(get(AX(2),'Ylabel'),'String','Phase') xlabel('Frequenz','FontSize',FontSizeTitle) hold on;
iPlot=iPlot+1;
holdall;
end set(AX,'XScale','log');
legend('location', 'SouthEast'); % Legende günstig platzieren
hold off;
set(gcf,'Name',['Imp: ' Uebersicht{iOverview+p,2} '_' Uebersicht{iOverview+p,3}]);
iOverview= iOverview+laengeReihe;
end
"subplot(212)" ist eine sehr veraltete Methode zum Erstellen von Subplots. Die war vor 10 Jahren schon nicht mehr gebräuchlich.
Da wir den Code nicht laufen lassen können, ist es schwer herauszufinden, welches Verghalten Du genau meinst.
Hilft Dir der Debugger weiter, wenn Du zeilenweise durch den Code gehst?
hm okay. mir wurde das letztes Jahr so in der uni noch beigebracht mit subplot.
Also ich hatte mich im englischsprachigen Raum noch umgehört, da konnte mir aber auch nicht wirklich weitergeholfen werden. (http://www.mathworks.com/matlabcentral/answers/158823-plotyy-in-for-loop-only-plots-half-of-the-data#answer_155354)
bei Interesse gibts dort eine .mat file mit der mein code dann ausführbar wird!
Im Debug Mode ist eindeutig zu erkennen, dass die zweite Y-Achse immer wieder überschrieben wird.
Ich habe es nun einfach wieder aufgeteilt auf 2 Subplots... wäre trotzdem irgendwie schön gewesen wie genau die hold Funktion bei Plotyy einzusetzen ist.
mir wurde das letztes Jahr so in der uni noch beigebracht mit subplot.
Dann hat Dein Dozent wohl vor 20 Jahren Matlab gelernt.
Zitat:
bei Interesse gibts dort eine .mat file mit der mein code dann ausführbar wird!
Ich kann dort kein MAT-File finden.
Du kannst PLOTYY vor die Schleife ziehen und dann in beiden dadurch erstellten AXES-Objekten die eigenschaft 'NextPlot' auf 'add' setzen.
Innerhalb der Schleife reichen dann einfache PLOT-Befehle, bei denen jeweils auch die Eigentschaft 'Parent' auf das jeweiligen AXES-Handle angegeben wird.
Eine Antwort auf Fragen im Forum ist wahrscheinlicher, wenn Du so wenige und so klaren Code wir möglich postest. Je mehr Code-Zeilen zu finden siond, die mit dem Problem nichts zu tun haben, desto länger benötigt man um überhaupt zu verstehen, auf welche Code-Zeilen sich Deine Frage bezieht. Und wenn ein Leser mehr als 60 Sekunden zum Verstehen der Frage benötigt, sinkt die Motivation zu antworten deutlich.
Gruß, Jan
DerLolaGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.10.2014, 09:58
Titel:
Mir ist bewusst, dass der Code umfangreich ist. Aber ich dachte er sollte auch nachvollziehbar sein.
Mir ist bewusst, dass der Code umfangreich ist. Aber ich dachte er sollte auch nachvollziehbar sein.
Wenn in Foren andere Leute freiwillig bereit sind Zeit in die Lösung der Probleme anderer zu investieren, ist es wirklich hilfreich, so wenig von ihrer Zeit zu beanspruchen wie möglich.
Die fehlende Einrückung des Codes, die auskommentierten Code-Zeilen, die unübesichtlich langen Variablennamen und die Menge an Code, der mit dem Problem nichts zu tun hat, rauben Zeit.
Ein Daten-File in einem anderen Forum in einem Kommentar zu einer Antwort zu posten ist nicht hilfreich. Bitte poste die Daten hier in diesem Forum, wenn Du sie von Lesern hier beantwortet haben möchtest.
Ich hatte einen Vorschlag gemacht. Hilft Dir das bereits oder hast Du weitere Fragen dazu?
Dein Vorschlag klingt gut, ich habe es allerdings nicht ausprobiert, da ich nun mit subplot arbeite und das funktioniert super und meine Graphen sind übersichtlicher.
Verfasst am: 04.11.2014, 00:43
Titel: Re: plotyy plottet bei der 2. Achse nur den ersten Graph
Hallo Jan,
Jan S hat Folgendes geschrieben:
"subplot(212)" ist eine sehr veraltete Methode zum Erstellen von Subplots. Die war vor 10 Jahren schon nicht mehr gebräuchlich.
Aus Interesse: Was sollte man statt subplot nutzen?
Hab probeweise mal in ein paar Matlab-Bücher von mir geschaut. Bspw. in 'Programmieren mit Matlab' (2012), 'Ingenieurmathematik kompakt Problemlösungen mit MATLAB' (2010) und 'MATLAB und Simulink in der Ingenieurpraxis' (2012) wird subplot behandelt. Im Matlab-Einsteigerkurs an meiner Uni wurde 2011 auch noch subplot vorgestellt.
Edit: Oder geht es bloß um den Aufruf der Funktion mittels Übergabeparameter der Art '212'?
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.