I wish this was just an issue only caused by large datasets. On Plots.jl version 1.20.0, just 10 scatter points and a straight line drawn based on the parameters returned by LsqFit.jl seems to be extremely slow, regardless of the output format:
8.972615 seconds (20.30 M allocations: 1.104 GiB, 4.26% gc time, 2.74% compilation time)
The code that generates these numbers goes as follows:
function draw_scatter_and_line(
xdata,
ydata,
gradient,
constant_term,
scatter_title,
line_title,
xlabel,
ylabel,
filename
)
img_path = joinpath(@__DIR__, filename)
# Generate plot object
img = Plots.plot(
xlabel=xlabel,
ylabel=ylabel,
legend=:bottomright)
# Measurements
Plots.scatter!(
img,
xdata,
ydata,
label=scatter_title,
color=:steelblue)
# Generate fit
fit_x = [xdata[begin] - abs(xdata[end] / 10), xdata[end] + xdata[end] / 10)
fit_y = gradient .* fit_x .+ constant_term
# Draw fitted line:
Plots.plot!(
img,
fit_x,
fit_y,
linestyle=:dash,
label=line_title,
color=:steelblue)
# The bottleneck
@time Plots.pdf(img, img_path)
end
The compilation times of Plots.{pdf, savefig}
seem irrelevant when looking at how many allocations they are doing. Again, xdata
and ydata
are vectors of length 10…