Is it possible to give an categorical date set values so it can be used for a plot.
조회 수: 5 (최근 30일)
이전 댓글 표시
I have a variable in my workspace: name=Wind_dir value=2560x1 categorical
These are wind directions (N, NNW, NW, NWW, ect) i can not figure out how to edit this. Is it possible to give like a value to N so i can use it for a plot or do i first need to de-categorical it or something like that. I dont have an idea where to begin.
댓글 수: 2
채택된 답변
Dave B
2021년 11월 19일
편집: Dave B
2021년 11월 19일
Note that you can plot categorical variables in a variety of ways. Passing your categoricals directly into your plotting function can be really useful!
c = categorical(["Apple" "Banana" "Orange"]);
y = [1 2 3];
nexttile;bar(c,y)
c = categorical(["Apple" "Banana" "Banana" "Banana" "Apple" "Orange" ...
"Apple" "Orange" "Banana" "Banana" "Orange"]);
nexttile;histogram(c)
nexttile;pie(c)
nexttile;plot(c)
You can also convert categoricals to numeric...if you want. Calling double on a categorical will convert the first category to 1, the second category to 2, etc. Note that the order of categories typically depends on the second argument to categorical, or you can change it after the fact if you use reordercats. If you want to know the map between the categories and the numbers, you can use categories:
c = categorical(["Apple" "Orange" "Banana" "Banana"])
double(c)
categories(c)
You may also want to map some specific values for categoricals. You could define an equation to map them (in the case where they're ordered such that you can do some math from values like above:
c = categorical(["North" "North" "South" "South" "West" "West" ...
"South" "East" "North" "North"], ["North" "East" "South" "West"])
(double(c)-1)*90
But in the more general case, you can look them up by defining a table (or two variables) that relates the categoricals to the numerics you want associated with them. Here's a 'fun' way to do that without a loop:
cardinal=categorical(["North";"East";"South";"West"]);
ang=[0;90;180;270];
t=table(cardinal,ang);
[r,~]=find(c==t.cardinal);
t.ang(r)
figure
polarhistogram(deg2rad(t.ang(r)),deg2rad(-45:90:315));
set(gca,'ThetaZeroLocation','top','ThetaDir','clockwise')
댓글 수: 3
Peter Perkins
2021년 11월 23일
It's not widely known that, if c is a categorical, you can index into another array whose order is the same as c's categories. So IIUC, this step
[r,~]=find(c==t.cardinal);
in Dave's code would not be necessary. This
t.ang(c)
would do the trick.
Dave B
2021년 11월 23일
Unfortunately, it appears this trick doesn't work with tables, but you can use Peter's indexing magic with vectors. Though it's worth noting that if you do that you better make sure that they both specify the same order (which I skipped in my creation of cardinal above
c = categorical(["North" "North" "South" "South" "West" "West" ...
"South" "East" "North" "North"], ["North" "East" "South" "West"]);
cardinal=categorical(["North";"East";"South";"West"], ["North";"East";"South";"West"]);
ang=[0;90;180;270];
ang(c)
% Unfortunately this isn't allowed:
t = table(cardinal, ang);
t.ang(c)
추가 답변 (0개)
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!