Different colours for arrows in quiver plot

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

2 comentarios

darova
darova el 11 de Nov. de 2019
You don't want to use quiver? Or what do you want quiver do?
Hamed Nobarani
Hamed Nobarani el 11 de Nov. de 2019
I want to use quiver which is corresponding to the magnitude and angle of the vectors and interpolate them in 360 degree colormap.

Iniciar sesión para comentar.

 Respuesta aceptada

Thorsten
Thorsten el 11 de Nov. de 2019
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(...)

3 comentarios

Hamed Nobarani
Hamed Nobarani el 11 de Nov. de 2019
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
Thorsten el 11 de Nov. de 2019
Yes.
Hamed Nobarani
Hamed Nobarani el 11 de Nov. de 2019
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

Iniciar sesión para comentar.

Más respuestas (1)

Hamed Nobarani
Hamed Nobarani el 11 de Nov. de 2019

0 votos

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

Categorías

Más información sobre Vector Fields en Centro de ayuda y File Exchange.

Preguntada:

el 11 de Nov. de 2019

Respondida:

el 11 de Nov. de 2019

Community Treasure Hunt

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

Start Hunting!

Translated by