Is it possible? I tried to search for information but I’m not sure what key words I should use . . .
In the following example, the first and last markers are cut in half or quarter at the left and right edges of the frame of the graph:
using Plots
a = vcat(1, rand(Float64, 10))
plot(0:10, a; xlim=(0,10), ylim=(0,1), marker=:circle, markersize=5)
I’d like the circles to be fully displayed.
Also, I sometimes want to extend the lines and markers beyond the edges of the frame. [It’s a bit ugly but a bit more informative than not showing those datapoints when only a few datapoints fall a little beyond the round number axis limits. Suppose, for example, 97 of the 100 values fall between 0 and 1 and the remaining 3 are like 1.06; then you might choose to set the y axis limit to [0,1] and let the three points shown beyond the upper edge of the frame.]
In this case, using frame=:origin
and adequate xlim
, ylim
, can help:
using Plots; gr()
x, y = 0:10, vcat(1, rand(Float64, 10))
ex, ey = extrema(x), extrema(y)
ϵ₁, ϵ₂ = 0.03*(ex[2] - ex[1]), 0.03*(ey[2] - ey[1])
plot(x, y; frame=:origin, xlim=(-ϵ₁,10+ϵ₁), ylim=(-ϵ₂,1+ϵ₂), m=:circle, ms=5)
The above code is displayed in the left panel, while the default display is on the right:
1 Like
Thank you for your help! You made me realize that xlim
and ylim
refer to the data, not the axes. I’ve also learned the frame
attribute. . . .
. . . But, your
In this case
has made me wonder . . . As a test, I shifted the data upward such that the data range is [1, 2]. See the sample code and the image below. We then lose the x axis.
If the frame
attribute could specify the exact frame, like, say, frame = ( (xmin, ymin), (xmax, ymax))
, this problem might be solved . . . ?
Sample code: You can shift the ranges of x and y:
using Plots
#ymin = 0; ymax = 1; ydel = 0.1 # <- Works fine.
ymin = 1; ymax = ymin + 1; ydel = 0.1
xmin = 0; xmax = 10; xdel = 1
a = vcat(ymax, rand(Float64, 10) .+ ymin)
ylim = (ymin - ydel, ymax + ydel)
xlim = (xmin - xdel, xmax + xdel)
plot(xmin:xmax, a; xlim=xlim, ylim=ylim,
frame=:origin, marker=:circle, markersize=5)
Yes, that’s my concern. Perhaps you could automate a custom axis function inspired by the solution presented in this post.