The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
labs(), and the report came back
for a title given as the name of a position scale –
scale_x_continuous("test") – where five things went wrong
together. The labels of the figure were read off
ggplot_build(plot)$plot$labels, which only holds what
labs() set plus the aesthetic defaults, so a plot whose
scale is named “test” reported its title as “x” and the copy hoisted
above a bottom legend carried the wrong text;
ggplot2::get_labs() is used now, which returns the
completed labels. A window blanked its title with
guides(x = guide_axis(title = NULL)), and that does not
beat the name of a scale, so scale_wrap() and
the cut scales printed the title once per window; the theme element is
blanked instead, and only on the windows, so the figure still draws it.
check_axis_title() added the title to the outer ggplot a
second time as a guide axis, whose row sits below the collected
legend, which is why a scale-named title came out twice, once above the
legend and once below it; only the secondary-axis title is left there,
because labs() cannot set it.
grid.draw.ggwrap() wrote the hoisted label back with
totallabs$x <- NULL, and assigning NULL
drops the element rather than clearing it, so a wrap drew a stray “x”
under its legend. And the title is moved out of the panel by
align_assembled_figure(), so a broken plot with a legend at
the bottom keeps it when patchwork or cowplot
take it through ggplotGrob() instead of being handed over
titleless (2026-09-22, Tue, #85)ggbreak adds no
longer draws something wrong;
scale_wrap(n = 2) + scale_y_break(...) came out as a
rendering of the break nested inside the windows of the wrap, because
grid.draw() strips only its own class and hands the
subplots on with the other one still on them, and
aplot::plot_list() does not treat a plot with one of these
classes as a plain plot – ggfun::is.ggbreak() is TRUE for
ggbreak, ggwrap and ggcut, so it
calls ggbreak2ggplot() and draws it. The only sign
of it was a “Coordinate system already present” message. A plot can be
broken on both axes and one axis can be cut, so the pairs that cannot be
drawn now say so and name the two scales; a cut on both axes is one of
them, and it was worse than unsupported, because a cut is stored in a
single attribute, so the second cut replaced the first and the figure
was byte-identical to the single cut, with nothing said about the cut
that was dropped (2026-09-20, Sun, #31)scale_x_break() and scale_y_break() gained
a bridge argument, off by default; with
bridge = TRUE the piece of a line that the break hides is
drawn in the space between the windows, so a line that crosses the break
reads as one line instead of two. A line grob keeps the geometry of the
whole line and is only clipped when it is drawn, so where a line leaves
one window and enters the next can be read off the grob, and the space
space opens is a cell of the assembled figure that spans
exactly those two edges. The lines of geom_line(),
geom_path() and geom_step() are bridged, and
only for a single break on a continuous axis; a break on a discrete axis
and a plot that is faceted along the broken axis are left alone. The
default is unchanged, so nothing moves unless it is asked for
(2026-09-20, Sun, #33)patchwork or cowplot layout; the layout aligns
the plots by their panel cell, and the assembled figure is
one panel that also held the axis of its windows, so a plot drawn beside
it was aligned against a panel that already carried the axis labels and
came out wider than the plot area it sits next to – 44 pixels on a 6 by
3 inch figure, and 0 to 1 pixel now, for the break, the cut and the wrap
scales, with coord_flip(), with a dual break, with a legend
and with facets. The axis of the assembled figure is moved out of the
panel into the cell the layout expects an axis in, and the room it took
inside the figure is kept, so nothing is drawn differently; this is
applied to the gtable ggplotGrob() hands out only, and
print() and ggsave() are byte-for-byte
unchanged (2026-09-20, Sun, #46)patchwork and cowplot do not draw
a plot the way print() does, they call
ggplotGrob(), and that builds the plot from
ggplot_build() without ever reading the break, so
plt2 + plt1 came out as two plain plots – the break was
dropped silently, without a warning, and the same happened to
plot_grid(), to scale_wrap() and to the cut
scales. ggplot_build() and ggplot_gtable() are
generics even though ggplotGrob() is not, so a broken plot
now tags the object it is built into and is drawn as a whole from there;
a regression test covers the break, the wrapping and the cutting, and
the drawing is left to print() unchanged (2026-09-20, Sun,
#46)facet_grid(scales = "free_y") every panel has a
scale of its own and the first one holds the range of the first panel
only, so the windows were built from that range and every point outside
it was dropped (the facet whose data sat high came out empty), while a
break that was inside the first panel but outside the axis of the others
was accepted and one inside the others was rejected as “not in the plot
range”. A broken axis is shared by the facets, so the windows are drawn
on the axis of all the panels together; a regression test covers both
the range and the two breaks (2026-09-20, Sun)facet_wrap() is left alone (2026-09-20, Sun)scale_x_break() on a faceted
plot came out with no tick labels at all, sized the panels against every
facet column instead of against their own and left them too small, and
did not keep the share of the figure that each window is given. The
pieces are now bound into a single gtable instead of being handed to
patchwork as opaque panels, and a facet_wrap()
is left alone because it has no facet rows or columns to nest into and
puts a strip above every panel (2026-09-20, Sun, #55, #17)facet_grid(), and
with coord_flip() the facet columns are kept together
instead, which is the case reported in #55 and #17 (2026-09-20, Sun,
#55, #17)theme_set() no longer draws a
second panel border, a second pair of axis lines or a panel background
around the whole figure; those elements belong to the subplots, and the
outer ggplot that carries the assembled figure was taking them from the
global theme by accident, so theme_set(theme_bw()) drew a
rectangle around the figure and theme_set(theme_classic())
two extra lines outside the plot (2026-09-20, Sun, #57)patchwork took that background from the default theme,
so a broken plot could not be superimposed on another one with
annotation_custom() (it hid whatever was drawn below it)
and the plot.background set on the plot never reached the
figure (2026-09-20, Sun, #52)theme(legend.position = "bottom"), for
scale_x_break(), scale_y_break(), a dual
break, coord_flip(), scale_wrap() and the cut
scales; the report in #85 is the same defect that #53 fixed, the
reporter was on an earlier version (2026-09-19, Sat, #85)theme(legend.position = "bottom") is used;
patchwork collects the legend at the bottom of the
assembled figure, which is the panel of the outer ggplot that carries
the axis title, so the legend used to be drawn on top of the title
instead of underneath it (2026-09-18, Fri, #53)patchwork and gtable are now declared in
Imports; both were already needed at run time to assemble
the subplots (2026-09-18, Fri)breaks argument of
scale_x_break()/scale_y_break() is the place
where the axis is cut, and the ticks are set with breaks in
the continuous scale, which every subplot then filters to its own range
(2026-09-18, Fri, #66)scale_wrap() or
scale_x_cut()/scale_y_cut();
ggplot_add() re-dispatched to itself for ever and R died
with a C stack overflow (2026-09-17, Thu)coord_cartesian() or
coord_flip() set on the axis that is not broken,
so scale_y_break() no longer discards
coord_cartesian(xlim = ...), and
scale_x_break(), scale_wrap() and
scale_x_cut()/scale_y_cut() no longer discard
the limits of the other axis (2026-09-17, Thu, #59)theme(plot.margin = ...) when the plot is
wrapped for the final draw; previously the theme_void()
from ggplotify::as.ggplot() swallowed the user margin so
plot.margin had no effect on a broken plot (2026-09-17,
Thu, #71)pdf() or ggsave(); ggbreak now
starts the page before it builds the subplots instead of leaving the
page that building opens behind (2026-09-17, Thu, #73)Date or datetime axis and the use of ggrepel
in the vignette (2026-09-17, Thu)scale_wrap(), scale_x_cut() or
scale_y_cut() is used together with
coord_flip() (2026-09-17, Thu)Date or datetime axis is no longer drawn as numbers
when the plot relies on the scale that ggplot2 creates from
the data instead of calling scale_x_date(),
scale_x_datetime() or their y counterparts
itself (2026-09-17, Thu, #84)scale_x_cut() and scale_y_cut()
failing with “non-numeric argument to binary operator” when the axis
uses a transformed scale such as scale_y_log10()
(2026-09-17, Thu)ggrepel::geom_text_repel() and
geom_label_repel() being repeated in every subplot; a label
is now only drawn in the subplot that holds its point (2026-09-17, Thu,
#35)scale_x_break(), scale_y_break(),
scale_x_cut() and scale_y_cut() on a discrete
axis; the break points are level names and a break between two adjacent
levels only inserts a gap (2026-09-16, Wed, #68)scale_x_break(), scale_y_break(),
scale_x_cut() and scale_y_cut() accept break
points of a datetime axis given as Date, character or
numeric, in addition to POSIXct (2026-09-16, Wed, #84)sec.axis (2026-09-16, Wed,
#64)scale_y_break() (2026-08-07, Fri, #83)yulab_msg() for startup message (2025-01-08,
Wed)c() and
bibentry() instead of old-style personList()
and citEntry() (2023-06-26, Mon)theme_fp() to the ‘ggfun’ package (2023-06-24,
Sat)scale_wrap() supports using categorical variable as
x-axis (2022-01-16, Sun, #41)space argument (2022-01-11, Tue)expand argument (2021-10-22, Fri, #30)xlim and
ylim (2021-09-24, Fri, #29)is.ggbreak and ggbreak2ggplot from
the ggfun package (2021-09-16, Thu)scale_xy_expand
option (2021-09-15, Wed; #26)aplot::plot_list (2021-09-03,
Fri)expand=FALSE (2021-08-14, Sat)legend.position = "bottom" via
theme() (2021-05-31, Mon)
legend.position = c(.1, .2)) is not supported
currentlyrecording = FALSE to grid.draw
method, only graph object return without plotting the figure
(2021-05-24, Mon)patchwork for axis break plots + gg
plot (2021-05-21, Fri)scale_x_cut and scale_y_cut functions
(2021-05-18, Tue)scale_wrap function and support of using date object as
axis (2021-05-15, Sat)coord_flip, facet_grid and
facet_wrap (2021-05-14, Fri)legend and all labels (x, y, title, subtitle,
caption and tag)patchwork, now p1 + p2 (or other
operations) will align two ggbreak plot (2021-05-11, Tue)scale_x_break or
scale_y_break and compatible with reverse axisscale_x_break
and scale_y_break (2021-05-10, Mon)These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.