MATLAB Answers

Undefined unary operator '-' for input arguments of type 'string error

33 views (last 30 days)
Elnaz P
Elnaz P on 7 Jul 2020
Commented: Elnaz P on 8 Jul 2020 at 14:07
I am going to show x axis in scatter plot by text label like below with positive and negative signs however I get this error
"Undefined unary operator '-' for input arguments of type 'string' "
Can someone please assist in rectifying?
n= ["-240-260";"-220-240";"-200-220";"-180-200";"-160-180";"-140-160";"-120-140";"-100-120";"-80-100";"-60-80";"-40-60";"-20- 40";"0-20";"0+20";"+20+40";"+40+60";"+60+80";"+80+100";"+100+120";"+120+140";"+140+160";"+160+180";"+180+200";"+200+220";"+220+240"];
y1 = [0,0,0,0,0,0,0,0,0,0,0,0.04,0.32,0.56,0.08,0,0,0,0,0,0,0,0,0,0];
y2 = [0,0.05,0.05,0.05,0,0.1,0,0,0.2,0.3,0.1,0.1,0.05,0,0,0,0,0,0,0,0,0,0,0,0];
x=categorical(n);
plot(x,y1,'r--o', x,y2,'k--o');

  5 Comments

Show 2 older comments
Elnaz P
Elnaz P on 7 Jul 2020
Yes you're right, thanks
but there is another problem, I don't see the x axis regularly, from "-260-240" to "+220+240".
Rik
Rik on 7 Jul 2020
You have told Matlab those strings are categories, so Matlab treated them as categories. Do you want to treat them as bins of a histogram instead?
Elnaz P
Elnaz P on 7 Jul 2020 at 15:19
Yes it is histogram. I am going to sort x axis from "-260-240" to "+220+240". I did x=sort (categorical(n)); but doesn't work. Please see attached photo.

Sign in to comment.

Accepted Answer

Steven Lord
Steven Lord on 7 Jul 2020 at 17:58
When you call categorical with one input, the list of categories in that categorical is the sorted unique values in the input. From the documentation page:
"B = categorical(A) creates a categorical array from the array A. The categories of B are the sorted unique values from A."
Call categorical with two inputs to keep the categories in your desired order.
"B = categorical(A,valueset) creates one category for each value in valueset. The categories of B are in the same order as the values of valueset"
x = categorical(n, n);
plot(x,y1,'r--o', x,y2,'k--o');

  2 Comments

Elnaz P
Elnaz P on 8 Jul 2020 at 14:07
Hi,
Could I ask another question about change origin point of y axis to (0-20)? I gonna shift Y axis to point (0-20) but I don't have any idea.
ax.XAxisLocation = 'origin';
ax.YAxisLocation = 'origin';
origin = (0-20);

Sign in to comment.

More Answers (1)

Alan Stevens
Alan Stevens on 7 Jul 2020 at 15:37
Why not just:
y1 = [0,0,0,0,0,0,0,0,0,0,0,0.04,0.32,0.56,0.08,0,0,0,0,0,0,0,0,0,0];
y2 = [0,0.05,0.05,0.05,0,0.1,0,0,0.2,0.3,0.1,0.1,0.05,0,0,0,0,0,0,0,0,0,0,0,0];
x=-250:20:230;
plot(x,y1,'r--o', x,y2,'k--o');
This plots the "y" points in the middle of your "x" bands.

  2 Comments

Elnaz P
Elnaz P on 7 Jul 2020 at 16:30
Thanks for your help,
but please consider I have
x= ["-240-260";"-220-240";"-200-220";"-180-200";"-160-180";"-140-160";"-120-140";"-100-120";"-80-100";"-60-80";"-40-60";"-20- 40";"0-20";"0+20";"+20+40";"+40+60";"+60+80";"+80+100";"+100+120";"+120+140";"+140+160";"+160+180";"+180+200";"+200+220";"+220+240"];
not exactly x=-250:20:230;

Sign in to comment.