2017-02-14 5 views
3

Ich habe vier Datensätze, deren Verteilung ich in MATLAB in einer Zahl darstellen möchte. Aktuelle Code ist:MATLAB: Kombinieren und Normalisieren von Histogrammen mit unterschiedlichen Stichprobengrößen

[n1,x1]=hist([dataset1{:}]); 
[n2,x2]=hist([dataset2{:}]); 
[n3,x3]=hist([dataset3{:}]); 
[n4,x4]=hist([dataset4{:}]); 
bar(x1,n1,'hist'); 
hold on; h1=bar(x1,n1,'hist'); set(h1,'facecolor','g') 
hold on; h2=bar(x2,n2,'hist'); set(h2,'facecolor','g') 
hold on; h3=bar(x3,n3,'hist'); set(h3,'facecolor','g') 
hold on; h4=bar(x4,n4,'hist'); set(h4,'facecolor','g') 
hold off 

Mein Problem ist, dass ich verschiedene Stichprobengrößen für jede Gruppe haben, dataset1 eine n von 69 hat, dataset2 eine n von 23, dataset3 und dataset4 haben n ist von 10. So, wie ich tun Normalisieren Sie die Verteilungen, wenn Sie diese drei Gruppen zusammen darstellen?

Gibt es einen Weg zu..zum Beispiel..teilen Sie die Instanzen in jeder Klasse durch das Sampling für diese Gruppe?

+0

Warum bar nicht 'n1/Summe (n1)' statt? Andernfalls wäre vielleicht 'Histogramm (x, 'Normalisierung', 'Wahrscheinlichkeit') 'eine Alternative. – Florian

+0

Die n1/sum (n1) hat super funktioniert, gibt es eine Möglichkeit, dies mit histfit zu tun? oder einen besseren/leichteren Weg, Fit-Linien hinzuzufügen? – user3470496

Antwort

2

Sie können Ihre Histogramme dividiert durch die Gesamtzahl der Elemente normalisieren:

[n1,x1] = histcounts(randn(69,1)); 
[n2,x2] = histcounts(randn(23,1)); 
[n3,x3] = histcounts(randn(10,1)); 
[n4,x4] = histcounts(randn(10,1)); 
hold on 
bar(x4(1:end-1),n4./sum(n4),'histc'); 
bar(x3(1:end-1),n3./sum(n3),'histc'); 
bar(x2(1:end-1),n2./sum(n2),'histc'); 
bar(x1(1:end-1),n1./sum(n1),'histc'); 
hold off 
ax = gca; 
set(ax.Children,{'FaceColor'},mat2cell(lines(4),ones(4,1),3)) 
set(ax.Children,{'FaceAlpha'},repmat({0.7},4,1)) 

Doch wie Sie oben sehen können, können Sie noch einige Dinge tun, um Ihren Code einfacher und kurz zu machen:

  1. Sie müssen nur hold on einmal.
  2. Anstatt alle bar Griffe zu sammeln, verwenden Sie den axes Griff.
  3. Stellen Sie den Balken in aufsteigender Reihenfolge der Anzahl der Elemente im Dataset dar, sodass alle Histogramme deutlich sichtbar sind.
  4. Mit dem Handle legen Sie alle Eigenschaften auf einen Befehl fest.

und als Randnotiz - es ist besser zu verwenden histcounts. Hier

ist das Ergebnis:

only hist


EDIT:

Wenn Sie wollen auch die pdf-Linie zeichnen von histfit, dann können Sie sie speichern zuerst, und dann es normalisieren:

dataset = {randn(69,1),randn(23,1),randn(10,1),randn(10,1)}; 
fits = zeros(100,2,numel(dataset)); 
hold on 
for k = numel(dataset):-1:1 
    total = numel(dataset{k}); % for normalizing 
    f = histfit(dataset{k}); % draw the histogram and fit 
    % collect the curve data and normalize it: 
    fits(:,:,k) = [f(2).XData; f(2).YData./total].'; 
    x = f(1).XData; % collect the bar positions 
    n = f(1).YData; % collect the bar counts 
    f.delete % delete the histogram and the fit 
    bar(x,n./total,'histc'); % plot the bar 
end 
ax = gca; % get the axis handle 
% set all color and transparency for the bars: 
set(ax.Children,{'FaceColor'},mat2cell(lines(4),ones(4,1),3)) 
set(ax.Children,{'FaceAlpha'},repmat({0.7},4,1)) 
% plot all the curves: 
plot(squeeze(fits(:,1,:)),squeeze(fits(:,2,:)),'LineWidth',3) 
hold off 

Auch hier gibt es einige andere Verbesserungen, die Sie in Ihren Code vorstellen kann:

  1. Setzen Sie alles in einer Schleife thigs leichter später geändert zu machen.
  2. Sammeln Sie alle Kurven Daten zu einer Variablen, so dass Sie sie alle sehr einfach zusammenstellen können.

Das neue Ergebnis ist:

hist & fit

Verwandte Themen