Exploding Boxplots in R
bpexploder
Credits: The JavaScript library is based on Mathieu Caule’s D3 Exploding Boxplots, which I have modified slightly and updated for D3 Version 4. The tool-tips were created by Justin Palmer, updated to D3v4 by Dave Gotz and tweaked slightly by myself.represents the author’s initial foray into Html Widgets for R; it renders an svg element showing box-plots that explode upon mouse-click into jittered individual-value plots. The user has the option to configure tool-tips for the individual points.
Installation and Usage
Install the package from Git Hub:
devtools::install_github("homerhanumat/bpexploder")
Call the function with the notorious iris
data:
bpexploder(data = iris,
settings = list(
groupVar = "Species",
levels = levels(iris$Species),
yVar = "Petal.Length",
tipText = list(
Petal.Length = "Petal Length"
),
relativeWidth = 0.75)
)
Click to explode boxes, double-click to restore.
Settings
bpexploder
provides modest options for customization, as illustrated in the following example:
bpexploder(data = chickwts,
settings = list(
yVar = "weight",
# default NULL would make make one plot for yVar
groupVar = "feed",
levels = levels(with(chickwts,
reorder(feed, weight, median))),
# you could adjust the group labels ...
levelLabels = NULL,
# ... and the colors for each group:
levelColors = RColorBrewer::brewer.pal(6, "Set3"),
yAxisLabel = "6-week weight (grams)",
xAxisLabel = "type of feed",
tipText = list(
# as many os you like of:
# variableName = "desired tool-tip label"
# leave tipText at NULL for no tips
weight = "weight"),
# set width relative to grandarent element of svg image:
relativeWidth = 0.75,
# default alignment within containing div is "center"
# "left" and "right" are other possible values"
align = "left",
# aspect = width/height, defaults to 1.25
aspect = 1.5)
)
Sizing
By default the box-plot chart sizes itself so that its width is the the setting relativeWidth
(default-value 1) multiplied by the offset-width of its grandparent node in the HTML DOM. For some layouts—including the tuftesque
theme of this post—the default might not give you the type of control you want. In that case you may direct epexploder()
to make the width of the chart track the offset-width of an existing DOM element. For example, if paragraphs in your document have the desired width, then create an empty paragraph in your markdown like this:
<p id="refelem"></p>
To set the widget-width to a specific fraction of the element that contains the paragraph, you could again use the relativeWidth
setting, or you might try something like:
<p id="refelem" style="width: 70%"></p>
In either case, call bpexploder()
with the referenceId
setting: In fact I’ve been using a reference paragraph throughout this post. Note also that align = “left” is important in tuftesque and probably in other Tufte-based themes.
bpexploder(data = iris,
settings = list(
groupVar = "Species",
levels = levels(iris$Species),
yVar = "Petal.Length",
tipText = list(
Petal.Length = "Petal Length"
),
#using <p id="refelem"></p>
referenceId = "refelem",
relativeWidth = 0.75,
align = "left")
)
Known Issues and Limitations
- Using the Leonids theme from the
prettydoc
R Markdown package, tool-tips are not visible in Firefox or Safari. (They do show in Chrome.) - When
htmlwidgets::createWidget()
creates a widget it gives the widget a random Id number. For some reason this can result in spurious warnings concerning the hidden variable.Random.Seed
. To work around this, set a seed in thesetup
chunk of your R Markdown document, e.g.:
library(bpexploder)
set.seed(5437)