Random Regression of Treatment BLUPs from Multi-Treatment MET Analyses

randomRegress() and plot_randomRegress()

Author

Julian Taylor

Published

May 8, 2026


Overview

randomRegress() decomposes variety BLUPs from a multi-treatment, multi-environment trial into two biologically interpretable components:

  • Efficiency — a variety’s genetic value under the baseline (typically low-input) treatment.
  • Responsiveness (or Tolerance) — a variety’s capacity to respond genetically to the application of a treatment.

The decomposition is derived from the G-matrix (genetic variance–covariance matrix across Treatment × Site combinations) using Gaussian conditional distribution theory. It generalises naturally from two treatments to any number, with four built-in conditioning schemes used in this function.

plot_randomRegress() visualises the result as a regression scatter plot, an efficiency–responsiveness quadrant plot, or a G-matrix heatmap.


Mathematical Framework

The G-matrix

For full specification of the multi-treatment, multi-environment LMM see the Simulating Multi-Environment Trials vignette.

Let \hat{\mathbf{u}} be the vector of variety BLUPs stacked across all p = T \times S groups, where T is the number of treatments and S the number of sites. The genetic variance–covariance structure is described by the G-matrix:

\operatorname{Var}(\hat{\mathbf{u}}) = \mathbf{G} \otimes \mathbf{I}_n,

where \mathbf{I}_n is the n \times n identity over varieties and the p \times p G-matrix has a natural S \times S block structure, with each block being T \times T:

\mathbf{G} = \begin{pmatrix} \mathbf{G}_{11} & \mathbf{G}_{12} & \cdots & \mathbf{G}_{1S} \\ \mathbf{G}_{21} & \mathbf{G}_{22} & \cdots & \mathbf{G}_{2S} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{G}_{S1} & \mathbf{G}_{S2} & \cdots & \mathbf{G}_{SS} \end{pmatrix}.

Each diagonal block \mathbf{G}_{ss} is the T \times T matrix of genetic (co)variances among treatments within site s:

\mathbf{G}_{ss} = \begin{pmatrix} \sigma^2_{1s} & \sigma_{1s,2s} & \cdots & \sigma_{1s,Ts} \\ \sigma_{2s,1s} & \sigma^2_{2s} & \cdots & \sigma_{2s,Ts} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{Ts,1s} & \sigma_{Ts,2s} & \cdots & \sigma^2_{Ts} \end{pmatrix},

