# Simple question regarding bar plot with categorical data

292 views (last 30 days)

Show older comments

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 Comments

### Accepted Answer

Sean de Wolski
on 6 Oct 2017

Edited: Sean de Wolski
on 6 Oct 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 Comments

tesarj13
on 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);

### More Answers (4)

Steven Lord
on 6 Oct 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 Comments

Souarv De
on 8 Apr 2021

Edited: Souarv De
on 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 Comments

Rik
on 6 Oct 2017

Edited: Rik
on 6 Oct 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 Comments

Rik
on 6 Oct 2017

michael dupin
on 3 Oct 2022

Edited: michael dupin
on 3 Oct 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 Comments

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!