2013-04-12 16 views
6

Mam 3 wektory: Y=rand(1000,1), X=Y-rand(1000,1) i ACTid=randi(6,1000,1). Chciałbym utworzyć wykresy boków według grup Y i X odpowiadających ich wartości grupy 1: 6 (z ACTid).Najbardziej efektywny sposób na zgrupowanie boxplot matlab

To raczej ad hoc i wygląda paskudny

for ii= 
dummyY(ii)={Y(ACTid==ii)}; 
dummyX(ii)={X(ACTid==ii)} 
end 

Teraz mam dane w komórce, ale nie może pracować się, jak to grupa w boxplot. jakieś pomysły?

Znalazłem aboxplotfunction który wygląda tak, ale nie chcę tego, chciałbym wbudowaną funkcję boxplot, ponieważ konwertuję ją na matlab2tikz i ta nie robi tego dobrze.

enter image description here

EDIT

Dzięki Olega: mamy teraz pogrupowane wykres typu boxplot ... ale etykiety są pochylać-przewiew.

xylabel = repmat({'Bleh','Blah'},1000,1); % need a legend instead, but doesn't appear possible 
boxplot([Y(:,end); cfu], {repmat(ACTid,2,1), xylabel(:)} ,'factorgap',10,'color','rk') 
set(gca,'xtick',1.5:3.2:50) 
set(gca,'xticklabel',{'Direct care','Housekeeping','Mealtimes','Medication','Miscellaneous','Personal care'}) 
>> ylabel('Raw CFU counts (Y)') 

enter image description here

Jak dodać legendę?

+0

Mam coś ukrytego, ponieważ używam 'matlab2tikz' i mogę to łatwo określić. Legenda, którą mogę też sztucznie umieścić, ale nie jest tak zabawna: S – HCAI

Odpowiedz

8

Podejście dwuwierszowy (chociaż, jeśli chcesz zachować xlables dwuwierszowy i centrum te w pierwszej linii, to będzie hackish):

Y  = rand(1000,1); 
X  = Y-rand(1000,1); 
ACTid = randi(6,1000,1); 

xylabel = repmat('xy',1000,1); 
boxplot([X; Y], {repmat(ACTid,2,1), xylabel(:)} ,'factorgap',10) 

Rezultat:

enter image description here

EDIT

Aby wyśrodkować etykiety ...

% Retrieve handles to text labels 
h = allchild(findall(gca,'type','hggroup')); 

% Delete x, y labels 
throw = findobj(h,'string','x','-or','string','y'); 
h  = setdiff(h,throw); 
delete(throw); 

% Center labels 
mylbl = {'this','is','a','pain','in...','guess!'}; 
hlbl = findall(h,'type','text'); 
pos = cell2mat(get(hlbl,'pos')); 

% New centered position for first intra-group label 
newPos = num2cell([mean(reshape(pos(:,1),2,[]))' pos(1:2:end,2:end)],2); 
set(hlbl(1:2:end),{'pos'},newPos,{'string'},mylbl') 

% delete second intra-group label 
delete(hlbl(2:2:end)) 

eksportowanie jako .png będzie powodować problemy ...

+0

Możesz dodać argumenty 'colorgroup' i' colors', aby odróżnić grupy według koloru. – yuk

+0

Dziękuję bardzo za to! Mam dwa małe pytania: szukam, aby każda grupa była nazywana czymś innym. To znaczy. 1 = Bezpośrednia opieka, 2 = Sprzątanie, 3 = Posiłki .... I zamiast x, etykiety grup mają legendę dla koloru 'boxplot ([Y; X], {repmat (ACTid, 2,1), xylabel (:)}, 'factorgap', 10, 'color', 'rk') '. @ yuk polecenie kolorów zmienia okno, ale nie wartości odstające, czy można je również zmienić? – HCAI

+1

Można to zrobić, ale w nieco hackish sposób. Zobacz to [pytanie] (http://stackoverflow.com/questions/15125314/colorfill-the-boxes-in-a-boxplot-in-matlab), na przykład. – yuk

6

miałem ten sam problem z grupowania danych w działce skrzynki. Kolejnym ograniczeniem było to, że różne grupy mają różne ilości punktów danych. Opierając się na tutorialu znalazłem, to wydaje się być miłą rozwiązanie chciałem się z wami podzielić:

x = [1,2,3,4,5,1,2,3,4,6]; 
group = [1,1,2,2,2,3,3,3,4,4]; 
positions = [1 1.25 2 2.25]; 
boxplot(x,group, 'positions', positions); 

set(gca,'xtick',[mean(positions(1:2)) mean(positions(3:4)) ]) 
set(gca,'xticklabel',{'Direct care','Housekeeping'}) 

color = ['c', 'y', 'c', 'y']; 
h = findobj(gca,'Tag','Box'); 
for j=1:length(h) 
    patch(get(h(j),'XData'),get(h(j),'YData'),color(j),'FaceAlpha',.5); 
end 

c = get(gca, 'Children'); 

hleg1 = legend(c(1:2), 'Feature1', 'Feature2'); 

colored grouped boxplot with varying group sizes

Here jest link do tutoriala.

+1

Wygląda na to, że uchwyty są zwracane od ostatniego do pierwszego, więc aby dopasować kolejność 'color' mapy od lewej do prawej, po prostu zmieniłem pętlę' for' na 'patch (get (h (j), "XData"), get (h (j), "YData"), kolor (długość (h) -j + 1), "FaceAlpha", .5); ' –

Powiązane problemy