# Plot with sticks or arrows

Hi there,
I’m trying to plot scatter data with impulses, specifically with arrows. But, it seems that it does not exist in seriestype options. Any idea about how I can obtain that?

Which plotting package are you using?

Hi! I am using Plots.

Using PyPlot you can use the `arrow` annotation function (python - Arrows on Scatter - Stack Overflow), though you have to write a manual loop to add an arrow for each point.

1 Like

Something like this here?

1 Like

Hi there, thank you both for suggestions. The plot is really easy with gnuplot:

`pl sin(x) w impulses, sin(x) w p pt 8 ps 4, sin(x) w l`

But, with Julia it seems (for me) that is not so easy.

Try this:

``````using Plots; gr()
plot(0:0.1:2π, sin, shape=:utriangle, st=:sticks)
`````` 3 Likes

Great! Thank you so much!

Suggest modifying the title of your post to “Plot with sticks” 2 Likes

Done.

You can check if you like the display better using `quiver` arrows, as suggested above:

``````x = 0:0.1:2π
y = sin.(x)
quiver(x, zero(y), quiver=(zero(x), y))
`````` In which case, you could rename post title: “Plot with sticks or arrows” 2 Likes

No doubt. It looks more appropriate to my concerns.
Thank you again!

My next step was move to 3d, but now I lose the head of arrows…

``````	x1 = 0:0.1:3π
y1 = x1
z1 = sin.(x1)
quiver(x1, zero(y1), zero(y1), quiver=(zero(x1), z1, zero(y1)))
quiver!(x1, zero(x1), zero(x1), quiver=(zero(x1), zero(x1), z1))
`````` It seems that the 3D quiver arrows in Plots.jl might be work in progress.

By extending this user function to 3D, you can get:

##### Proportional 3d arrow head sizes:

Julia 1.7 Plots.jl code used
``````using LinearAlgebra, Plots; gr(dpi=600)

# as: arrow head size 0-1 (fraction of arrow length)
# la: arrow alpha transparency 0-1
function arrow3d!(x, y, z,  u, v, w; as=0.1, lc=:black, la=1, lw=0.4, scale=:identity)
(as < 0) && (nv0 = -maximum(norm.(eachrow([u v w]))))
for (x,y,z, u,v,w) in zip(x,y,z, u,v,w)
nv = sqrt(u^2 + v^2 + w^2)
v4 = (3*v1 + v2)/3.1623  # sqrt(10) to get unit vector
v5 = v4 - 2*(v4'*v2)*v2
(as < 0) && (nv = nv0)
v4, v5 = -as*nv*v4, -as*nv*v5
plot!([x,x+u], [y,y+v], [z,z+w], lc=lc, la=la, lw=lw, scale=scale, label=false)
plot!([x+u,x+u-v5], [y+v,y+v-v5], [z+w,z+w-v5], lc=lc, la=la, lw=lw, label=false)
plot!([x+u,x+u-v4], [y+v,y+v-v4], [z+w,z+w-v4], lc=lc, la=la, lw=lw, label=false)
end
end

# input points and arrows
x = y = 0:0.1:3π; z = zero(x)
u = v = zero(x);  w = sin.(x)

# arrows with fixed head sizes
p = plot(camera=(20,30), legend=false)
arrow3d!(x, zero(y), zero(z), u, w, v; as=-0.05, lc=:red, la=0.5)
arrow3d!(x, zero(y), zero(z), u, v, w; as=-0.05, lc=:blue, la=0.5)
display(p)

# arrows with proportional 5% head sizes
p = plot(camera=(20,30))
arrow3d!(x, zero(y), zero(z), u, w, v; as=0.05, lc=:red, la=0.5)
arrow3d!(x, zero(y), zero(z), u, v, w; as=0.05, lc=:blue, la=0.5)
display(p)

``````
4 Likes

I will take a look.
Thank you!