VPC subplot/facet title customization

Hello Pumas team,

I have a vpc stratified by treatment arm in Pumas. I would like to update labels for the subplot titles. Can you please suggest how to do so?

Thanks!

vpc_arm = vpc(model_fit ; stratify_by=[:TRT])

vpcplot = vpc_plot(
vpc_arm;
axis=(;
ylabel=“”,
xlabel=“”,
),
facet=(;
combinelabels = true,
),
observations = false, observed_ci=true, observed_quantiles=true,
observed_color = “blue”, simquantile_medians=true, simulated_color=“black”,
)

The way I’ve done this in the past was to inspect the underlying result from vpc_plot.

Here’s a MWE:

using Pumas
using PumasUtilities
using PharmaDatasets

pkdata = dataset("iv_sd_3")
population = read_pumas(pkdata; covariates=[:dosegrp])

model = @model begin
    @param begin
        tvcl ∈ RealDomain(; lower = 0.001) # typical clearance 
        tvvc ∈ RealDomain(; lower = 0.001) # typical central volume of distribution
        Ω ∈ PDiagDomain(2)                 # between-subject variability
        σ ∈ RealDomain(; lower = 0.001)    # residual variability
    end
    @random begin
        η ~ MvNormal(Ω)
    end
    @covariates dosegrp
    @pre begin
        CL = tvcl * exp(η[1])
        Vc = tvvc * exp(η[2])
    end
    @dynamics Central1
    @derived begin
        cp = @. 1000 * Central / Vc
        dv ~ @. Normal(cp, cp * σ)
    end
end

params = (tvcl = 1.0, tvvc = 10.0, Ω = Diagonal([0.09, 0.09]), σ = 0.3)

fit_results = fit(model, population, params, FOCE())

fit_vpc = vpc(
    fit_results; # Multi-Threaded
    ensemblealg = EnsembleThreads(),
    stratify_by = [:dosegrp],
)

f = vpc_plot(fit_vpc)

This produces:

Now if you go to the Julia extension and check for the contents of f, like in this image:

You’ll see that f has 4 Makie.Axis inside the f.figure.content vector.

Let’s dive into one of them:

Hey, there’s a title thing with a val which is the same as our title from the first axis in your plot…

Let’s try to change this:

f.figure.content[1].title.val = "Change title 1"

However, this does not change our underlying figure f.
We need to “notify” Makie that things have changed.

We do this with the notify function on whatever we are changing:

notify(f.figure.content[1].title)

And voila, call f again to render the image and you’ll see:

It works.

Now we can change anything inside the Makie.Axis objects, just don’t forget to call notify on it.

I hope this helps you, Krina!

2 Likes

Here’s an improvement, thanks to @andreasnoack.

You can avoid the call to notify with:

content(f.figure[2,2]).title = "Plot 2,2"

This means that you can also use the much more intuitive grid index.

1 Like