Verfasst am: 27.07.2018, 09:58
Titel: Subplot und hold on: einzelne Punkte nach einander setzen
Hallo zusammen,
ich bin neu hier im Forum und hoffe, ich bin auch an der richtigen Stelle mit meiner Frage.
Ich habe eine Frage zum „Subplot“-Befehl und die „hold on“-Funktion.
In Grunde möchte ich bei jedem Schleifen-Durchlauf einen neuen Punkt zeichnen, wobei die alten Punkte beibehalten werden. Für einen einfachen „Plot“ habe ich ein einfaches Beispiel erstellen können.
Leider stellt es sich für einen „Subplot“ die ganze Sache etwas schwieriger dar.
Hier mein Code-Beispiel:
fh2 = figure(2);
hAxes2 = axes('Parent',fh2);
clf(2);
hold on
numFields = 4;
for i = 1:numFields
% Create handles for update of plots. subplot(numFields,1,i);
if i == 2 hold on
ph(i) = plot(NaN,NaN,'r+');
ylabel('[m]');
xlabel('[s]');
else % hold on
ph(i) = plot(0,0,'o');
end
ax(i) = gca;
end
for k = 1:10
b = a + k;
c(k) = b;
hold on
%Wird nur einmal gezeichnet. Warum?
ph(1).XData = k;
hold on
ph(1).YData = b;
hold on
%Warum wird dies in subplot(4) geschrieben und nicht in subplot(1)????
ph(1) = plot(c);
ph(1).LineStyle = ('--');
ph(2).XData = k;
ph(2).YData = b;
ph(2).Marker = 'o';
pause(0.01) drawnow;
end hold off
Ich habe meine eigentliche Frage-Stellung etwas reduziert und hoffe, ich kann dann damit mein Problem lösen.
Ganz am Ende wäre es schön, wenn auf der X-Achse die Zeit kontinuierlich mitläuft (z. B. sichtbarer Zeitraum von 60 Sekunden) und wenn das Fenster/Subplot voll ist, die neuen Werte Schritt für Schritt nachgeschrieben werden am Ende des Fensters „rein geschoben“ werden. Dabei wird der älteste Wert gelöscht. Auf der Y-Achse würden z. B. Amplituden-Werte anzeigt. (Vielleicht gibt es schon eine Antwort, die ich selbst leider nicht im Forum gefunden habe.)
Ich hoffe, meine Beschreibung war verständlich und nachvollziehbar.
Wenn ich deine Kommentare im Code richtig deute hast du das Problem, das er nur immer in subplot(4) schreibt?
Matlab schreibt immer in die letzte "aktive" figure bzw Axes. (for-Schleife mit num-Fields)
somit ist der letzte aktive Bereich subplot(4).
Erst dann baut deine letzte For-Schleife die Daten und plottet sie. Hier hast du aber nicht angegeben in welchen Plot-Bereich. Somit ist noch immer subplot(4).
Zu deinem Ablauf für das laufende Plotten von Signalen. Hier habe ich leider zu wenig Erfahrung. Wie lange dauert die Berechnung der Signale? Eine Updatefrequenz von 1Hz ist nicht hoch. Also zuerst die Linien berechnen und dann die 60sekunden darstellen.
vielen Dank für Deine Antwort.
Habe auch Deine Anmerkungen einmal ausprobiert und es hat funktioniert. Bin etwas schlauer geworden.
Anbei meine Anpassungen:
for k = 1:10
b = a + k;
cc(k) = b;
kk(end+1) = k;
bb(end+1) = b;
subplot(4,1,1)
ph(1).XData = kk; % muss ein Vektor sein!!
ph(1).YData = bb; % muss ein Vektor sein!!
ph(1).Color = 'r';
hold on;
subplot(4,1,1) plot(bb,cc);
Zu meiner anderen Frage werde ich mich wohl nächste Woche noch einmal genauer beschäftigen, dies genauer formulierung und noch etwas suchen müssen.
Danke nochmal.
Schönes Wochenende und Viel Spass bei der Mond-Finsternis heute Nacht
Einstellungen und Berechtigungen
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.