MATLAB Answers

Bar chart legend and colour

31 views (last 30 days)
Megan
Megan on 19 Feb 2020
Commented: Adam Danz on 19 Feb 2020
I have created a bar chart and I want to add the names of the variants on the legend and they shoud have different colours.
How can I realize that?
ds = dataset("xlsfile", "dsCompact");
clean_ds = rmmissing(ds);
%% Mean of Mean of parameter variants for each velocity
[groupVariantsVelocity, variants, velocity, scale] = findgroups(clean_ds.parameter_variants, clean_ds.velocity, clean_ds.scale);
meanVariantsVelocity = splitapply(@mean, clean_ds.score, groupVariantsVelocity);
tVariantsVelocity = table (variants, velocity, scale, meanVariantsVelocity);
figure;
bar(meanVariantsVelocity(scale == "like"));

  6 Comments

Show 3 older comments
Adam Danz
Adam Danz on 19 Feb 2020
The code you shared produces this figure. Each bar is the mean of a varient group just for scale = likeability.
"I want to add the names of the variants on the legend and they shoud have different colours"
I suggest adding the names of the variants to the x axis ticks rather than having a legend with 10 rows of labels and 10 different bar colors.
If you're trying to do something different, please explain in detail.
Megan
Megan on 19 Feb 2020
Hi Adam I have created a plot in paint what I am trying to do:
Megan
Megan on 19 Feb 2020
Sorry can you have a look at this data set?
It was the wrong one

Sign in to comment.

Accepted Answer

Adam Danz
Adam Danz on 19 Feb 2020
Edited: Adam Danz on 19 Feb 2020
There are two approaches below. I recommend using the first one where the bars and labeled by the xtick labels. You can rotate them at any angle you wish. The second approach colors each bar and uses a colorbar to identify the color code. This requires a lot more work from the user to match the bar to the color. With a greater number of bars, the colors become too similar.
Also, consider reading the data in as a table instead of using datasets.
Use x tick labels
figure();
scaleSelection = strcmp(scale,'like'); % use strcmp(), not "==".
barData = meanVariantsVelocity(scaleSelection);
bh = bar(barData);
% add x tick labels
ax = bh.Parent;
ax.XTick = 1:numel(barData);
ax.XTickLabel = variants(scaleSelection);
ax.TickLabelInterpreter = 'none';
xtickangle(ax, 45) % or try 90 degrees
Colored bars with colorbar as legend
This is not recommended.
figure();
scaleSelection = strcmp(scale,'like'); % use strcmp(), not "==".
barData = meanVariantsVelocity(scaleSelection); % use strcmp(), not "==".
bh = bar(barData);
% set bar color
bh.FaceColor = 'flat';
bh.CData = jet(numel(barData)); % use any colormap you'd like
% Add colorbar with categorical color labels
colormap(bh.CData)
cb = colorbar();
caxis([0,numel(barData)])
cb.YTick = 0.5 : 1 : numel(barData);
cb.TickLabels = variants(scaleSelection);
cb.TickLabelInterpreter = 'none';
cb.FontSize = 8;
bh.Parent.Position(3) = 0.55; % make the axis narrower to fit the colorbar labels.

  11 Comments

Show 8 older comments
Adam Danz
Adam Danz on 19 Feb 2020
The grouped bars can be achieved by the following code.
However, it is assumed that there is an equal number of values for each velocity group.
figure();
scaleSelection = strcmp(scale,'like'); % use strcmp(), not "==".
barData1 = meanVariantsVelocity(scaleSelection);
velocityGroups = findgroups(velocity(scaleSelection));
barMat(:,1) = barData1(velocityGroups==1);
barMat(:,2) = barData1(velocityGroups==2);
bar(barMat)
Megan
Megan on 19 Feb 2020
I cant add a title.
Do you know why?
Adam Danz
Adam Danz on 19 Feb 2020
I'm not sure what that means.
When you run title('myTitle') or title(axisHandle, 'MyTitle'), do you get an error message? Does the title not appear? You'll need to be more descriptive.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!