Setting options for a Layout of DynamicMaps

Case

I have 2 Quadmesh objects to be datashaded, and I would like to view them side by side so I put them inside a Layout. How can I set the options for all the final plots using the Layout interface?

Explanation with code

qm1 = hv.Quadmesh(...)
qm2 = hv.Quadmesh(...)

I tried the following two ways

layout_then_shade = datashade(qm1 + qm2)
shade_then_layout = datashade(qm1) + datashade(qm2)

Neither of the above could give the following:

layout_then_shade.opts(aspect="equal") # doesn't work
shade_then_layout.opts(aspect="equal") # doesn't work

But setting aspect, among other plotting related parameters, works for individual ones, i.e.

datashade(qm1).opts(aspect="equal")  # works

So my question is if there is a way to set it as a Layout-level option? In reality, I have more than 9 such quadmeshes to be treated this way, so that would be great time saving.

Places I have looked at

I have read the online documentations several times, in particular, Applying Customization, Customizing Plots, Working with Lage Dataset, only to find examples with Layout of e.g. Curves, in which case one can do Layout.opts(opts.Curve(…)). But there is no such equivalent for DynamicMap. However, I did find mentions of options for dynamic map in here. I didn’t read the code though. I’d appreciate any help on this!

You need to target the actual element(s) you are trying to apply the option to. This is what the hv.opts helper is for, in the case of datashade operation you will want to target the RGB element type (since that’s what datashade returns).

from holoviews import opts

shade_then_layout.opts(
    opts.RGB(aspect='equal')
)

Another alternative is to use the .apply accessor which applies an operation to any Viewable elements, e.g.:

shade_then_layout.apply.opts(aspect='equal')