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?
Thanks in advance!

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)

plot_gr_stick

3 Likes

Great! Thank you so much!

Suggest modifying the title of your post to “Plot with sticks” :slight_smile:

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))

plot_gr_quiver_sticks

In which case, you could rename post title: “Plot with sticks or arrows” :wink:

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))

Screen Shot 2021-09-20 at 4.15.59 PM

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:

Fixed 3d arrow head sizes:

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)
        v1, v2 = -[u,v,w]/nv, nullspace(adjoint([u,v,w]))[:,1]
        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[1]], [y+v,y+v-v5[2]], [z+w,z+w-v5[3]], lc=lc, la=la, lw=lw, label=false)
        plot!([x+u,x+u-v4[1]], [y+v,y+v-v4[2]], [z+w,z+w-v4[3]], 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!