# How to sorting categorical array for plotting

19 vues (au cours des 30 derniers jours)
Moh Rifqy Risqullah le 25 Avr 2023
Hi everyone,
I have categorical array that use to plot. But in the plot, the x-axis isn't numerically. Its plot from M1, M10, M2, M3...M9 instead M1,M2,...M10
male=MakeMaleSample(10);
male=categorical(male);
data_male=[1:10];
plot(male,data_male);
grid on
function male=MakeMaleSample(n)
male="M"+string(1:n);
end
##### 0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

### Réponse acceptée

Stephen23 le 25 Avr 2023
Modifié(e) : Stephen23 le 25 Avr 2023
By default the categories are sorted into character order, not alphanumeric order.
S = "M"+(1:10);
A = categorical(S)
A = 1×10 categorical array
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
C = categories(A) % default order = sorted by character.
C = 10×1 cell array
{'M1' } {'M10'} {'M2' } {'M3' } {'M4' } {'M5' } {'M6' } {'M7' } {'M8' } {'M9' }
Y = 1:10;
plot(A,Y);
Solution one: You can specify the order when creating the categorical array:
D = categorical(S, "M"+(1:10)) % looks the same as A ...
D = 1×10 categorical array
M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
categories(D) % but the categories are in the expected order.
ans = 10×1 cell array
{'M1' } {'M2' } {'M3' } {'M4' } {'M5' } {'M6' } {'M7' } {'M8' } {'M9' } {'M10'}
Solution two: change the category order of an existing categorical array using REORDERCATS, e.g.:
[~,X] = sort(str2double(replace(C,"M","")));
B = reordercats(A,C(X));
categories(B)
ans = 10×1 cell array
{'M1' } {'M2' } {'M3' } {'M4' } {'M5' } {'M6' } {'M7' } {'M8' } {'M9' } {'M10'}
Solution three: For compactness you could also use NATSORT (must be downloaded here):
E = reordercats(A,natsort(categories(A)));
categories(E)
ans = 10×1 cell array
{'M1' } {'M2' } {'M3' } {'M4' } {'M5' } {'M6' } {'M7' } {'M8' } {'M9' } {'M10'}
Once you have the categories in the required order, then your plot will look as you expect:
plot(E,Y);
##### 1 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Moh Rifqy Risqullah le 25 Avr 2023
Thank you

Connectez-vous pour commenter.

### Plus de réponses (1)

dpb le 25 Avr 2023
function male=MakeMaleSample(n)
male=categorical("M"+1:n,"M"+1:n);
end
To force a non-lexical sort order, you have to specify the specific order explicitly...
##### 1 commentaireAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens
Moh Rifqy Risqullah le 25 Avr 2023
Thank you

Connectez-vous pour commenter.

### Catégories

En savoir plus sur Shifting and Sorting Matrices dans Help Center et File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by