Verfasst am: 14.02.2014, 20:19
Titel: Fitten einer Kurve mittels gegebener Punkte
Hallo,
bisher hatte ich meine Mesdaten stets mit plot() und errorbar() dargestellt. Es wäre aber besser wenn ich aus den gegebenen Durchschnittswerten statt den direkten linearen Verbindungen eine Trendlinie wie in Excel legen könnte. Da kann man ja beispielsweise Polynom 3. Grades auswählen und schon ist es fertig.
In Matlab habe ich es nun auch versucht, nur leider wird hier nichts "rund". Ich bekomme zwar keinen Fehler, aber dereinfache Plot sieht genauso aus wie die Annäherung mit Polynomen. Ich habe auch schon am Grad des Polynoms gedreht. Hilft nichts...
Hier etwas Code einer der subplots, so sollte es übersichtlich bleiben (es sind je 5 Messpunkte pro Kurve; 4 Kurven + optional jeweils eine errorbar):
% line between measure points if l == 0 plot(p,nanmean(TG1S(:,:,1),2),'-ko', p,nanmean(TG1S(:,:,2),2)','-k*', p,nanmean(TG1S(:,:,3),2),'-kd', p,nanmean(TG1S(:,:,4),2),'-.ks') elseif l == 1
poly1 = polyfit(p,nanmean(TG1S(:,:,1),2)',p_n);
fit1 = polyval(poly1,p);
plot(p,fit1,'-ko')
das ist etwas schwierig, ohne die Daten zu kennen.
Wenn die Daten relativ weit auseinander liegen, dann sollte man das Polynom aber nicht nur an den Datenpunkten auswerten, sondern auch an Zwischenpunkten, also z.B.
edit: Sieht schon mal wesentlich eher nach dem aus, was ich mir wünsche: http://prntscr.com/2sjft3 (jetzt auch in passenden Farben)
Vielen Dank.
PS: Eventuell hast du auch eine Idee für die Standardabweichung: Da sie bei allen Kurven recht groß ist, überlappen die errorbars total. Kann man das irgendwie anders statistisch sinnvoll und zudem sauber plotten?
PPS: ... und sigstar() muss auch noch rein. Uh, das wird noch lustig... ^^
bevor ich es vergesse: Ich müsste in dem plot noch auf der x-Achse jeweils die Punkte markieren die bei 50% (y-Achse) liegen. Am Besten mit geraden Linien zu beiden Achsen. Gibt es da etwas elegantes?
.. oder soll ich dafür lieber einen neuen Thread aufmachen?
@ PS: es geht dir ja vermutlich darum, die Abweichungen im Vergleich zu einander darzustellen. Dann könnte man nanstd auch mit einem Vorfaktor, z.B. 0.1, skalieren.
Geraden lassen sich zeichnen, in dem man zwei Punkte plottet.
% line between measure points if l == 0 plot(p,nanmean(TG1S(:,:,1),2),CSS1, p,nanmean(TG2S(:,:,1),2)',CSS2) elseif l == 1
poly1 = polyfit(p,nanmean(TG1S(:,:,1),2)',p_n);
fit1 = polyval(poly1,pfein);
plot(pfein,fit1,CSS1)
% add error bars? if e == 1 errorbar(p', nanmean(TG1S(:,:,1),2), nanstd(TG1S(:,:,1),1,2), css1, 'Linewidth',1) errorbar(p', nanmean(TG2S(:,:,1),2), nanstd(TG2S(:,:,1),1,2), css2, 'Linewidth',1) end
% add significance star to standard plot variant if sig == 1 && l == 0
head = [head ' - sigStar']; % edit plot name, only the 1st time to avoid ... sigStar - sigStar - ...
sspace = 0.2; % some more space inside the plot for sigStars
min_p = min(p);
max_p = max(p);
if min_p == 0% easy test data volume
sigstar({[0,5],[5,10],[10,15],[15,20]}) elseif min_p == -10 && max_p == 20% full data volume
sigstar({[-10,-5],[-5,0],[0,5],[5,10],[10,15],[15,20]}) elseif min_p == -10 && max_p == 10% normal test data volume
sigstar({[-10,-5],[-5,0],[0,5],[5,10]}) end
% mark 50% values if l == 0% linear (no-approx)
fct1 =
fct2 =
elseif l ==1% poly approx
fct1 =
fct2 =
end
svs_y0 = 0;
svs_y1 = 0.5;
svs_x1 = fct1(0.5);
svs_x2 = fct2(0.5);
plot([svs_x0, svs_x2], [svs_y1, svs_y1], 'k:')% y-aixis to x_max(A,B) plot([svs_x1, svs_x1], [svs_y0, svs_y1], 'k:')% A to x-axis plot([svs_x2, svs_x2], [svs_y0, svs_y1], 'k:')% B to x-axis
hold off
title('\bf male speaker (m)') ylabel(yaxis) xlabel(xaxis) axis([min(p)-5max(p)+5-0.051.05+sspace])% xmin xmax ymin ymax set(gca, 'Xtick', p); % only show -25:5:20 on y-axis grid off
% convert values on y-axis to percent set(gca, 'YTickMode','manual') set(gca, 'YTickLabel',num2str(100.*get(gca,'YTick')','%g%%'))
% interpolation via invers-functions to get 50% values if l == 0% linear (no-approx)
vq1 = interp1(nanmean(TG1S(:,:,1),2),p,0.5);
vq2 = interp1(nanmean(TG2S(:,:,1),2)',p,0.5);
svs_x1 = min(vq1, vq2);
svs_x2 = max(vq1, vq2);
elseif l == 1% poly approx
vq1 = interp1(fit1,pfein,0.5);
vq2 = interp1(fit2,pfein,0.5);
svs_x1 = min(vq1, vq2);
svs_x2 = max(vq1, vq2);
end
plot([svs_x0, svs_x2], [svs_y1, svs_y1], 'k:')% y-aixis to x_max(A,B) plot([svs_x1, svs_x1], [svs_y0, svs_y1], 'k:')% A to x-axis plot([svs_x2, svs_x2], [svs_y0, svs_y1], 'k:')% B to x-axis
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.