2015-03-19 3 views
3

Я использую функцию boxplot в MATLAB. Мне нужно построить ящики для 6 разных наборов данных для 6 «XTicks». Каждый тик на оси x должен содержать 6 соответствующих полей, усов, срединных линий и множество выбросов в пределах своего домена. Я попытался манипулировать свойством «XTick», установив смещения для каждой переменной, но это не относится к boxplot(), как для обычного графика(). Я также не могу добавлять легенды.MATLAB Множественные (параллельные) полевые диаграммы в одном рисунке

A 3 переменная эквивалент моей проблемы хотелось бы следующее:

enter image description here

Edit:

Ниже приведен фрагмент кода, который должен быть изменен

TreadmillData = randi([20,200],69,6); 
Speeds = {'1.5mph' '2.5mph' '3.5mph' '4.5mph' '5.5mph' '6.5mph'}; 
DeviceColors = {'r' 'g' 'c' [0.5 0 0.5] 'b' [1 0.5 0]}; 
Pedometer1 = TreadmillData(1:7:end,:); 
Pedometer2 = TreadmillData(2:7:end,:); 
Pedometer3 = TreadmillData(3:7:end,:); 
Pedometer4 = TreadmillData(4:7:end,:); 
Pedometer5 = TreadmillData(5:7:end,:); 
Pedometer6 = TreadmillData(6:7:end,:); 

GroupedData = {Pedometer1 Pedometer2 Pedometer3 Pedometer4 Pedometer5 Pedometer6}; 

legendEntries = {'dev1' 'dev2' 'dev3' 'dev4' 'dev5' 'dev6'}; 

figure; 
Xt = 20:20:120; 
Xt_Offset = [-15,-10,-5,5,10,15]; 

for i=1:6 
    boxplot(GroupedData{i},'Color',DeviceColors{i}); 
    set(gca,'XTick',Xt+Xt_Offset(i)); 
    if i==3 
     set(gca,'XTickLabel',Speeds); 
    end 
    hold on; 
end 
xlabel('Speed');ylabel('Step Count'); grid on; 
legend(legendEntries); 

Любой помощь будет оценена!

+0

сообщение какой-то код, чтобы проиллюстрировать эту проблему –

+0

@Luis я добавил код. Благодаря! – Naveen

+0

Версия Matlab? –

ответ

1

Я внесла некоторые изменения в ваш код. Я тестировал это в R2014b.

TreadmillData = randi([20,200],69,6); 
Speeds = {'1.5mph' '2.5mph' '3.5mph' '4.5mph' '5.5mph' '6.5mph'}; 
DeviceColors = {'r' 'g' 'c' [0.5 0 0.5] 'b' [1 0.5 0]}; 
Pedometer1 = TreadmillData(1:7:end,:); 
Pedometer2 = TreadmillData(2:7:end,:); 
Pedometer3 = TreadmillData(3:7:end,:); 
Pedometer4 = TreadmillData(4:7:end,:); 
Pedometer5 = TreadmillData(5:7:end,:); 
Pedometer6 = TreadmillData(6:7:end,:); 

GroupedData = {Pedometer1 Pedometer2 Pedometer3 Pedometer4 Pedometer5 Pedometer6}; 

legendEntries = {'dev1' 'dev2' 'dev3' 'dev4' 'dev5' 'dev6'}; 

N = numel(GroupedData); 
delta = linspace(-.3,.3,N); %// define offsets to distinguish plots 
width = .2; %// small width to avoid overlap 
cmap = hsv(N); %// colormap 
legWidth = 1.8; %// make room for legend 

figure; 
hold on; 

for ii=1:N %// better not to shadow i (imaginary unit) 
    %if ii~=ceil(N/2) 
    % labels = repmat({''},1,N); %// empty labels 
    %else 
     labels = Speeds; %// center plot: use real labels 
    %end 
    boxplot(GroupedData{ii},'Color', DeviceColors{ii}, 'boxstyle','filled', ... 
     'position',(1:N)+delta(ii), 'widths',width, 'labels',labels) 
     %// plot filled boxes with specified positions, widths, labels 
    plot(NaN,1,'color',DeviceColors{ii}); %// dummy plot for legend 
end 
xlabel('Speed'); ylabel('Step Count'); grid on; 
xlim([1+2*delta(1) N+legWidth+2*delta(N)]) %// adjust x limits, with room for legend 

legend(legendEntries); 

enter image description here

+0

Спасибо большое @ Luis Можете ли вы также добавить о проблеме с легендой? Кроме того, ярлыки XTick появляются кратковременно, когда график обновляется и исчезает в конце. использование «hold on» внутри цикла for также не позволяет сохранить метки. – Naveen

+1

@Naveen См. Обновленный ответ. Я тестировал в R2014b и модифицировал код для решения проблемы с меткой в ​​R2014b. Кроме того, я добавил легенду. Обратите внимание, что для того, чтобы легенда работала, вам нужно создать фиктивные графики с одинаковыми цветами. –

+0

@Naveen. Наложенные метки - это те, что указаны на последней итерации. Вот почему они кажутся немного смещенными вправо. Я не нашел способ решить эту проблему: –

2

Вот решение для построения нескольких boxplot. Вы должны сгруппировать все данные в одну матрицу, причем каждая группа разделяется столбцом Nan. После этого вы можете просто построить один обычный boxplot с ad-hoc таких опций, как colors и labels.

enter image description here

В следующем примере используется 2 группы 3, так 7 столбцов. В 4 первые строки данных:

0.6993 0.0207 -0.7485  NaN 0.5836 -0.1763 -1.8468 
    -0.0494 -1.5411 0.8022  NaN 2.7124 -0.0636 -2.3639 
    0.9134 0.7106 -0.1375  NaN -0.2200 -0.2528 -0.8350 
    -0.5655 1.3820 0.6038  NaN -0.7563 -0.9779 0.3789 

И код:

figure('Color', 'w'); 
c = colormap(lines(3)); 


A = randn(60,7);  % some data 
A(:,4) = NaN;   % this is the trick for boxplot 
C = [c; ones(1,3); c]; % this is the trick for coloring the boxes 


% regular plot 
boxplot(A, 'colors', C, 'plotstyle', 'compact', ... 
    'labels', {'','ASIA','','','','USA',''}); % label only two categories 
hold on; 
for ii = 1:3 
    plot(NaN,1,'color', c(ii,:), 'LineWidth', 4); 
end 

title('BOXPLOT'); 
ylabel('MPG'); 
xlabel('ORIGIN'); 
legend({'SUV', 'SEDAN', 'SPORT'}); 

set(gca, 'XLim', [0 8], 'YLim', [-5 5]);