Releases: tidyverse/ggplot2
ggplot2 3.5.1
This is a small release focusing on fixing regressions from 3.5.0 and
documentation updates.
Bug fixes
- Fixed bug where discrete scales could not map aesthetics only consisting of
NA
s (#5623) - Fixed spurious warnings from
sec_axis()
withbreaks = NULL
(#5713). - Patterns and gradients are now also enabled in
geom_sf()
(@teunbrand, #5716). - The default behaviour of
resolution()
has been reverted to pre-3.5.0
behaviour. Whether mapped discrete vectors should be treated as having
resolution of 1 is controlled by the newdiscrete
argument. - Fixed bug in
guide_bins()
andguide_coloursteps()
where discrete breaks,
such as the levels produced bycut()
, were ordered incorrectly
(@teunbrand, #5757).
Improvements
- When facets coerce the faceting variables to factors, the 'ordered' class
is dropped (@teunbrand, #5666). coord_map()
andcoord_polar()
throw informative warnings when used
with the guide system (#5707).- When passing a function to
stat_contour(breaks)
, that function is used to
calculate the breaks even ifbins
andbinwidth
are missing
(@teunbrand, #5686). geom_step()
now supportslineend
,linejoin
andlinemitre
parameters
(@teunbrand, #5705).- Fixed performance loss when the
.data
pronoun is used inaes()
(#5730). - Facet evaluation is better at dealing with inherited errors
(@teunbrand, #5670). stat_bin()
deals with non-finite breaks better (@teunbrand, #5665).- While axes in
coord_radial()
don't neatly fit the top/right/bottom/left
organisation, specifyingposition = "top"
orposition = "right"
in the scale will flip the placement of the radial axis (#5735) - Theme elements that do not exist now throw warnings instead of errors (#5719).
- Fixed bug in
coord_radial()
where full circles were not treated as such
(@teunbrand, #5750). - When legends detect the presence of values in a layer,
NA
is now detected
if the data contains values outside the given breaks (@teunbrand, #5749). annotate()
now warns aboutstat
orposition
arguments (@teunbrand, #5151)guide_coloursteps(even.steps = FALSE)
now works with discrete data that has
been formatted bycut()
(@teunbrand, #3877).
ggplot2 3.5.0
This is a minor release that turned out quite beefy. It is focused on
overhauling the guide system: the system responsible for displaying information
from scales in the guise of axes and legends. As part of that overhaul, new
guides have been implemented and existing guides have been refined. The look
and feel of guides has been mostly preserved, but their internals and
styling options have changed drastically.
Briefly summarising other highlights, we also welcome coord_radial()
as a
successor of coord_polar()
. Initial support for newer graphical features,
such as pattern fills has been added. The API has changed how I()
/<AsIs>
vectors interact with the scale system, namely: not at all.
Breaking changes
-
The guide system. As a whole. See 'new features' for more information.
While the S3 guide generics are still in place, the S3 methods for
guide_train()
,guide_merge()
,guide_geom()
,guide_transform()
,
guide_gengrob()
have been superseded by the respective ggproto methods.
In practice, this will mean thatNextMethod()
or sub-classing ggplot2's
guides with the S3 system will no longer work. -
By default,
guide_legend()
now only draws a key glyph for a layer when
the value is in the layer's data. To revert to the old behaviour, you
can still setshow.legend = c({aesthetic} = TRUE)
(@teunbrand, #3648). -
In the
scale_{colour/fill}_gradient2()
and
scale_{colour/fill}_steps2()
functions, themidpoint
argument is
transformed by the scale transformation (#3198). -
The
legend.key
theme element is set to inherit from thepanel.background
theme element. The default themes no longer set thelegend.key
element.
This causes a visual change with the defaulttheme_gray()
(#5549). -
The
scale_name
argument incontinuous_scale()
,discrete_scale()
and
binned_scale()
is soft-deprecated. If you have implemented custom scales,
be advised to double-check that unnamed arguments ends up where they should
(@teunbrand, #1312). -
The
legend.text.align
andlegend.title.align
arguments intheme()
are
deprecated. Thehjust
setting of thelegend.text
andlegend.title
elements continues to fulfill the role of text alignment (@teunbrand, #5347). -
'lines' units in
geom_label()
, often used in thelabel.padding
argument,
are now are relative to the text size. This causes a visual change, but fixes
a misalignment issue between the textbox and text (@teunbrand, #4753) -
coord_flip()
has been marked as superseded. The recommended alternative is
to swap thex
andy
aesthetic and/or using theorientation
argument in
a layer (@teunbrand, #5130). -
The
trans
argument in scales and secondary axes has been renamed to
transform
. Thetrans
argument itself is deprecated. To access the
transformation from the scale, a newget_transformation()
method is
added to Scale-classes (#5558). -
Providing a numeric vector to
theme(legend.position)
has been deprecated.
To set the default legend position inside the plot use
theme(legend.position = "inside", legend.position.inside = c(...))
instead.
New features
-
Plot scales now ignore
AsIs
objects constructed withI(x)
, instead of
invoking the identity scale. This allows these columns to co-exist with other
layers that need a non-identity scale for the same aesthetic. Also, it makes
it easy to specify relative positions (@teunbrand, #5142). -
The
fill
aesthetic in many geoms now accepts grid's patterns and gradients.
For developers of layer extensions, this feature can be enabled by switching
fromfill = alpha(fill, alpha)
tofill = fill_alpha(fill, alpha)
when
providing fills togrid::gpar()
(@teunbrand, #3997). -
New function
check_device()
for testing the availability of advanced
graphics features introduced in R 4.1.0 onward (@teunbrand, #5332). -
coord_radial()
is a successor tocoord_polar()
with more customisation
options.coord_radial()
can:- integrate with the new guide system via a dedicated
guide_axis_theta()
to
display the angle coordinate. - in addition to drawing full circles, also draw circle sectors by using the
end
argument. - avoid data vanishing in the center of the plot by setting the
donut
argument. - adjust the
angle
aesthetic of layers, such asgeom_text()
, to align
with the coordinate system using therotate_angle
argument.
- integrate with the new guide system via a dedicated
The guide system
The guide system encompassing axes and legends, as the last remaining chunk of
ggplot2, has been rewritten to use the <ggproto>
system instead of the S3
system. This change was a necessary step to officially break open the guide
system for extension package developers. The axes and legends now inherit from
a <Guide>
class, which makes them extensible in the same manner as geoms,
stats, facets and coords (#3329, @teunbrand)
-
The most user-facing change is that the styling of guides is rewired through
the theme system. Guides now have atheme
argument that can style
individual guides, whiletheme()
has gained additional arguments to style
guides. Theme elements declared in the guide override theme elements set
through the plot. The new theme elements for guides are:
legend.key.spacing{.x/.y}
,legend.frame
,legend.axis.line
,
legend.ticks
,legend.ticks.length
,legend.text.position
and
legend.title.position
. Previous style options in the arguments of
guide_*()
functions are soft-deprecated. -
Unfortunately, we could not fully preserve the function of pre-existing
guide extensions written in the S3 system. A fallback for these old guides
is encapsulated in the<GuideOld>
class, which calls the old S3 generics.
The S3 methods have been removed as part of cleaning up, so the old guides
will still work if the S3 methods are reimplemented, but we encourage to
switch to the new system (#2728). -
The
order
argument of guides now strictly needs to be a length-1
integer (#4958).
Axes
-
New
guide_axis_stack()
to combine other axis guides on top of one another. -
New
guide_axis_theta()
to draw an axis in a circular arc in
coord_radial()
. The guide can be controlled by adding
guides(theta = guide_axis_theta(...))
to a plot. -
New
guide_axis_logticks()
can be used to draw logarithmic tick marks as
an axis. It supersedes theannotation_logticks()
function
(@teunbrand, #5325). -
guide_axis()
gains aminor.ticks
argument to draw minor ticks (#4387). -
guide_axis()
gains acap
argument that can be used to trim the
axis line to extreme breaks (#4907). -
Primary axis titles are now placed at the primary guide, so that
guides(x = guide_axis(position = "top"))
will display the title at the
top by default (#4650). -
The default
vjust
for theaxis.title.y.right
element is now 1 instead of
0. -
Unknown secondary axis guide positions are now inferred as the opposite
of the primary axis guide when the latter has a knownposition
(#4650).
Legends
-
New
guide_custom()
function for drawing custom graphical objects (grobs)
unrelated to scales in legend positions (#5416). -
All legends have acquired a
position
argument, that allows individual guides
to deviate from thelegend.position
set in thetheme()
function. This
means that legends can now be placed at multiple sides of the plot (#5488). -
The spacing between legend keys and their labels, in addition to legends
and their titles, is now controlled by the text'smargin
setting. Not
specifying margins will automatically add appropriate text margins. To
control the spacing within a legend between keys, the new
legend.key.spacing.{x/y}
argument can be used intheme()
. This leaves the
legend.spacing
theme setting dedicated to solely controlling the spacing
between different guides (#5455). -
guide_colourbar()
andguide_coloursteps()
gain analpha
argument to
set the transparency of the bar (#5085). -
New
display
argument inguide_colourbar()
supplants theraster
argument.
In R 4.1.0 and above,display = "gradient"
will draw a gradient. -
Legend keys that can draw arrows have their size adjusted for arrows.
-
When legend titles are larger than the legend, title justification extends
to the placement of keys and labels (#1903). -
Glyph drawing functions of the
draw_key_*()
family can now set"width"
and"height"
attributes (in centimetres) to the produced keys to control
their displayed size in the legend. -
coord_sf()
now uses customisable guides provided in the scales or
guides()
function (@teunbrand).
Improvements
-
guide_coloursteps(even.steps = FALSE)
now draws one rectangle per interval
instead of many small ones (#5481). -
draw_key_label()
now better reflects the appearance of labels (#5561). -
position_stack()
no longer silently removes missing data, which is now
handled by the geom instead of position (#3532). -
The
minor_breaks
function argument in scales can now also take a function
with two arguments: the scale's limits and the scale's major breaks (#3583). -
Failing to fit or predict in
stat_smooth()
now gives a warning and omits
the failed group, instead of throwing an error (@teunbrand, #5352). -
labeller()
now handles unspecified entries from lookup tables
(@92amartins, #4599). -
fortify.default()
now accepts a data-frame-like object granted the object
exhibits healthydim()
,colnames()
, andas.data.frame()
behaviours
(@hpages, #5390). -
geom_violin()
gains abounds
argument analogous togeom_density()
s
(@eliocamp, #5493). -
To apply dodging more consistently in violin plots,
stat_ydensity()
now
has adrop
argument to keep or discard groups with 1 observation. -
geom_boxplot()
gains a new argument,staplewidth
that can...
ggplot2 3.4.4
This hotfix release adapts to a change in r-devel's base::is.atomic()
and
the upcoming retirement of maptools.
fortify()
for sp objects (e.g.,SpatialPolygonsDataFrame
) is now deprecated
and will be removed soon in support of the upcoming retirement of rproj, rgeos,
and maptools. In advance
of the whole removal,fortify(<SpatialPolygonsDataFrame>, region = ...)
no longer works as of this version (@yutannihilation, #5244).
ggplot2 3.4.3
This hotfix release addresses a version comparison change in r-devel. There are
no user-facing or breaking changes.
ggplot2 3.4.2
This is a hotfix release anticipating changes in r-devel, but folds in upkeep
changes and a few bug fixes as well.
Minor improvements
-
Various type checks and their messages have been standardised
(@teunbrand, #4834). -
ggplot2 now uses
scales::DiscreteRange
andscales::ContinuousRange
, which
are available to write scale extensions from scratch (@teunbrand, #2710). -
The
layer_data()
,layer_scales()
andlayer_grob()
now have the default
plot = last_plot()
(@teunbrand, #5166). -
The
datetime_scale()
scale constructor is now exported for use in extension
packages (@teunbrand, #4701).
Bug fixes
-
update_geom_defaults()
andupdate_stat_defaults()
now return properly
classed objects and have updated docs (@dkahle, #5146). -
For the purposes of checking required or non-missing aesthetics, character
vectors are no longer considered non-finite (@teunbrand, @4284). -
annotation_logticks()
skips drawing ticks when the scale range is non-finite
instead of throwing an error (@teunbrand, #5229). -
Fixed spurious warnings when the
weight
was used instat_bin_2d()
,
stat_boxplot()
,stat_contour()
,stat_bin_hex()
andstat_quantile()
(@teunbrand, #5216). -
To prevent changing the plotting order,
stat_sf()
is now computed per panel
instead of per group (@teunbrand, #4340). -
Fixed bug in
coord_sf()
where graticule lines didn't obey
panel.grid.major
's linewidth setting (@teunbrand, #5179). -
geom_text()
drops observations whereangle = NA
instead of throwing an
error (@teunbrand, #2757).
ggplot2 3.4.1
This is a small release focusing on fixing regressions in the 3.4.0 release
and minor polishes.
Breaking changes
- The computed variable
y
instat_ecdf()
has been superseded byecdf
to
prevent incorrect scale transformations (@teunbrand, #5113 and #5112).
New features
-
Added
scale_linewidth_manual()
andscale_linewidth_identity()
to support
thelinewidth
aesthetic (@teunbrand, #5050). -
ggsave()
warns when multiplefilename
s are given, and only writes to the
first file (@teunbrand, #5114).
Bug fixes
-
Fixed a regression in
geom_hex()
where aesthetics were replicated across
bins (@thomasp85, #5037 and #5044). -
Using two ordered factors as facetting variables in
facet_grid(..., as.table = FALSE)
now throws a warning instead of an
error (@teunbrand, #5109). -
Fixed misbehaviour of
draw_key_boxplot()
anddraw_key_crossbar()
with
skewed key aspect ratio (@teunbrand, #5082). -
Fixed spurious warning when
weight
aesthetic was used instat_smooth()
(@teunbrand based on @clauswilke's suggestion, #5053). -
The
lwd
alias is now correctly replaced bylinewidth
instead ofsize
(@teunbrand based on @clauswilke's suggestion #5051). -
Fixed a regression in
Coord$train_panel_guides()
where names of guides were
dropped (@maxsutton, #5063).
In binned scales:
-
Automatic breaks should no longer be out-of-bounds, and automatic limits are
adjusted to include breaks (@teunbrand, #5082). -
Zero-range limits no longer throw an error and are treated akin to continuous
scales with zero-range limits (@teunbrand, #5066). -
The
trans = "date"
andtrans = "time"
transformations were made compatible
(@teunbrand, #4217).
ggplot2 3.4.0
This is a minor release focusing on tightening up the internals and ironing out
some inconsistencies in the API. The biggest change is the addition of the
linewidth
aesthetic that takes of sizing the width of any line from size
.
This change, while attempting to be as non-breaking as possible, has the
potential to change the look of some of your plots.
Other notable changes is a complete redo of the error and warning messaging in
ggplot2 using the cli package. Messaging is now better contextualised and it
should be easier to identify which layer an error is coming from. Last, we have
now made the switch to using the vctrs package internally which means that
support for vctrs classes as variables should improve, along with some small
gains in rendering speed.
Breaking changes
-
A
linewidth
aesthetic has been introduced and supersedes thesize
aesthetic for scaling the width of lines in line based geoms.size
will
remain functioning but deprecated for these geoms and it is recommended to
update all code to reflect the new aesthetic. For geoms that have both point
sizing and linewidth sizing (geom_pointrange()
andgeom_sf
)size
now
only refers to sizing of points which can leads to a visual change in old
code (@thomasp85, #3672) -
The default line width for polygons in
geom_sf()
have been decreased to 0.2
to reflect that this is usually used for demarking borders where a thinner
line is better suited. This change was made since we already induced a
visual change ingeom_sf()
with the introduction of thelinewidth
aesthetic. -
The dot-dot notation (
..var..
) andstat()
, which have been superseded by
after_stat()
, are now formally deprecated (@yutannihilation, #3693). -
qplot()
is now formally deprecated (@yutannihilation, #3956). -
stage()
now properly refers to the values without scale transformations for
the stage ofafter_stat
. If your code requires the scaled version of the
values for some reason, you have to apply the same transformation by yourself,
e.g.sqrt()
forscale_{x,y}_sqrt()
(@yutannihilation and @teunbrand, #4155). -
Use
rlang::hash()
instead ofdigest::digest()
. This update may lead to
changes in the automatic sorting of legends. In order to enforce a specific
legend order use theorder
argument in the guide. (@thomasp85, #4458) -
referring to
x
in backquoted expressions withlabel_bquote()
is no longer
possible. -
The
ticks.linewidth
andframe.linewidth
parameters ofguide_colourbar()
are now multiplied with.pt
like elsewhere in ggplot2. It can cause visual
changes when these arguments are not the defaults and these changes can be
restored to their previous behaviour by adding/ .pt
(@teunbrand #4314). -
scale_*_viridis_b()
now uses the full range of the viridis scales
(@gregleleu, #4737)
New features
-
geom_col()
andgeom_bar()
gain a newjust
argument. This is set to0.5
by default; usejust = 0
/just = 1
to place columns on the left/right
of the axis breaks.
(@wurli, #4899) -
geom_density()
andstat_density()
now supportbounds
argument
to estimate density with boundary correction (@echasnovski, #4013). -
ggplot now checks during statistical transformations whether any data
columns were dropped and warns about this. If stats intend to drop
data columns they can declare them in the new fielddropped_aes
.
(@clauswilke, #3250) -
...
supportsrlang::list2
dynamic dots in all public functions.
(@mone27, #4764) -
theme()
now has astrip.clip
argument, that can be set to"off"
to
prevent the clipping of strip text and background borders (@teunbrand, #4118) -
geom_contour()
now accepts a function in thebreaks
argument
(@eliocamp, #4652).
Minor improvements and bug fixes
-
Fix a bug in
position_jitter()
where infinity values were dropped (@javlon,
#4790). -
geom_linerange()
now respects thena.rm
argument (#4927, @thomasp85) -
Improve the support for
guide_axis()
oncoord_trans()
(@yutannihilation, #3959) -
Added
stat_align()
to align data without common x-coordinates prior to
stacking. This is now the default stat forgeom_area()
(@thomasp85, #4850) -
Fix a bug in
stat_contour_filled()
where break value differences below a
certain number of digits would cause the computations to fail (@thomasp85,
#4874) -
Secondary axis ticks are now positioned more precisely, removing small visual
artefacts with alignment between grid and ticks (@thomasp85, #3576) -
Improve
stat_function
documentation regardingxlim
argument.
(@92amartins, #4474) -
Fix various issues with how
labels
,breaks
,limits
, andshow.limits
interact in the different binning guides (@thomasp85, #4831) -
Automatic break calculation now squishes the scale limits to the domain
of the transformation. This allowsscale_{x/y}_sqrt()
to find breaks at 0
when appropriate (@teunbrand, #980). -
Using multiple modified aesthetics correctly will no longer trigger warnings.
If used incorrectly, the warning will now report the duplicated aesthetic
instead ofNA
(@teunbrand, #4707). -
aes()
now supports the!!!
operator in its first two arguments
(#2675). Thanks to @yutannihilation and @teunbrand for draft
implementations. -
Require rlang >= 1.0.0 (@billybarc, #4797)
-
geom_violin()
no longer issues "collapsing to unique 'x' values" warning
(@bersbersbers, #4455) -
annotate()
now documents unsupported geoms (geom_abline()
,geom_hline()
andgeom_vline()
), and warns when they are requested (@mikmart, #4719) -
presidential
dataset now includes Trump's presidency (@bkmgit, #4703). -
position_stack()
now works fully withgeom_text()
(@thomasp85, #4367) -
geom_tile()
now correctly recognises missing data inxmin
,xmax
,ymin
,
andymax
(@thomasp85 and @sigmapi, #4495) -
geom_hex()
will now use the binwidth fromstat_bin_hex()
if present,
instead of deriving it (@thomasp85, #4580) -
geom_hex()
now works on non-linear coordinate systems (@thomasp85) -
Fixed a bug throwing errors when trying to render an empty plot with secondary
axes (@thomasp85, #4509) -
Axes are now added correctly in
facet_wrap()
whenas.table = FALSE
(@thomasp85, #4553) -
Better compatibility of custom device functions in
ggsave()
(@thomasp85, #4539) -
Binning scales are now more resilient to calculated limits that ends up being
NaN
after transformations (@thomasp85, #4510) -
Strip padding in
facet_grid()
is now only in effect if
strip.placement = "outside"
and an axis is present between the strip and
the panel (@thomasp85, #4610) -
Aesthetics of length 1 are now recycled to 0 if the length of the data is 0
(@thomasp85, #4588) -
Setting
size = NA
will no longer causeguide_legend()
to error
(@thomasp85, #4559) -
Setting
stroke
toNA
ingeom_point()
will no longer impair the sizing of
the points (@thomasp85, #4624) -
stat_bin_2d()
now correctly recognises theweight
aesthetic
(@thomasp85, #4646) -
All geoms now have consistent exposure of linejoin and lineend parameters, and
the guide keys will now respect these settings (@thomasp85, #4653) -
geom_sf()
now respectsarrow
parameter for lines (@JakeRuss, #4659) -
Updated documentation for
print.ggplot
to reflect that it returns
the original plot, not the result ofggplot_build()
. (@r2evans, #4390) -
scale_*_manual()
no longer displays extra legend keys, or changes their
order, when a namedvalues
argument has more items than the data. To display
allvalues
on the legend instead, use
scale_*_manual(values = vals, limits = names(vals))
. (@teunbrand, @banfai,
#4511, #4534) -
Updated documentation for
geom_contour()
to correctly reflect argument
precedence betweenbins
andbinwidth
. (@eliocamp, #4651) -
Dots in
geom_dotplot()
are now correctly aligned to the baseline when
stackratio != 1
andstackdir != "up"
(@mjskay, #4614) -
Key glyphs for
geom_boxplot()
,geom_crossbar()
,geom_pointrange()
, and
geom_linerange()
are now orientation-aware (@mjskay, #4732) -
Updated documentation for
geom_smooth()
to more clearly describe effects of
thefullrange
parameter (@thoolihan, #4399).
ggplot2 3.3.6
This is a very small release only applying an internal change to comply with
R 4.2 and its deprecation of default.stringsAsFactors()
. There are no user
facing changes and no breaking changes.
ggplot2 3.3.5
This is a very small release focusing on fixing a couple of untenable issues
that surfaced with the 3.3.4 release
- Revert changes made in #4434 (apply transform to intercept in
geom_abline()
)
as it introduced undesirable issues far worse than the bug it fixed
(@thomasp85, #4514) - Fixes an issue in
ggsave()
when producing emf/wmf files (@yutannihilation,
#4521) - Warn when grDevices specific arguments are passed to ragg devices (@thomasp85,
#4524) - Fix an issue where
coord_sf()
was reporting that it is non-linear
even when data is provided in projected coordinates (@clauswilke, #4527)
ggplot2 3.3.4
This is a larger patch release fixing a huge number of bugs and introduces a
small selection of feature refinements.
Features
-
Alt-text can now be added to a plot using the
alt
label, i.e
+ labs(alt = ...)
. Currently this alt text is not automatically propagated,
but we plan to integrate into Shiny, RMarkdown, and other tools in the future.
(@thomasp85, #4477) -
Add support for the BrailleR package for creating descriptions of the plot
when rendered (@thomasp85, #4459) -
coord_sf()
now has an argumentdefault_crs
that specifies the coordinate
reference system (CRS) for non-sf layers and scale/coord limits. This argument
defaults toNULL
, which means non-sf layers are assumed to be in projected
coordinates, as in prior ggplot2 versions. Settingdefault_crs = sf::st_crs(4326)
provides a simple way to interpret x and y positions as longitude and latitude,
regardless of the CRS used bycoord_sf()
. Authors of extension packages
implementingstat_sf()
-like functionality are encouraged to look at the source
code ofstat_sf()
'scompute_group()
function to see how to provide scale-limit
hints tocoord_sf()
(@clauswilke, #3659). -
ggsave()
now uses ragg to render raster output if ragg is available. It also
handles custom devices that sets a default unit (e.g.ragg::agg_png
)
correctly (@thomasp85, #4388) -
ggsave()
now returns the saved file location invisibly (#3379, @eliocamp). -
The scale arguments
limits
,breaks
,minor_breaks
,labels
,rescaler
andoob
now accept purrr style lambda notation (@teunbrand, #4427). The same
is true foras_labeller()
(and therefore alsolabeller()
)
(@netique, #4188). -
Manual scales now allow named vectors passed to
values
to contain fewer
elements than existing in the data. Elements not present in values will be set
toNA
(@thomasp85, #3451) -
Date and datetime position scales support out-of-bounds (oob) arguments to
control how limits affect data outside those limits (@teunbrand, #4199).
Fixes
-
Fix a bug that
after_stat()
andafter_scale()
cannot refer to aesthetics
if it's specified in the plot-global mapping (@yutannihilation, #4260). -
Fix bug in
annotate_logticks()
that would cause an error when used together
withcoord_flip()
(@thomasp85, #3954) -
Fix a bug in
geom_abline()
that resulted inintercept
not being subjected
to the transformation of the y scale (@thomasp85, #3741) -
Extent the range of the line created by
geom_abline()
so that line ending
is not visible for large linewidths (@thomasp85, #4024) -
Fix bug in
geom_dotplot()
where dots would be positioned wrong with
stackgroups = TRUE
(@thomasp85, #1745) -
Fix calculation of confidence interval for locfit smoothing in
geom_smooth()
(@topepo, #3806) -
Fix bug in
geom_text()
where"outward"
and"inward"
justification for
someangle
values was reversed (@aphalo, #4169, #4447) -
ggsave()
now sets the default background to match the fill value of the
plot.background
theme element (@karawoo, #4057) -
It is now deprecated to specify
guides(<scale> = FALSE)
or
scale_*(guide = FALSE)
to remove a guide. Please use
guides(<scale> = "none")
orscale_*(guide = "none")
instead
(@yutannihilation, #4094). -
Fix a bug in
guide_bins()
where keys would disappear if the guide was
reversed (@thomasp85, #4210) -
Fix bug in
guide_coloursteps()
that would repeat the terminal bins if the
breaks coincided with the limits of the scale (@thomasp85, #4019) -
Make sure that default labels from default mappings doesn't overwrite default
labels from explicit mappings (@thomasp85, #2406) -
Fix bug in
labeller()
where parsing was turned off if.multiline = FALSE
(@thomasp85, #4084) -
Make sure
label_bquote()
has access to the calling environment when
evaluating the labels (@thomasp85, #4141) -
Fix a bug in the layer implementation that introduced a new state after the
first render which could lead to a different look when rendered the second
time (@thomasp85, #4204) -
Fix a bug in legend justification where justification was lost of the legend
dimensions exceeded the available size (@thomasp85, #3635) -
Fix a bug in
position_dodge2()
whereNA
values in thee data would cause an
error (@thomasp85, #2905) -
Make sure
position_jitter()
creates the same jittering independent of
whether it is called by name or with constructor (@thomasp85, #2507) -
Fix a bug in
position_jitter()
where different jitters would be applied to
different position aesthetics of the same axis (@thomasp85, #2941) -
Fix a bug in
qplot()
when supplyingc(NA, NA)
as axis limits
(@thomasp85, #4027) -
Remove cross-inheritance of default discrete colour/fill scales and check the
type and aesthetic of function output iftype
is a function
(@thomasp85, #4149) -
Fix bug in
scale_[x|y]_date()
where custom breaks functions that resulted in
fracional dates would get misaligned (@thomasp85, #3965) -
Fix bug in
scale_[x|y]_datetime()
where a specified timezone would be
ignored by the scale (@thomasp85, #4007) -
Fix issue in
sec_axis()
that would throw warnings in the absence of any
secondary breaks (@thomasp85, #4368) -
stat_bin()
's computed variablewidth
is now documented (#3522). -
stat_count()
now computes width based on the full dataset instead of per
group (@thomasp85, #2047) -
Extended
stat_ecdf()
to calculate the cdf from either x or y instead from y
only (@jgjl, #4005) -
Fix a bug in
stat_summary_bin()
where one more than the requested number of
bins would be created (@thomasp85, #3824) -
Only drop groups in
stat_ydensity()
when there are fewer than two data
points and throw a warning (@andrewwbutler, #4111). -
Fixed a bug in strip assembly when theme has
strip.text = element_blank()
and plots are faceted with multi-layered strips (@teunbrand, #4384). -
Using
theme(aspect.ratio = ...)
together with free space infacet_grid()
now crrectly throws an error (@thomasp85, #3834) -
Fixed a bug in
labeller()
so that.default
is passed toas_labeller()
when labellers are specified by naming faceting variables. (@waltersom, #4031) -
ggplot2 now requires R >= 3.3 (#4247).
-
ggplot2 now uses
rlang::check_installed()
to check if a suggested package is
installed, which will offer to install the package before continuing (#4375,
@malcolmbarrett) -
Improved error with hint when piping a
ggplot
object into a facet function
(#4379, @mitchelloharawild).