How to sorting categorical array for plotting

17 ビュー (過去 30 日間)
Moh Rifqy Risqullah
Moh Rifqy Risqullah 2023 年 4 月 25 日
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
Thanks for your help

採用された回答

Stephen23
Stephen23 2023 年 4 月 25 日
編集済み: Stephen23 2023 年 4 月 25 日
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 件のコメント
Moh Rifqy Risqullah
Moh Rifqy Risqullah 2023 年 4 月 25 日
Thank you
This is the complete answer

サインインしてコメントする。

その他の回答 (1 件)

dpb
dpb 2023 年 4 月 25 日
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 件のコメント
Moh Rifqy Risqullah
Moh Rifqy Risqullah 2023 年 4 月 25 日
Thank you
This is the simple answer

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeShifting and Sorting Matrices についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by