This vignette covers the advanced features of marimekko
beyond the basics shown in vignette("getting-started").
Pearson residuals measure how much each cell deviates from the independence assumption. Positive residuals indicate more observations than expected; negative residuals indicate fewer.
Residuals are automatically computed and exposed as the
.residuals computed variable, which you can map to an
aesthetic via after_stat():
ggplot(titanic) +
geom_marimekko(
aes(
fill = Survived, weight = Freq,
alpha = after_stat(abs(.residuals))
),
formula = ~ Class | Survived
) +
scale_alpha_continuous(range = c(0.3, 1), guide = "none") +
labs(title = "Residual shading: stronger opacity = larger deviation")You can also map residuals to colour instead of relying on fill:
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
geom_marimekko_text(aes(
label = after_stat(round(.residuals, 1))
), colour = "white", size = 3) +
labs(title = "Pearson residuals as labels")geom_marimekko() supports multi-variable formulas. A
three-variable formula (~ X | Y | Z) partitions the plot in
alternating directions (horizontal, vertical, horizontal):
X (column widths
proportional to X)Y within each columnZ within each cellggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived | Sex
) +
labs(title = "Nested mosaic: Class > Sex > Survived")This produces a richer view than faceting because all three variables share a single coordinate space, making relative proportions directly comparable.
By default geom_marimekko() automatically labels both
axes with category names. The y-axis shows proportions from 0 to 1,
while the x-axis displays category labels at each column’s midpoint.
fortify_marimekko() returns computed tile positions as a
plain data frame without creating a plot. It accepts the same formula
syntax as geom_marimekko():
tiles <- fortify_marimekko(titanic,
formula = ~ Class | Survived, weight = Freq
)
head(tiles)
#> xmin xmax ymin ymax weight fill colour .proportion
#> 1st.No 0.0000000 0.1432303 0.0000000 0.3716308 122 No No 0.3753846
#> 1st.Yes 0.0000000 0.1432303 0.3816308 1.0000000 203 Yes Yes 0.6246154
#> 2nd.No 0.1532303 0.2788323 0.0000000 0.5801053 167 No No 0.5859649
#> 2nd.Yes 0.1532303 0.2788323 0.5901053 1.0000000 118 Yes Yes 0.4140351
#> 3rd.No 0.2888323 0.5999727 0.0000000 0.7403966 528 No No 0.7478754
#> 3rd.Yes 0.2888323 0.5999727 0.7503966 1.0000000 178 Yes Yes 0.2521246
#> .marginal Class Survived x y .residuals
#> 1st.No 0.05542935 1st No 0.07161517 0.1858154 -6.607873
#> 1st.Yes 0.09223080 1st Yes 0.07161517 0.6908154 9.565772
#> 2nd.No 0.07587460 2nd No 0.21603135 0.2900526 -1.867159
#> 2nd.Yes 0.05361199 2nd Yes 0.21603135 0.7950526 2.702959
#> 3rd.No 0.23989096 3rd No 0.44440254 0.3701983 2.289965
#> 3rd.Yes 0.08087233 3rd Yes 0.44440254 0.8751983 -3.315027Multi-variable formulas work too:
tiles_3 <- fortify_marimekko(titanic,
formula = ~ Class | Survived | Sex, weight = Freq
)
head(tiles_3)
#> xmin xmax ymin ymax weight fill colour
#> 1st.No.Male 0.00000000 0.12886214 0.0000000 0.3716308 118 Male Male
#> 1st.No.Female 0.13886214 0.14323035 0.0000000 0.3716308 4 Female Female
#> 1st.Yes.Male 0.00000000 0.04069104 0.3816308 1.0000000 62 Male Male
#> 1st.Yes.Female 0.05069104 0.14323035 0.3816308 1.0000000 141 Female Female
#> 2nd.No.Male 0.15323035 0.25983339 0.0000000 0.5801053 154 Male Male
#> 2nd.No.Female 0.26983339 0.27883235 0.0000000 0.5801053 13 Female Female
#> .proportion .marginal Class Survived Sex x
#> 1st.No.Male 0.96721311 0.053611995 1st No Male 0.06443107
#> 1st.No.Female 0.03278689 0.001817356 1st No Female 0.14104625
#> 1st.Yes.Male 0.30541872 0.028169014 1st Yes Male 0.02034552
#> 1st.Yes.Female 0.69458128 0.064061790 1st Yes Female 0.09696070
#> 2nd.No.Male 0.92215569 0.069968196 2nd No Male 0.20653187
#> 2nd.No.Female 0.07784431 0.005906406 2nd No Female 0.27433287
#> y .residuals
#> 1st.No.Male 0.1858154 -0.3491072
#> 1st.No.Female 0.1858154 -9.5038375
#> 1st.Yes.Male 0.6908154 0.5053790
#> 1st.Yes.Female 0.6908154 13.7580643
#> 2nd.No.Male 0.2900526 2.9817561
#> 2nd.No.Female 0.2900526 -6.9363838The returned columns are:
| Column | Description |
|---|---|
| Formula variables | One column per formula variable (e.g. Class,
Survived) |
fill |
The fill variable value |
xmin, xmax |
Horizontal extent of the tile |
ymin, ymax |
Vertical extent of the tile |
x, y |
Tile center coordinates |
weight |
Aggregated count |
.proportion |
Conditional proportion within the parent tile |
.marginal |
Proportion of the grand total |
.residuals |
Pearson residual |
The companion layers geom_marimekko_text(),
geom_marimekko_label() automatically read tile positions
from a preceding geom_marimekko() layer. You only need to
specify the label aesthetic:
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
geom_marimekko_text(aes(
label = after_stat(paste(Class, Survived, weight, sep = "\n"))
), colour = "white", size = 2.5)For more control, use fortify_marimekko() to pre-compute
tiles and pass them as data to any standard ggplot2 geom.
This lets you summarize, filter, or transform the tile data before
plotting:
tiles <- fortify_marimekko(titanic,
formula = ~ Class | Survived, weight = Freq
)
# Highlight cells with significant residuals
tiles$significant <- abs(tiles$.residuals) > 2
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
geom_label(
data = tiles[tiles$significant, ],
aes(x = x, y = y, label = paste0("r=", round(.residuals, 1))),
fill = "yellow", size = 3, fontface = "bold"
) +
labs(title = "Significant deviations from independence (|r| > 2)")Because fortify_marimekko() returns a plain data frame,
you can use any ggplot2 geom – geom_segment(),
geom_curve(), geom_tile(),
ggrepel::geom_label_repel(), etc.
StatMarimekkoTilesThe exported StatMarimekkoTiles ggproto object lets you
pair marimekko tile positions with any geom. While the
convenience wrappers geom_marimekko_text() and
geom_marimekko_label() cover the most common case (text
overlays), StatMarimekkoTiles gives you full control by
plugging directly into ggplot2::layer().
StatMarimekkoTiles does not compute tile positions
itself — it reads them from a preceding geom_marimekko()
layer via an internal shared environment. This means:
geom_marimekko() layer must appear
before any layer that uses StatMarimekkoTiles.xmin,
xmax, ymin, ymax, x,
y (centre), weight, fill,
.proportion, .residuals, and
.tooltip.aes() via
after_stat().Map point size to weight to show tile counts as
bubbles:
ggplot(titanic) +
geom_marimekko(
aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived, alpha = 0.4
) +
layer(
stat = StatMarimekkoTiles,
geom = GeomPoint,
mapping = aes(size = after_stat(weight)),
data = titanic,
position = "identity",
show.legend = FALSE,
inherit.aes = FALSE,
params = list(colour = "white", alpha = 0.7)
) +
scale_size_area(max_size = 12) +
labs(title = "Bubble overlay via StatMarimekkoTiles")Colour and size encode deviation from independence:
ggplot(titanic) +
geom_marimekko(
aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
layer(
stat = StatMarimekkoTiles,
geom = GeomPoint,
mapping = aes(
size = after_stat(abs(.residuals)),
colour = after_stat(ifelse(.residuals > 0, "over", "under"))
),
data = titanic,
position = "identity",
show.legend = TRUE,
inherit.aes = FALSE,
params = list(alpha = 0.8)
) +
scale_colour_manual(
values = c(over = "tomato", under = "steelblue"),
name = "Deviation"
) +
scale_size_continuous(range = c(1, 8), name = "|Residual|") +
labs(title = "Residual markers via StatMarimekkoTiles")Use GeomRect to draw highlighted borders around specific
tiles (e.g. tiles with large residuals):
ggplot(titanic) +
geom_marimekko(
aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
layer(
stat = StatMarimekkoTiles,
geom = GeomRect,
mapping = aes(
linewidth = after_stat(ifelse(abs(.residuals) > 2, 1.5, 0))
),
data = titanic,
position = "identity",
show.legend = FALSE,
inherit.aes = FALSE,
params = list(colour = "red", fill = NA)
) +
labs(title = "Highlight tiles with |residual| > 2")StatMarimekkoTiles vs
fortify_marimekko()Both give access to the same computed tile data, but they serve different purposes:
StatMarimekkoTiles |
fortify_marimekko() |
|
|---|---|---|
| When | At render time (reactive) | Before plotting (static) |
| Input | Reads from a geom_marimekko() layer |
Standalone function call |
| Use case | Adding companion layers on the same plot | Pre-processing, filtering, or using tile data outside ggplot2 |
| Faceting | Automatically panel-aware | Manual panel handling |
Use StatMarimekkoTiles when you want to add layers that
stay in sync with geom_marimekko() parameters. Use
fortify_marimekko() when you need to transform or subset
the tile data before passing it to a geom.
Because marimekko produces standard ggplot2 layers, you
can freely combine multiple features:
ggplot(titanic) +
geom_marimekko(
aes(
fill = Survived, weight = Freq,
alpha = after_stat(abs(.residuals))
),
formula = ~ Class | Survived,
show_percentages = TRUE
) +
geom_marimekko_text(aes(label = after_stat(weight)),
colour = "white", size = 3.5
) +
scale_alpha_continuous(range = c(0.4, 1), guide = "none") +
theme_marimekko() +
labs(
title = "Full-featured mosaic plot",
subtitle = "Residual shading + counts + marginal %"
)By default, gap controls both horizontal (between
columns) and vertical (between segments) spacing. Use gap_x
and gap_y to set them independently:
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived, gap_x = 0.04, gap_y = 0
) +
labs(title = "Wide column gaps, no vertical gaps")ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived, gap_x = 0, gap_y = 0.03
) +
labs(title = "No column gaps, visible vertical gaps")marimekko ships with an Marimekko inspired color
pallette. Use theme_marimekko() oe use
scale_fill_manual(palette = marimekko_pal):
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived
) +
theme_marimekko() +
labs(title = "Earthy Nordic palette")By default, tile borders match the fill colour (borders blend in).
Set colour explicitly to restore visible borders:
ggplot(titanic) +
geom_marimekko(aes(fill = Survived, weight = Freq),
formula = ~ Class | Survived, colour = "white"
) +
theme_marimekko() +
labs(title = "White borders with marimekko palette")marimekko plots work with plotly::ggplotly() out of the
box:
Unlike some mosaic packages, marimekko supports
arbitrary R expressions — both in formulas and inside
aes():
# Expressions work in formulas
ggplot(mtcars) +
geom_marimekko(formula = ~ factor(cyl) | factor(gear)) +
labs(
y = "Gears", fill = "Gears",
title = "factor() inside formula works"
)marimekko works correctly when called with
:: notation (e.g.,
marimekko::geom_marimekko()) without requiring
library(marimekko). This makes it safe to use inside other
packages via Imports rather than Depends.
| Parameter | Used in | Description |
|---|---|---|
formula |
geom_marimekko(), fortify_marimekko() |
Formula specifying variable hierarchy
(~ a \| b \| c) |
gap |
geom_marimekko(), fortify_marimekko() |
Spacing between tiles (fraction of plot area) |
gap_x |
geom_marimekko(), fortify_marimekko() |
Horizontal gap (overrides gap for x) |
gap_y |
geom_marimekko(), fortify_marimekko() |
Vertical gap (overrides gap for y) |
standardize |
fortify_marimekko() |
Equal-width columns (spine plot) |
colour |
geom_marimekko() |
Tile border colour. Default NULL (matches fill) |
show_percentages |
geom_marimekko() |
Append marginal % to x-axis labels |
Need a high-speed mirror for your open-source project?
Contact our mirror admin team at info@clientvps.com.
This archive is provided as a free public service to the community.
Proudly supported by infrastructure from VPSPulse , RxServers , BuyNumber , UnitVPS , OffshoreName and secure payment technology by ArionPay.