Why is Julia's graphics system so slow?

No chance. I restarted vscode and test it again. I takes a lot of memory. The plot will work but it will consume your machine memory until it crashes. It hapens with the code below:

using Plots, Roots, Random, LinearAlgebra
default(fmt=:png)
Random.seed!()

N = 10^5
data = [[rand(), rand()] for _ in 1:N];
indata = filter((x) -> (norm(x) <= 1), data);
outdata = filter((x) -> (norm(x) > 1), data);

pi_appox = 4 * length(indata) / N;
println("Pi estimate: ", pi_appox);

scatter(first.(indata), last.(indata), c=:blue, ms=1, msw=0);
scatter!(first.(outdata), last.(outdata), c=:red, ms=1, msw=0, xlims=(0, 1), ylims=(0, 1), legend=:none, ratio=:equal)

@jcbritobr, tried your code and confirmed the VS Code plot pane memory hog (Win10). However, it works very smoothly when setting VS code to plot to external window.

NB: your question should probably be split into a separate topic concerning VS Code plots.

1 Like

May you please explain how to plot in external window using vscode? Iā€™ll open a new topic about this and maybe fill another bug in julia vscode.

Please check this post for a visual explanation.

2 Likes

Well, its another bug. Qt backend is leaking pictures, and I canā€™t delete them :frowning:
image
Iā€™ll stay a while with Pluto, and use vscode only to create packages.

this code worked as workaraund:

p2 = scatter!(first.(outdata), last.(outdata),
    xlabel="x", ylabel="y",
    c=:red, ms=1, msw=0, xlims=(0, 1), ylims=(0, 1), legend=:none, ratio=:equal);

display("image/png", p2)
1 Like

What do you mean? Running your code above in VS Code using Plots; gr() shows a single GKS QtTerm window, to which all new plots are sent to.

Iā€™m running in windows 10 64, julia 1.6.3. The Gks window is storing all plots I run. And each time plot is generated, the memory of old plot is not released.

How do I get Gadfly to use PNG rather than SVG?

using Plots: default
default(fmt=:png)

makes no difference, it is still an SVG.

display("image/png", h)

is not supported for Gadfly objects.

Also, itā€™s not true that SVG is inherently slow. If you save the SVG and drag it onto your brower it displays in an instant.

maybe this should be split in a separate conversation, have a look at Backends Ā· Gadfly.jl

1 Like

The Gadfly backends are for writing files. Iā€™m trying to render in VSCode.

Your message didnā€™t mention VSCode (also, VSCode renders SVG so Iā€™m not sure why youā€™d want to do this in general apart if the SVG is extremely complex and thatā€™s causing issues). Anyway, hereā€™s one way you could do it:

using Fontconfig, Cairo, Gadfly
import Base.show
struct PNGPlot
    p::Gadfly.Plot
end
Base.show(io::IO, ::MIME"image/png", pp::PNGPlot) = draw(PNG(io), pp.p)

png(p) = PNGPlot(p)

plot(y=[1,2,3]) |> png
1 Like

Sorry, I thought this thread was about plotting performance in interactive environments which is why I didnā€™t repeat that information. I have plots that take a minute to display, even after the Gadfly object has been created. Scrolling through plots, saving and deleting them in the plot windows is also very painful. From the discussion above I thought it might be the VSCode handling of SVGs (as I mentioned browsers have no such problem with SVGs). Your elegant and clever code doesnā€™t improve the initial rendering but does make working with the plots in the plot windows much nicer (and taught me something about Julia).

1 Like