Bar graph grouped with two y axis

% clc
% clear all
x = categorical({'Filament'; 'Model'});
%y = [0.415047 0.11398; 0.41697 0.013588];
y = [0.415047; 0.41697];
z = [0.11398,0.013588];
bar (x,y,'grouped')
hold on
yyaxis right
%ylim([0.35, 0.45]);
ylabel('Weight (g)');
%err = [0.002542, 0.002192];
%errorbar(A, y, err, '- .', 'MarkerSize', 8)
yyaxis left
%ylim([0, 0.15]);
ylabel('Mass reduction (%)');
%err = [0.003711,0.001355];
%errorbar(A, z, err, '- .', 'MarkerSize', 8)
bar (x,z,'grouped')
hold on
Trying to get a bar graph that share same axis and have two y axis. Tried 'grouped' function but still come out as a stacked bar graph.

1 comentario

Adam Danz
Adam Danz el 6 de Dic. de 2021
I've formatted your code and produced the resultant figure using the Run feature. What would you like to change about this figure?

Iniciar sesión para comentar.

 Respuesta aceptada

Dave B
Dave B el 6 de Dic. de 2021
Editada: Dave B el 6 de Dic. de 2021
bar graphs don't collaborate between sides of a yyaxis very well, but you can fake it by padding with zeros:
x = categorical({'Filament'; 'Model'});
y = [0.415047; 0.41697];
z = [0.11398; 0.013588];
nil = [0; 0];
bar(x, [y nil], 'grouped')
ylabel('Mass reduction (%)');
yyaxis right
bar(x, [nil z], 'grouped')
ylabel('Weight (g)');

9 comentarios

+1
x = categorical({'Filament'; 'Model'});
y = [0.415047; 0.41697];
z = [0.11398; 0.013588];
nil = [0; 0];
yyaxis left % <--- adding this maintains color pairing between bars and axes
bar(x, [y nil], 'grouped')
ylabel('Mass reduction (%)');
yyaxis right
bar(x, [nil z], 'grouped')
ylabel('Weight (g)');
Dave B
Dave B el 6 de Dic. de 2021
Editada: Dave B el 6 de Dic. de 2021
Oops, I was so excited I forgot to include left :)
Also worth considering is using nan(2,1) instead of [0; 0] which will make your code resiliant to changing the 'BaseValue' property, though mixing that with yyaxis would make for a confusing chart:
x = categorical({'Filament'; 'Model'});
y = [0.415047; 0.41697];
z = [0.11398; 0.013588];
nil = nan(2, 1);
yyaxis left
bar(x, [y nil], 'grouped')
ylabel('Mass reduction (%)');
yyaxis right
bar(x, [nil z], 'grouped')
ylabel('Weight (g)');
or even,
bar(x, [y, nan(size(y))], 'grouped')
bar(x, [nan(size(z)), z], 'grouped')
Shu-An Hsieh
Shu-An Hsieh el 10 de Dic. de 2021
Thank you for the assist! I am trying to put an error bar on the firgure. However, it keeps show in the middle of two bar. Can you let me know how I can fix it? Thanks ahead!
Adam Danz
Adam Danz el 10 de Dic. de 2021
Dave B
Dave B el 10 de Dic. de 2021
Editada: Dave B el 10 de Dic. de 2021
@Adam Danz - we added a property called XEndPoints to Bar in 2019b to give you an easier way to get at the locations of the bars...would that be useful for the answer you noted above? (We also added a YEndPoints that's more useful for stacked bars)
Here's some code that uses XEndPoints and makes sure to grab the correct (visible) bars to get XEndPoints from...(and adds some personal preferences for errorbar aesthetics):
x = categorical({'Filament'; 'Model'});
y = [0.415047; 0.41697];
z = [0.11398; 0.013588];
ysig=[.1;.2];
zsig=[.02;.005];
nil = nan(2, 1);
yyaxis left
hold on
b=bar(x, [y nil], 'grouped');
errorbar(b(1).XEndPoints, y, ysig, 'LineStyle', 'none', 'Marker', 'none', ...
'LineWidth', 1, 'Color', 'k', 'CapSize',0);
ylabel('Mass reduction (%)');
yyaxis right
% you don't really need b= here, because the first bar has the same
% XEndPoints:
b=bar(x, [nil z], 'grouped');
errorbar(b(2).XEndPoints, z, zsig, 'LineStyle', 'none', 'Marker', 'none', ...
'LineWidth', 1, 'Color', 'k', 'CapSize',0);
ylabel('Weight (g)');
Dave B
Dave B el 10 de Dic. de 2021
Editada: Dave B el 10 de Dic. de 2021
Additional note:
I find this visualization a little confusing, it highlights the comparison of Mass reduction vs Weight for Filament, and then again for Model, but that comparison feels wrong given the different y axis scales.
I'd consider redesigining to have the two Mass reduction bars together and the two weight Comparisons together, and then dropping the yyaxis bit:
x = categorical({'Filament'; 'Model'});
y = [0.415047; 0.41697];
z = [0.11398; 0.013588];
ysig=[.1;.2];
zsig=[.02;.005];
tiledlayout(1,2)
nexttile
bar(x,y)
hold on
errorbar(x,y,ysig, 'LineStyle', 'none', 'Marker', 'none', ...
'LineWidth', 1, 'Color', 'k', 'CapSize',0);
ylabel('Mass Reduction (%)')
box off
nexttile
bar(x,z,'SeriesIndex',2)
hold on
errorbar(x,z,zsig, 'LineStyle', 'none', 'Marker', 'none', ...
'LineWidth', 1, 'Color', 'k', 'CapSize',0);
ylabel('Weight (g)')
box off
Shu-An Hsieh
Shu-An Hsieh el 10 de Dic. de 2021
Thank you so much for the help this is really helpful!
Adam Danz
Adam Danz el 10 de Dic. de 2021
Thanks for the reminder, Dave. I couldn't remember if I had used those newer properties or not but it looks like I did.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre 2-D and 3-D Plots en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 6 de Dic. de 2021

Comentada:

el 10 de Dic. de 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by