ВНИМАНИЕ: Это решение не обобщать легко, когда у вас есть разное количество баров ... другой метод, который обобщенную немного лучше представлена в конце
от чтения 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}));
Но я бы вопрос, будет ли это быть понятнее, а просто использовать 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
Другой способ сделать это вместо того, чтобы возиться с 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'));
Вы можете покрасить эту диаграмму так же, как указано выше. Это должно обобщать независимо от количества баров. К сожалению, вы не можете контролировать размер разрыва между группами.
Если у вас есть 2016a, вы можете использовать ['yyaxis'] (http://www.mathworks.com/help/matlab/ref/yyaxis.html) – Dan
@Dan, к сожалению, у меня есть 2014a – shamalaia