Simple question regarding bar plot with categorical data

220 visualizzazioni (ultimi 30 giorni)
maho il 6 Ott 2017
Modificato: Toshia M il 20 Set 2023
Hello guys,
I am new to matlab, and I'm trying to do a simple bar plot, like this:
x = ["bananas" "apples" "cherries"];
y = [14,12,7];
bar(categorical(x),y);
The problem is that bar() function seems to sort the x-labels in alphabetical order. Is there any way to override this behaviour, so that the x-labels are left in their original order?
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Risposta accettata

Sean de Wolski il 6 Ott 2017
Modificato: Sean de Wolski il 6 Ott 2017
x = categorical(["bananas" "apples" "cherries"]);
x = reordercats(x,{'bananas' 'apples' 'cherries'});
y = [14,12,7];
bar(x,y);
Categoricals can have order associated with them (for the purpose of relational operators).
6 CommentiMostra 4 commenti meno recentiNascondi 4 commenti meno recenti
tesarj13 il 23 Nov 2020
Even better with coversion to string:
x = categorical(["bananas" "apples" "cherries"]);
x = reordercats(x,string(x));
y = [14,12,7];
bar(x,y);
Toshia M il 20 Set 2023
Modificato: Toshia M il 20 Set 2023
Starting in R2023b, you can specify x as a string vector (or a cell array of character vectors), and MATLAB preserves the order. For example:
x = ["bananas" "apples" "cherries"];
y = [14,12,7];
bar(x,y)

Accedi per commentare.

Più risposte (4)

Steven Lord il 6 Ott 2017
If you're using release R2016b or later you could use histogram with a vector of BinCounts instead of using bar.
x = ["bananas" "apples" "cherries"];
C = categorical(x);
y = [14,12,7];
h = histogram('Categories', C, 'BinCounts', y);
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Souarv De il 8 Apr 2021
Modificato: Souarv De il 8 Apr 2021
I also faced the same issue. There are numerous shortcut techniques available to solve it out. What I used to follow is as below :
x = categorical(["bananas" "apples" "cherries"]);
x = reordercats(x,cellstr(x)');
y = [14,12,7];
bar(x,y);
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Rik il 6 Ott 2017
Modificato: Rik il 6 Ott 2017
The problem is not in bar, but in categorical. I can't find in the doc how to preserve order (with unique I know there is a switch to do so). So my suggestion would be to convert it yourself:
[~,ia,~]=unique(x,'stable');
x2=1:length(x);
x2=x(ia);
bar(x2,y)
xticks(x2)
xticklabels(x)%might not work, as this expects a cell stray containing strings
Of course, your labels are very likely to be unique, otherwise bar wil most likely yield an error, so this should work the same in all valid situations:
x2=1:length(x);
bar(x2,y)
xticks(x2)
xticklabels(x)%might not work, as this expects a cell stray containing strings
2 CommentiMostra NessunoNascondi Nessuno
Rik il 6 Ott 2017
xticklabels and xticks were introduced in R2016b, so for earlier releases you should use gca and set the XTick and XTickLabels properties.
maho il 9 Ott 2017
Thank you for your response, Rik!
Your solution works, but it doesn't produce the same graphical output as using bar() with a categorical 'x' variable. In particular, if you squash the graph window horizontally, so that it is tall and narrow, you see that:
bar() using categorical variables very cleverly rotates the labels so they don't mush together
bar() using xticklabels() not so cleverly mushes the labels together so they become unreadable. :(
The same thing happens if you have many columns in your bar chart in relation to the physical width of your graph.

Accedi per commentare.

michael dupin il 3 Ott 2022
Modificato: michael dupin il 3 Ott 2022
*** Use histogram and not bar :)
I've been struggling with this until now, so sharing with the community. You can use the histogram simply as a drawing function, not actually counting anything.
Including the vertical bars as well (instead of "barh"), as long labels are typically better displayed horizontally.
Et voila! Good luck. Mike
x = ["bananas" "apples" "cherries"];
y = [14,12,7];
histogram('Categories',x,'BinCounts',y,'orientation','horizontal');
histogram('Categories',x,'BinCounts',y);
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Categorie

Scopri di più su Formatting and Annotation in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by