Asked by Hamed Nobarani
on 11 Nov 2019 at 3:35

Hi Everyone,

I want to plot arrows with different magnitude and directions in different colors.The code need to calculate the angle of the each vector and fit them in the colormap.

This is what I have wrote but is there anyone that can help me to find the example or any other command or function in matlab that can plot this for me?

for i=1:40

structure(i,:,:)=rombohedral((i-1)*338+1:i*338,:);

X=structure(i,:,4);

Y=structure(i,:,5);

Z=structure(i,:,6);

U=structure(i,:,7);

V=structure(i,:,8);

W=structure(i,:,9);

C=zeros(338,3);

C(1:300,1)=1;

C(300:end,2)=1;

figure(i)

figure(i)

title('2D')

t=num2str(i);

xlabel([t,' ps'])

hold on

for j=1:338

if (U(j)>0)

quiver(X(j),Y(j),U(j),W(j),'color',[1 0 0])

elseif (U(j)<0)

quiver(X(j),Y(j),U(j),W(j),'color',[0 1 1])

elseif (V(j)>0)

quiver(X(j),Y(j),W(j),V(j),'color',[0 1 0])

elseif (V(j)<0)

quiver(X(j),Y(j),W(j),V(j),'color',[1 0 1])

end

end

end

Answer by Thorsten
on 11 Nov 2019 at 15:06

Accepted Answer

Create a circular colormap:

cmap = colormap(hsv(360));

In the loop: compute the angle and an index into the colormap from the angle

alpha = atan2(W(j), U(j)); % or V(j), W(j) depending on your elseif clause

Convert angle to index

idx = ceil(rad2deg(alpha));

if alpha < 1 % negative indices and 0 are invalid

idx = idx + 360;

end

set(h, 'Color', cmap(idx,:)) % before, change each quiver command to h = quiver(...)

Hamed Nobarani
on 11 Nov 2019 at 15:56

Hi Thorsten,

Thanks for your answer.

My vectors are just U and V, I have added W to get the 3d quiver plot but I don't need that now.

So I need to calculate the orientation of vector of u and v with respect to the x axis (0-360 degree) and interpolate them with the colormap.

By using if and else if I was trying to define the color for each quadrant (so I had just 4 colors), which I don't need them anymore. Am I correct?

Thorsten
on 11 Nov 2019 at 17:04

Yes.

Hamed Nobarani
on 11 Nov 2019 at 21:09

Thanks,

I have modified my code but I'm getting this error:

Index in position 1 is invalid. Array indices must be positive integers or logical values.

Error in Colormap (line 39)

set(h, 'Color', cmap(idx,:)) % before, change each quiver command to h = quiver(...)

for i=1:40

structure(i,:,:)=rombohedral((i-1)*338+1:i*338,:);

X=structure(i,:,4);

Y=structure(i,:,5);

Z=structure(i,:,6);

U=structure(i,:,7);

V=structure(i,:,8);

W=structure(i,:,9);

C=zeros(338,3);

C(1:300,1)=1;

C(300:end,2)=1;

figure(i)

figure(i)

title('2D')

t=num2str(i);

xlabel([t,' ps'])

hold on

for j=1:338

cmap = colormap(hsv(360));

alpha = atan2(V(j), U(j));

idx = ceil(rad2deg(alpha));

if alpha < 1

idx = idx + 360;

end

h=quiver(X(j),Y(j),U(j),V(j));

set(h, 'Color', cmap(idx,:))

end

end

Sign in to comment.

Answer by Hamed Nobarani
on 11 Nov 2019 at 23:36

Hi

I have attached the example here:

clc

close all

clear all

deg=linspace(0,2*pi,720);

r=1;

hold on;

for i =1 :720

cmap = colormap(hsv(360));

u(i)=r*cos(deg(i));

v(i) = r*sin(deg(i));

alpha(i) = atan2(v(i), u(i));

idx = ceil(rad2deg(alpha(i)));

if idx < 1

idx = idx + 360;

end

x(i)=0;

y(i)=0;

quiver(x(i),y(i),u(i),v(i),'color',cmap(idx,:))

axis equal

end

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 2 Comments

## darova (view profile)

## Direct link to this comment

https://uk.mathworks.com/matlabcentral/answers/490351-different-colours-for-arrows-in-quiver-plot#comment_765987

## Hamed Nobarani (view profile)

## Direct link to this comment

https://uk.mathworks.com/matlabcentral/answers/490351-different-colours-for-arrows-in-quiver-plot#comment_766040

Sign in to comment.