The basic container object in Makie is Figure
, a canvas where we can add objects like Axis
, Colorbar
, Legend
, etc.
For Figure
, we have have attributes like backgroundcolor
, size
, font
and fontsize
as well as the figure_padding
which changes the amount of space around the figure content, see the colored area in Figure 6. It can take one number for all sides, or a tuple of four numbers for left, right, bottom and top. Let’s dive into these components.
function figure_canvas()
fig = Figure(;
figure_padding=(5,5,10,10),
backgroundcolor=:snow2,
size=(600,400),
)
end
JDS.figure_canvas()
Axis
has a lot more, some of them are backgroundcolor
, xgridcolor
and title
. For a full list just type help(Axis)
.
function figure_axis()
fig = Figure(;
figure_padding=(5,5,10,10),
backgroundcolor=:snow2,
size=(600,400),
)
ax = Axis(fig[1,1];
xlabel="x",
ylabel="y",
title="Title",
)
fig
end
JDS.figure_axis()
You can hide decorations and axis’ spines with:
hidedecorations!(ax; kwargs...)
hidexdecorations!(ax; kwargs...)
hideydecorations!(ax; kwargs...)
hidespines!(ax; kwargs...)
Remember, we can always ask for help to see what kind of arguments we can use, e.g.,
help(hidespines!)
hidespines!(la::Axis, spines::Symbol... = (:l, :r, :b, :t)...)
Hide all specified axis spines. Hides all spines by default, otherwise
choose which sides to hide with the symbols :l (left), :r (right), :b
(bottom) and :t (top).
hidespines! has the following function signatures:
(Vector, Vector)
(Vector, Vector, Vector)
(Matrix)
Available attributes for Plot{Makie.hidespines!} are:
Alternatively, for decorations
help(hidedecorations!)
hidedecorations!(la::Axis; label = true, ticklabels = true, ticks = true,
grid = true, minorgrid = true, minorticks = true)
Hide decorations of both x and y-axis: label, ticklabels, ticks and grid.
Keyword arguments can be used to disable hiding of certain types of
decorations.
See also [hidexdecorations!], [hideydecorations!], [hidezdecorations!]
hidedecorations!(ax::PolarAxis; ticklabels = true, grid = true, minorgrid = true)
Hide decorations of both r and theta-axis: label, ticklabels, ticks and
grid. Keyword arguments can be used to disable hiding of certain types of
decorations.
See also [hiderdecorations!], [hidethetadecorations!], [hidezdecorations!]
hidedecorations! has the following function signatures:
(Vector, Vector)
(Vector, Vector, Vector)
(Matrix)
Available attributes for Plot{Makie.hidedecorations!} are:
For elements that you don’t want to hide, pass false
, e.g., hideydecorations!(ax; ticks=false, grid=false)
.
Setting limits
at once or independently for each axis is done by calling
limits!(ax; l, r, b, t)
, wherel
is left,r
right,b
bottom, andt
top.You can also do
ylims!(low, high)
orxlims!(low, high)
, and even open ones by doingylims!(low=0)
orxlims!(high=1)
.
Now, we add a plotting function into our new Axis:
function figure_axis_plot()
fig = Figure(;
figure_padding=(5,5,10,10),
backgroundcolor=:snow2,
size=(600,400),
)
ax = Axis(fig[1,1];
xlabel="x",
ylabel="y",
title="Title",
)
lines!(ax, 0.5:0.2:3pi, x -> cos(x)/x;
color=:black,
linewidth=2,
linestyle=:dash,
)
fig
end
JDS.figure_axis_plot()
This example already includes many of the attributes that are typically used. Additionally, it would be beneficial to include a “legend” for reference, especially if the example has more than one function. This will make it easier to understand.
So, let’s append
another mutation plot
object and add the corresponding legends by calling axislegend
. This will collect all the labels
you might have passed to your plotting functions and by default will be located in the right top position. For a different one, the position=:ct
argument is called, where :ct
means let’s put our label in the center
and at the top
, see Figure Figure 8:
function figure_axis_plot_leg()
fig = Figure(;
figure_padding=(5,5,10,10),
backgroundcolor=:snow2,
size=(600,400),
)
ax = Axis(fig[1,1];
xlabel="x",
ylabel="y",
title="Title",
xgridstyle=:dash,
ygridstyle=:dash,
)
lines!(ax, 0.5:0.2:3pi, x -> cos(x)/x;
linewidth=2,
linestyle=:solid,
label = "cos(x)/x",
)
scatterlines!(ax, 0.5:0.2:3pi, x -> -cos(x)/x;
color=:black,
linewidth=2,
linestyle=:dash,
label = "-cos(x)/x",
)
axislegend("legend"; position=:rt)
fig
end
JDS.figure_axis_plot_leg()
Other positions are also available by combining left(l), center(c), right(r) and bottom(b), center(c), top(t). For instance, for left top, use :lt
.
However, having to write this much code just for two lines is cumbersome. So, if you plan on doing a lot of plots with the same general aesthetics, then setting a theme will be better. We can do this with set_theme!()
as follows:
set_theme!(;
size=(600,400),
backgroundcolor=(:mistyrose, 0.1),
fontsize=16,
Axis=(;
xlabel="x",
ylabel="y",
title="Title",
xgridstyle=:dash,
ygridstyle=:dash,
),
Legend=(;
backgroundcolor=(:grey, 0.1),
framecolor=:orangered,
),
)
nothing
Plotting the previous figure should take the new default settings defined by set_theme!(kwargs)
:
function fig_theme()
fig = Figure()
ax = Axis(fig[1,1])
lines!(ax, 0.5:0.2:3pi, x -> cos(x)/x;
linewidth=2,
linestyle=:dash,
label = "cos(x)/x",
)
scatterlines!(ax, 0.5:0.2:3pi, x -> -cos(x)/x;
color=:black,
linewidth=2,
linestyle=:dash,
label = "-cos(x)/x",
)
axislegend("legend"; position=:rt)
fig
set_theme!()
end
JDS.fig_theme()
Note that the last line is set_theme!()
, will reset the default’s settings of Makie. For more on themes
please go to Section 6.5.
Before moving on into the next section, it’s worthwhile to see an example where an array
of attributes is passed at once to a plotting function. For this example, we will use the scatter
plotting function to do a bubble plot.
The data for this could be an array
with 100 rows and 3 columns, which we generated at random from a normal distribution. Here, the first column could be the positions in the x
axis, the second one the positions in y
and the third one an intrinsic associated value for each point. The latter could be represented in a plot by a different color
or with a different marker size. In a bubble plot we can do both.
using Random: seed!
seed!(28)
xyz = randn(100, 3)
xyz[1:4, :]
4×3 Matrix{Float64}:
0.550992 1.27614 -0.659886
-1.06587 -0.0287242 0.175126
-0.721591 -1.84423 0.121052
0.801169 0.862781 -0.221599
Next, the corresponding plot can be seen in Figure 10:
function fig_bubbles(xyz)
fig = Figure(size=(600,400))
ax = Axis(fig[1,1]; aspect = DataAspect())
pltobj = scatter!(xyz[:, 1], xyz[:, 2];
color=xyz[:, 3],
label="Bubbles",
colormap=:plasma,
markersize=15 * abs.(xyz[:, 3]),
)
limits!(-3, 3, -3, 3)
Legend(fig[1, 2], ax, valign=:top)
Colorbar(fig[1, 2], pltobj, height=Relative(3/4))
fig
end
JDS.fig_bubbles(xyz)
where we have decomposed the tuple FigureAxisPlot
into fig, ax, pltobj
, in order to be able to add a Legend
and Colorbar
outside of the plotted object. We will discuss layout options in more detail in Section 6.8.
We have done some basic but still interesting examples to show how to use Makie.jl
and by now you might be wondering: what else can we do?