A package for getting timeseries plots out of your Julia session and into PlotJuggler fast. It doesn't so much solve the Time to First Plot issue but does work around it for very basic use cases that correspond well to (some of) PlotJuggler's capabilities.
- Very fast way to just get a simple plot onto the screen.
- Really simple syntax - (ab)use NamedTuples to have plot curve names take on names of variables in local workspace
PlotJuggler.jl is not (yet) registered in General. As with any Julia package not in the General registry, you'll can add it via the URL:
julia> using Pkg
julia> Pkg.add(url="[email protected]:pbouffard/PlotJuggler.jl.git")
Alternatively you can add my personal registry and then add the package. This has the advantage that you'll get any updates I make to the package, and if used in a package then Manifest.toml won't be necessary (although users of the package would also need to add the registry):
julia> using Pkg
julia> pkg"registry add [email protected]:pbouffard/PBouffardJuliaPackageRegistry.git"
julia> pkg"add PlotJuggler"
Note that the package assumes you have the plotjuggler
binary in your PATH
.
using PlotJuggler
t = 0:0.01:5
a = cos.(2*pi*t)
b = sin.(2*pi*t)
# Plot a and b vs. t, labeled:
pjplot(t, (; a, b))
# Plot a and b vs. t, labeled automatically as data1 and data2:
pjplot(t, [a, b])
# Plot a vs. t, where t is automatically set to 1:length(a)
pjplot(a)
The optional xy
argument can be set to include an XY plot of 2 of the variables. The same NamedTuple trick is used to minimize typing. Note that for now it's required that the time history plots include the vectors to be used in the XY plot, and the 'anonymous' forms do not support XY plotting:
c = a .* exp.(-t)
d = b .* exp.(-t)
pjplot(t, (; c, d); xy=(; c, d))
Results of ODE solvers (conforming to AbstractODESolution
) can simply be passed and the components will be plotted against time:
# Adapted from https://mtk.sciml.ai/stable/tutorials/ode_modeling/
@variables t x(t) y(t) # independent and dependent variables
@parameters τ # parameters
@constants h = 1 # constants have an assigned value
D = Differential(t) # define an operator for the differentiation w.r.t. time
@named fol = ODESystem([D(x) ~ y + (h - x) / τ, D(y) ~ -x])
prob = ODEProblem(fol, [x => 0.0, y => 1.0], (0.0, 20.0), [τ => 3.0])
sol = solve(prob)
pjplot(sol; title="ODE Solution")
Very hackily, honestly. The provided data gets written to a CSV file, and the curve names are used to write a PlotJuggler layout XML file. These are passed to PlotJuggler using commandline arguments.
This isn't meant to be a replacement for things like Plots.jl or Makie which are what you should use if a lot of customization is required. On the other hand, it might be nice to make PlotJuggler an available backend for Plots.jl, though it would only be able to support a fairly limited subset vs. the other backends.
- The CSV Loader dialog pops up asking to select the X axis column, just hit Enter to take the default of t. This appears to be a PlotJuggler bug, as the XML layout file does contain this information and supposedly this should prevent the popup.
- Each invocation starts a brand new PlotJuggler process.
- Only a basic layout of a single tab with a single axis containing 1 or more curves plotted against time is supported. I have notional plans to improve this such that multiple axes are generated based on nested vectors, e.g.
pjplot(t, [(; a, b], c)]
would give you 2 stacked plots, witha
andb
plotted against time in the top plot andc
vs time in the bottom one. - Since
which
is used to locate theplotjuggler
binary this probably means it won't work on Windows, though probably fixing this is easy. - Many other features of PlotJuggler aren't supported, e.g. streaming data. It should be possible to add such features though.