Skip to content

Scenes

What is a Scene?

Scenes are fundamental building blocks of Makie figures. A Scene is like a container for Plots and other Scenes. Scenes have Plots and Subscenes associated with them. Every Scene also has a transformation, made up of scale, translation, and rotation.

Note

Before the introduction of the Figure workflow, Scenes used to be the main container object which was returned from all plotting functions. Now, scenes are mostly an implementation detail for many users, unless they want to build custom solutions that go beyond what the default system offers.

A Scene's plots can be accessed via scene.plots.

A Scene's subscenes (also called children) can be accessed through scene.children. This will return an Array of the Scene's child scenes. A child scene can be created by childscene = Scene(parentscene).

Any Scene with an axis also has a camera associated with it; this can be accessed through camera(scene), and its controls through cameracontrols(scene). More documentation about these is in the Cameras section.

Scenes have a configurable size. You can set the size in device-independent pixels by doing Scene(size = (500, 500)). (More about sizes, resolutions and units in Figure size and resolution or How to match figure size, font sizes and dpi)

Any keyword argument given to the Scene will be propagated to its plots; therefore, you can set the palette or the colormap in the Scene itself.

Subscenes

A subscene is no different than a normal Scene, except that it is linked to a "parent" Scene. It inherits the transformations of the parent Scene, but can then be transformed independently of it.

Scene Attributes

  • scene.clear = true: Scenes are drawn parent first onto the same image. If clear = true for a (sub)scene it will clear the previously drawn things in its region to its backgroundcolor. Otherwise the plots in scene will be drawn on top and the backgroundcolor will be ignored. Note that this is not technically an attribute but just a field of Scene.

  • ssao = SSAO(bias = 0.025, blur=2, radius=0.5): Controls SSAO settings, see lighting documentation.

  • size = (800, 600): Sets the size of the created window if the scene is the root scene.

Modifying A Scene

Makie offers mutation functions to scale, translate and rotate your Scenes on the fly.

Makie.translate! Function
julia
translate!(t::Transformable, xyz::VecTypes)
translate!(t::Transformable, xyz...)

Apply an absolute translation to the given Transformable (a Scene or Plot), translating it to x, y, z.

source

julia
translate!(Accum, t::Transformable, xyz...)

Translate the given Transformable (a Scene or Plot), relative to its current position.

source

Makie.rotate! Function
julia
rotate!(Accum, t::Transformable, axis_rot...)

Apply a relative rotation to the transformable, by multiplying by the current rotation.

source

julia
rotate!(t::Transformable, axis_rot::Quaternion)
rotate!(t::Transformable, axis_rot::Real)
rotate!(t::Transformable, axis_rot...)

Apply an absolute rotation to the transformable. Rotations are all internally converted to Quaternions.

source

Makie.scale! Function
julia
scale!([mode = Absolute], t::Transformable, xyz...)
scale!([mode = Absolute], t::Transformable, xyz::VecTypes)

Scale the given t::Transformable (a Scene or Plot) to the given arguments xyz. Any missing dimension will be scaled by 1. If mode == Accum the given scaling will be multiplied with the previous one.

source

Updating the Scene

When the Scene is changed, you may need to update several aspects of it. Makie provides three main updating functions:

Makie.update_cam! Function
julia
update_cam!(scene::SceneLike, area)

Updates the camera for the given scene to cover the given area in 2d.

source

julia
update_cam!(scene::SceneLike)

Updates the camera for the given scene to cover the limits of the Scene. Useful when using the Observable pipeline.

source

julia
update_cam!(scene, cam::Camera3D, ϕ, θ[, radius])

Set the camera position based on two angles 0 ≤ ϕ ≤ 2π and -pi/2 ≤ θ ≤ pi/2 and an optional radius around the current cam.lookat[].

source

julia
update_cam!(scene::Scene, eyeposition, lookat, up = Vec3d(0, 0, 1))

Updates the camera's controls to point to the specified location.

source

Events

Scenes have several pre-created event "hooks" (through Observables) that you can handle. These can be accessed through scene.events, which returns an Events struct.