put bars in bar graph in ascending order?

32 views (last 30 days)
i want to put this in order from smallest to largest population instead of alphabetical order. How can I do this?
clc
clear all
close all
%reading the file
[numbers text]=xlsread('homelesspopinamerica.xlsx');
%manipulating withthe data and storing it at our convenience
statenames=text(2:51,1:2);
pop=numbers(1:50,:);
states=statenames(:,2);
state=statenames(:,2);
homepop=pop(:,2);
homeperc=pop(:,4);
totpop=pop(:,3);
states=categorical(states);
%plotting
figure
bar(states,homepop)
xlabel('States', 'Fontsize', 18)
ylabel('Numer of Homeless Persons (Millions)', 'Fontsize', 18)
title('HOMELESSNESS IN AMERICA 2017', 'fontsize', 24);
set(gcf,'color','w');
set(gcf, 'Units', 'Normalized', 'OuterPosition', [0 0 1 1]);
%turn on grid lines
set(gca,'XGrid','off')
set(gca,'YGrid','on')

Accepted Answer

Walter Roberson
Walter Roberson on 7 Jun 2018
If you have a look at https://www.mathworks.com/help/matlab/ref/categorical.html then you can see that when you construct the categorical array, you can pass "valueset" as the second parameter, and that the categories would be ordered according to the values in valueset. So you could pass the populations of the states in the second parameter, and the corresponding state names in the third parameter, and that would create names sorted by population.

More Answers (1)

Sandro Lecci
Sandro Lecci on 7 Jun 2018
Hi,
Use the sort function as following:
...
homepop = pop(:,2);
[~, I] = sort(homepop, 'ascend');
% remove/comment this line --> states = categorical(states);
...
bar(homepop(I));
set(gca, 'XTickLabel', states(I))
...
Best, Sandro
  5 Comments
Walter Roberson
Walter Roberson on 7 Jun 2018
Since states is no longer categorical, then at the time of your call to bar(states, homepop) then states is still a cell array of character vectors, which is not accepted.
I suggest you look at the answer I posted on how to get any sorting order you want for categorical.
Sandro Lecci
Sandro Lecci on 8 Jun 2018
Minka, I am not surprised it gives an error.
In the code you simply copied-pasted my section without checking for redundancies. I thought it was somehow clear that you should have replaced the line with the bar function instead of plotting it once as I proposed and then plot it again in your old version. I also re-wrote some of your lines to help you understand where to apply the changes, but it seems you did not get it..
I am glad you found a way to solve your problem. Best

Sign in to comment.

Categories

Find more on MATLAB in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!