2016-06-13 2 views
3

У меня есть некоторые данные, которые я хочу представить с гистограммой:делают бар участок с несколькими осями у

AAA=[2/3 1.5/3 .5/3 3; 1.5/3 1.8/3 .5/3 2.8]; 
figure 
bar([1 2], AAA, 'BarWidth', 1) 

Но я хотел бы использовать одну оси у в течение первых трех баров каждой строки AAA и другой для четвертой.

Я не мог использовать plotyy, как предложено here, потому что у меня слишком много записей.

Знаете ли вы некоторые альтернативы?

+0

Если у вас есть 2016a, вы можете использовать ['yyaxis'] (http://www.mathworks.com/help/matlab/ref/yyaxis.html) – Dan

+0

@Dan, к сожалению, у меня есть 2014a – shamalaia

ответ

4

ВНИМАНИЕ: Это решение не обобщать легко, когда у вас есть разное количество баров ... другой метод, который обобщенную немного лучше представлена ​​в конце

от чтения docs, я дон почему нет plotyy (не считая устаревшего в пользу yyaxis в 2016 году).

plotyy (X1, Y1, X2, Y2, 'function1', 'function2') использует FUNCTION1 (X1, Y1), чтобы построить данные для левой оси и function2 (x2, y2) для построения данных для правой оси.

y1 = [2/3 1.5/3 .5/3; 1.5/3 1.8/3 .5/3]; 
y2 = [3; 2.8]; 
x = [1,2]; 
figure 

% based on http://stackoverflow.com/questions/18688381/matlab-bar-plot-grouped-but-in-different-y-scales 
offset = (x(2)-x(1))/16; %needs to be generalised, so the 16 should be something like 2^(size(y1,2)+1) or 2^(size(y1,2)+size(y2,2)) 
width = (x(2)-x(1))/4; %The 4 here also needs to be generalized 
colors = {'b','g'}; 
plotyy(x-offset*5,y1,x+offset*2,y2, @(x,y) bar(x,y,width*4,colors{1}), @(x,y) bar(x,y,width,colors{2})); 

enter image description here

Но я бы вопрос, будет ли это быть понятнее, а просто использовать subplot


Если вы хотите изменить цвет отдельных баров (в категория, которая есть), вы должны сделать это вручную:

h = plotyy(x-offset*5,y1,x+offset*2,y2, @(x,y) bar(x,y,width*4,colors{1}), @(x,y) bar(x,y,width,colors{2})); 
barGroup1 = h(1).Children; 
map1 = [0, 0, 0.4; 
     0, 0, 0.6; 
     0, 0, 1]; 
for b = 1:numel(barGroup1) 
    barGroup1(b).FaceColor = map1(b,:); 
end 

enter image description here


Другой способ сделать это вместо того, чтобы возиться с offset и width переменных, только колодки каждый y с кучей 0 с:

y1 = [2/3 1.5/3 .5/3,1; 1.5/3 1.8/3 .5/3,1;1,1,1,1]; 
y2 = [3,1; 2.8,1;1,1]; 
x = [1,2,4]; %x doesn't need to go up in increments of 1 (spacing will differ as you can see in the image), however it can only contain integers 
nCol = max(size(y1,2),size(y2,2))*2; 
Y1 = zeros(size(y1,1),nCol); 
Y2 = zeros(size(y2,1),nCol); 
% The idea is the make all the bars from group 1 sit before the group number (i.e. the numbers going from the halfway mark backwards) and all the bars from group 2 sit after the halfway mark (i.e. the numbers from the middle(+1) going forward) 
Y1(:,nCol/2-size(y1,2)+1:nCol/2) = y1 
Y2(:,nCol/2+1:nCol/2+1+size(y2,2)-1) = y2 
h = plotyy(x,Y1,x,Y2, @(x,y) bar(x,y,1,'b'), @(x,y) bar(x,y,1,'g')); 

enter image description here

Вы можете покрасить эту диаграмму так же, как указано выше. Это должно обобщать независимо от количества баров. К сожалению, вы не можете контролировать размер разрыва между группами.

+0

@ Dan Знаете ли вы как указать цвет каждого бара? 'colors = {'g', 'b', 'k', 'r'};' и 'plotyy (x-offset * 5, y1, x + offset * 2, y2, @ (x, y) bar (x, y, width * 4, colors {1: 3}), @ (x, y) bar (x, y, width, colors {4})); 'не совсем работает – shamalaia

+0

@A_C. Общепринято, чтобы повышать, а также принимать максимальные усилия пользователя. – kkuilla

+0

@kkuilla Приобретение ответа дает уже много точек репутации.Я обычно повышаю, если ответ добавляет больше, чем требует вопрос. Я думаю, что другим пользователям будет предложено ответить. Конечно, я бы оставил другой ответ, отличный от принятого. Я думаю, это справедливо. – shamalaia

Смежные вопросы