where \sigma^2_{ts} is the genetic variance for treatment t at site s and \sigma_{ts,t's} is the genetic covariance between treatments t and t' within the same site. Each off-diagonal block \mathbf{G}_{ss'} (s \neq s') is the analogous T \times T matrix of genetic covariances for treatment pairs across sites s and s'.

Allowable ASReml-R specifications

To obtain the \mathbf{G} matrix randomRegress() allows various specifications of the Treatment \times Site \times Variety interaction through its flexible term argument.

Supported ASReml-R covariance/correlation structures are:

Description Structure functions
Site relationships fa(), us(), corgh(), corh(), diag()
Variety relationships id(), ide(), vm()

For ASReml-R models that used corgh() and corh(), randomRegress() will extract the estimated matrix and convert it to a fully unstructured variance matrix \mathbf{G} before genetic regression calculations are undertaken.

Example term strings

randomRegress(model, term = "fa(Site, 2):id(Variety)", ...)
randomRegress(model, term = "fa(Site, 1):vm(Variety, K)", ...)
randomRegress(model, term = "corgh(Site):id(Variety)", ...)
randomRegress(model, term = "us(Site):vm(Variety, K)", ...)
randomRegress(model, term = "corh(Site):Variety", ...)

Conditional decomposition

Conditioning is performed within sites only. For a given site s, the T treatment groups are indexed locally as j = 1, \ldots, T. The scalar G_{jj} is the marginal genetic variance for treatment j at site s, i.e. the (j,j) element of the within-site diagonal block \mathbf{G}_{ss}. The sub-vector \mathbf{G}_{A_j j} contains the covariances between treatment j and the conditioning set A_j \subseteq \{1,\ldots,T\} \setminus \{j\}, drawn from the same block \mathbf{G}_{ss}.

With this specification the multivariate conditional normal distribution gives the regression of \hat{u}_{j} on \hat{\mathbf{u}}_{A_j}:

\hat{u}_{j} \mid \hat{\mathbf{u}}_{A_j} \sim \mathcal{N}\!\left( \boldsymbol{\beta}_j^\top \hat{\mathbf{u}}_{A_j},\; \sigma^2_{j \mid A_j} \right),

where the regression coefficients and conditional genetic variance are

\boldsymbol{\beta}_j = \mathbf{G}_{A_j A_j}^{-1}\, \mathbf{G}_{A_j j}, \qquad \sigma^2_{j \mid A_j} = G_{jj} - \mathbf{G}_{j A_j}\,\boldsymbol{\beta}_j.

Here \mathbf{G}_{A_j A_j}, \mathbf{G}_{A_j j}, and G_{jj} are all sub-blocks or elements of the within-site diagonal block \mathbf{G}_{ss}.

The responsiveness BLUP for variety v is the residual from this regression:

\tilde{u}_{j,v} = \hat{u}_{j,v} - \boldsymbol{\beta}_j^\top \hat{\mathbf{u}}_{A_j,v}.

Responsiveness BLUPs are:

  • zero-mean within each treatment-site group (inherited from the BLUPs)
  • orthogonal to the conditioning BLUPs in the G-matrix sense
  • genetically independent of the efficiency signal, with variance \sigma^2_{j \mid A_j}

The transformation matrix

Collecting all conditioning relationships defines a sparse transformation matrix \mathbf{T} such that:

\tilde{\mathbf{u}} = \mathbf{T}\hat{\mathbf{u}}, \qquad \operatorname{Var}(\tilde{\mathbf{u}}) = \mathbf{T}\mathbf{G}\mathbf{T}^\top \equiv \mathbf{V}_T.

The diagonal blocks of \mathbf{V}_T are the conditional genetic variances \sigma^2_{j \mid A_j}. For type = "sequential" the full \mathbf{V}_T is diagonal — a complete Gram-Schmidt orthogonalisation of the BLUP space.


Conditioning schemes

The four built-in schemes differ only in how A_j is chosen:

Scheme A_j for treatment j \mathbf{V}_T structure Best for
"baseline" \{\text{levs}[1]\} only Block-diagonal Comparing all treatments to one baseline
"sequential" \{\text{levs}[1], \ldots, \text{levs}[j-1]\} Diagonal (\mathbf{L}\mathbf{D}\mathbf{L}^\top Cholesky) Fully orthogonal components
"partial" All other treatments simultaneously Dense Partial genetic variances
"custom" User-specified Depends Bespoke experimental logic

Example 1 — Single site, partial conditioning

Requires: ASReml-R V4 and ASExtras4. The vignette is pre-rendered so no licence is needed to read it; run the code chunks only if you have both packages installed.

Simulated data

We simulate a single-site trial with 50 varieties and three nitrogen treatments (T0 = control, T1 = low N, T2 = high N), three replicates per treatment. With only one site, the G-matrix is a 3 \times 3 matrix describing the genetic (co)variances between treatments.

We use sim.options to restrict the auto-generated between-treatment genetic correlations to a moderate range (0.55–0.70). This keeps the true genetic structure well away from the parameter boundary, giving the corgh model a stable likelihood surface to optimise. The default sigma_genetic and error_sd values produce a per-plot heritability of approximately 0.60, an ample signal for reliable estimation with 50 varieties and 3 replicates.

out1 <- simTrialData(
  nvar       = 50L,
  nsite      = 1L,
  treatments = c("T0", "T1", "T2"),
  nrep       = 3L,
  seed       = 7L,
  verbose    = FALSE,
  sim.options = list(g_cor_min = 0.55, g_cor_max = 0.70)
)
dat1 <- out1$data

The field layout can be examined with plot_simTrialData():

plot_simTrialData(out1, type = "trial", fill = "Treatment", ncol = 3L)

The correlation heatmap confirms that the three treatments have positive genetic correlations with each other (true values in the range 0.55–0.70), reflecting that varieties with good baseline performance also tend to respond positively to applied nitrogen — but not perfectly. This partial sharing of genetic rankings is exactly the structure that partial conditioning is designed to dissect.

Forming TSite and fitting the model

ASReml-R requires a single factor to index the G-matrix columns. We create TSite by pasting the treatment label onto the site name. With only one site this simply appends the site label (e.g. "T0-Site1"), but the same code generalises directly to multi-site data:

dat1$TSite  <- interaction(dat1$Treatment, dat1$Site, sep = "-")
dat1$Row    <- factor(dat1$Row)
dat1$Column <- factor(dat1$Column)
levs1       <- c("T0", "T1", "T2")

We fit a heterogeneous-correlation (corgh) model. With three treatments this parameterises the 3 \times 3 G-matrix with three genetic variances and three pairwise correlations — the most flexible fully-identified structure for this problem size:

model1 <- asreml(
  yield    ~ TSite,
  random   = ~ corgh(TSite):Variety + at(Site):Rep,
  residual = ~ ar1(Row):ar1(Column),
  data     = dat1,
  maxit    = 30L
)
model1 <- update(model1)
vc1 <- summary(model1)$varcomp
vc1[grepl("TSite", rownames(vc1)), 1:2]
                                                  component    std.error
TSite:Variety!TSite!T1-Env1:!TSite!T0-Env1.cor 8.266140e-01 2.075354e-01
TSite:Variety!TSite!T2-Env1:!TSite!T0-Env1.cor 6.284402e-01 3.756896e-01
TSite:Variety!TSite!T2-Env1:!TSite!T1-Env1.cor 6.492141e-01 3.901779e-01
TSite:Variety!TSite_T0-Env1                    5.714666e+04 2.127251e+04
TSite:Variety!TSite_T1-Env1                    4.931515e+04 1.969887e+04
TSite:Variety!TSite_T2-Env1                    1.651471e+04 1.323835e+04

The corgh varcomp rows give the genetic variance for each TSite level (diagonal of the G-matrix) and the estimated genetic correlation between each pair. With true correlations in the range 0.55–0.70 and 50 varieties across 3 replicates, the estimates should be well away from the boundary (|r| \ll 1), ensuring the reconstructed G-matrix is positive definite and all conditional variances are positive.

Running randomRegress() — partial conditioning

With a single site, partial conditioning is the natural choice: each treatment is conditioned on all the others simultaneously, so the three responsiveness BLUPs capture the genetic signal that is unique to each treatment and unshared with the others.

res1 <- randomRegress(
  model1,
  term = "corgh(TSite):Variety",
  levs = levs1,
  type = "partial",
  sep  = "-"
)

With a single site, beta has one row and sigmat has one row — the regression coefficients and conditional genetic variance are scalars:

# Site-specific regression coefficients (one site -> one row each)
res1$beta
$T0
            T1        T2
Env1 0.7789471 0.2951477

$T1
            T0        T2
Env1 0.6427115 0.3705243

$T2
            T0        T1
Env1 0.1558038 0.2370539
# Conditional genetic variances under partial conditioning
res1$sigmat
           T0       T1         T2
Env1 0.123181 0.101637 0.06502531

Each sigmat entry \sigma^2_{j \mid A_j} is the genetic variance in treatment j that is orthogonal to all other treatments. A small value relative to G_{jj} (the diagonal of Gmat) indicates that most of the genetic variation in that treatment is shared with the others; a value close to G_{jj} indicates a large treatment-specific genetic component.

# Compare conditional variances to marginal variances
data.frame(
  treatment  = levs1,
  marginal   = round(diag(res1$Gmat), 4),
  conditional = round(res1$sigmat[1L, ], 4)
)
        treatment marginal conditional
T0-Env1        T0   0.4077      0.1232
T1-Env1        T1   0.3518      0.1016
T2-Env1        T2   0.1178      0.0650

Regression plots — added variable plots

Under partial conditioning every treatment has |A_j| = 2, so the regression of \hat{u}_j on A_j is inherently three-dimensional and cannot be shown in a single 2-D scatter. Both regression plots below are therefore added variable plots: for each panel, both the x-axis and the y-axis show partial residuals after projecting out the remaining conditioning treatment using the G-matrix, so that the annotated slope \hat{\beta} aligns correctly with the scatter.

Formally, for panel j with A_j = \{k, r\} and cond_x selecting k:

x_v = \hat{u}_{k,v} - \tfrac{G_{rk}}{G_{rr}}\,\hat{u}_{r,v}, \qquad y_v = \hat{u}_{j,v} - \tfrac{G_{rj}}{G_{rr}}\,\hat{u}_{r,v}.

The two plots show different 2-D slices of the same 3-D regression — cond_x = 1L projects onto the first conditioning treatment (after removing the second), and cond_x = 2L projects onto the second (after removing the first). Each strip label shows the full conditioning set, e.g. T1 | T0, T2. A per-panel integer vector, e.g. cond_x = c(2L, 1L, 2L), allows a different slice in each panel.

# Slice 1: first conditioning treatment on x (T1 for T0; T0 for T1 and T2)
p_reg1 <- plot_randomRegress(res1, type = "regress")
print(p_reg1)

# Slice 2: second conditioning treatment on x (T2 for T0 and T1; T1 for T2)
p_reg1_cx <- plot_randomRegress(res1, type = "regress", cond_x = 2L)
print(p_reg1_cx)

Comparing the slopes across the two slices reveals the relative contribution of each conditioning treatment to explaining the conditioned treatment’s BLUPs. A steeper slope in one slice than the other indicates that dimension of A_j carries more of the shared genetic signal.

Quadrant plot with default highlights

The quadrant plot places the T0 BLUPs on the x-axis and responsiveness on the y-axis. Under partial conditioning, every treatment has a responsiveness axis, so there are three quadrant panels:

p_quad1 <- plot_randomRegress(res1, type = "quadrant", highlight = "default")
print(p_quad1)

The default highlight algorithm (highlight = "default") selects up to six varieties to annotate across all panels — up to three from the top-right quadrant (high efficiency + high responsiveness, shown in orange) and up to three from the bottom-left (low efficiency + low responsiveness, shown in blue). Within each quadrant the candidates are restricted to varieties whose distance from the origin exceeds the within-quadrant median, and the final selection is simply the most extreme of those candidates, ordered by decreasing distance from the origin. The same varieties are labelled in every site and treatment-pair panel, making it easy to trace how a variety’s relative position shifts across panels.

Varieties that appear in the top-right of all panels respond positively to every treatment; those that shift between quadrants across panels show treatment-specific responses. To highlight specific varieties instead, pass a character vector of variety names, e.g. highlight = c("Var01", "Var15", "Var22"); to suppress highlighting entirely, use highlight = NULL.


Example 2 — Multi-site, factor analytic model

Simulated data

We now scale to a multi-environment setting: 40 varieties, 4 sites, and the same three nitrogen treatments. The FA(2) model is the standard choice for MET analyses — it captures the dominant axes of genotype × environment interaction parsimoniously.

out2 <- simTrialData(
  nvar       = 40L,
  nsite      = 4L,
  treatments = c("T0", "T1", "T2"),
  nrep       = 3L,
  seed       = 42L,
  verbose    = FALSE
)
dat2 <- out2$data

The "blup" plot of plot_simTrialData() visualises the true genetic values across all 12 treatment × site groups, revealing the GEI structure baked into the simulation:

plot_simTrialData(out2, type = "blup", sort = TRUE)

Varieties cluster into those with broadly positive responses across all treatment × site groups (top rows) and those with more variable or treatment-specific patterns — exactly the structure that randomRegress() is designed to unpack.

Forming TSite and fitting the FA(2) model

dat2$TSite  <- interaction(dat2$Treatment, dat2$Site, sep = "-")
dat2$Row    <- factor(dat2$Row)
dat2$Column <- factor(dat2$Column)
levs2       <- c("T0", "T1", "T2")

A factor analytic model with 2 factors provides a parsimonious description of the 12 \times 12 G-matrix across 4 sites and 3 treatments. The two factors capture the dominant axes of genetic co-variation — typically a general adaptation factor and a GEI factor:

model2 <- asreml(
  yield    ~ TSite,
  random   = ~ fa(TSite, 2):Variety + at(Site):Rep,
  residual = ~ dsum(~ ar1(Row):ar1(Column) | Site),
  data     = dat2,
  maxit    = 30L
)
model2 <- update(model2)
vc2 <- summary(model2)$varcomp
vc2[grepl("TSite", rownames(vc2)), ]
                                   component   std.error    z.ratio bound %ch
fa(TSite, 2):Variety!T0-Env1!var     0.00000          NA         NA     F  NA
fa(TSite, 2):Variety!T1-Env1!var 31170.65528 18120.99293  1.7201406     P 0.0
fa(TSite, 2):Variety!T2-Env1!var     0.00000          NA         NA     F  NA
fa(TSite, 2):Variety!T0-Env2!var 54919.72761 24527.38851  2.2391184     P 0.0
fa(TSite, 2):Variety!T1-Env2!var 22880.46106 17110.94599  1.3371827     P 0.1
fa(TSite, 2):Variety!T2-Env2!var 16079.46438 15472.45593  1.0392316     P 0.1
fa(TSite, 2):Variety!T0-Env3!var  3029.38081 15818.20881  0.1915123     P 1.2
fa(TSite, 2):Variety!T1-Env3!var     0.00000          NA         NA     F  NA
fa(TSite, 2):Variety!T2-Env3!var 13990.36450 15186.29669  0.9212493     P 0.2
fa(TSite, 2):Variety!T0-Env4!var 15399.67049 15740.09710  0.9783720     P 0.1
fa(TSite, 2):Variety!T1-Env4!var 52735.62150 24333.00831  2.1672463     P 0.0
fa(TSite, 2):Variety!T2-Env4!var 14054.12323 16686.09239  0.8422657     P 0.4
fa(TSite, 2):Variety!T0-Env1!fa1   296.57418    48.51737  6.1127422     P 0.0
fa(TSite, 2):Variety!T1-Env1!fa1   157.92909    51.57597  3.0620673     P 0.1
fa(TSite, 2):Variety!T2-Env1!fa1   130.69065    54.14897  2.4135388     P 0.0
fa(TSite, 2):Variety!T0-Env2!fa1   230.81038    62.90194  3.6693680     P 0.0
fa(TSite, 2):Variety!T1-Env2!fa1   219.42927    50.74392  4.3242475     P 0.0
fa(TSite, 2):Variety!T2-Env2!fa1   205.61597    48.34129  4.2534235     P 0.0
fa(TSite, 2):Variety!T0-Env3!fa1   275.90911    48.09771  5.7364288     P 0.0
fa(TSite, 2):Variety!T1-Env3!fa1   116.76063    60.85115  1.9187907     P 0.1
fa(TSite, 2):Variety!T2-Env3!fa1   257.16889    49.02995  5.2451391     P 0.0
fa(TSite, 2):Variety!T0-Env4!fa1   143.87189    49.51114  2.9058488     P 0.0
fa(TSite, 2):Variety!T1-Env4!fa1   206.09465    61.50535  3.3508409     P 0.0
fa(TSite, 2):Variety!T2-Env4!fa1   119.41365    54.91899  2.1743599     P 0.1
fa(TSite, 2):Variety!T0-Env1!fa2     0.00000          NA         NA     F  NA
fa(TSite, 2):Variety!T1-Env1!fa2   -59.74533    57.44779 -1.0399935     P 0.3
fa(TSite, 2):Variety!T2-Env1!fa2  -190.85185    49.57640 -3.8496516     P 0.1
fa(TSite, 2):Variety!T0-Env2!fa2  -121.05435    65.76636 -1.8406728     P 0.3
fa(TSite, 2):Variety!T1-Env2!fa2   -53.32607    55.72052 -0.9570274     P 0.4
fa(TSite, 2):Variety!T2-Env2!fa2   -57.10362    53.42620 -1.0688317     P 0.2
fa(TSite, 2):Variety!T0-Env3!fa2    48.72724    54.13545  0.9000987     P 0.3
fa(TSite, 2):Variety!T1-Env3!fa2  -262.49742    49.07711 -5.3486735     P 0.0
fa(TSite, 2):Variety!T2-Env3!fa2   -33.78441    56.15143 -0.6016661     P 0.1
fa(TSite, 2):Variety!T0-Env4!fa2  -101.02471    50.52365 -1.9995529     P 0.2
fa(TSite, 2):Variety!T1-Env4!fa2  -114.49195    65.28623 -1.7536921     P 0.0
fa(TSite, 2):Variety!T2-Env4!fa2  -173.67649    53.08688 -3.2715521     P 0.2

The varcomp rows show the factor loadings (!fa1, !fa2) and specific variances (!var) for each TSite level. The G-matrix reconstructed from these is \hat{\mathbf{G}} = \hat{\boldsymbol{\Lambda}}\hat{\boldsymbol{\Lambda}}^\top + \hat{\boldsymbol{\Psi}}.

Running randomRegress() — baseline conditioning

For multi-site data with an FA model, baseline conditioning is the most widely used scheme: T0 is the efficiency (control) treatment, and T1 and T2 are conditioned on T0 to give treatment-specific responsiveness BLUPs.

res2 <- randomRegress(
  model2,
  term = "fa(TSite, 2):Variety",
  levs = levs2,
  type = "baseline",
  sep  = "-"
)

With 4 sites, beta has 4 rows (one per site) and sigmat has 4 rows. The site-specific regression slopes in beta capture how the treatment response relationship changes across environments:

# Site-specific regression coefficients for T1 conditioned on T0
round(res2$beta$T1, 3)
        T0
Env1 0.533
Env2 0.465
Env3 0.238
Env4 0.890

Regression plot

p_reg2 <- plot_randomRegress(res2, type = "regress")
print(p_reg2)

Each panel corresponds to one site × treatment pair. The dotted regression line through the origin carries the site-specific \hat{\beta} slope. Panels where \hat{\beta} differs substantially across sites indicate heterogeneous treatment responses — the G-matrix captures this as off-diagonal structure between treatment × site combinations.

Quadrant plot — default highlights

p_quad2 <- plot_randomRegress(res2, type = "quadrant", highlight = "default")
print(p_quad2)

The automatic highlight algorithm identifies the six most informative archetypes by their position in the efficiency–responsiveness space, averaged across all sites. Orange points are top-right archetypes (broadly adapted and responsive); blue points are bottom-left archetypes (consistently poor performers). The same six varieties are labelled in every panel.

Filtering to a single treatment pair

For multi-site multi-treatment results, treatments restricts which panels are shown. This is useful when a particular treatment comparison is of primary interest:

p_t1 <- plot_randomRegress(res2, type = "quadrant",
                            treatments = "T1", highlight = "default")
print(p_t1)

G-matrix heatmap

The 12 \times 12 G-matrix correlation heatmap reveals the full structure of genetic co-variation across all treatment × site combinations:

p_gmat2 <- plot_randomRegress(res2, type = "gmat")
print(p_gmat2)

Within-treatment correlations (e.g. T0-Env1 with T0-Env2) are typically high, reflecting consistent genetic ranking for that treatment across sites. Correlations across treatments (e.g. T0-Env1 with T2-Env3) reflect the combined effect of genotype × treatment and genotype × environment interaction.

Bespoke visualisation with return_data = TRUE

All three plot types support return_data = TRUE, which returns the tidy data frame used to build the plot. This enables custom ggplot2 visualisations beyond the built-in types:

df_t1 <- plot_randomRegress(res2, type = "quadrant",
                             treatments  = "T1",
                             return_data = TRUE)

ggplot(df_t1, aes(x = x, y = y, colour = Site)) +
  geom_hline(yintercept = 0, linetype = "dotted", colour = "grey40") +
  geom_vline(xintercept = 0, linetype = "dotted", colour = "grey40") +
  geom_point(size = 1.8, alpha = 0.8) +
  facet_wrap(~ Site, nrow = 2L) +
  labs(x = "Efficiency (T0 BLUP)",
       y = "Responsiveness (T1 | T0)",
       title = "T1 responsiveness by site") +
  theme_bw() +
  theme(legend.position = "none")


Summary

randomRegress()

Task Code
Baseline conditioning type = "baseline" (default)
Fully orthogonal (Gram-Schmidt) type = "sequential"
Partial genetic variances type = "partial"
Bespoke conditioning type = "custom", cond = list(...)
Single site, corgh term term = "corgh(TSite):Variety"
Multi-site, FA term term = "fa(TSite, 2):Variety"
Genomic relationship matrix term = "us(TSite):vm(Variety, giv1)"

plot_randomRegress()

Task Code
Regression scatter plot plot_randomRegress(res, type = "regress")
Efficiency–responsiveness plot plot_randomRegress(res, type = "quadrant")
G-matrix heatmap plot_randomRegress(res, type = "gmat")
Default highlights highlight = "default"
Named variety highlights highlight = c("Var01", "Var15")
Suppress highlights highlight = NULL
Restrict treatment panels treatments = "T1"
Select x-axis conditioning treatment cond_x = 2L
Export plot data return_data = TRUE
Absolute yield scale centre = TRUE

References

Lemerle, D., Smith, A., Verbeek, B., Koetz, E., Lockley, P. & Martin, P. (2006). Incremental crop tolerance to weeds: A measure for selecting competitive ability in Australian wheats. Euphytica, 149, 85–95. https://doi.org/10.1007/s10681-005-9056-5

McDonald G, Bovill W, Taylor J, Wheeler R. (2015) Responses to phosphorus among wheat genotypes. Crop and Pasture Science, 66(5), 430–444. https://doi.org/10.1071/CP14191