ggplotly()
now works better with the development version of ggplot2 (> v3.4.4). (#2315)ggplotly()
now works better with the development version of ggplot2 (> v3.4.3). (#2301)Closed #1947: ggplotly()
now correctly handles geom_vline
/geom_hline
with empty data. Previously, if geom_vline
/geom_hline
was passed an empty data frame, it would result in an error. The plot is drawn even if no lines are found; this is the same behavior as ggplot2
.
Closed #1214: Do not warn in RStudio on Windows when scattergl is used. Recent RStudio versions can render scattergl correctly.
Closed #2298: Fix fill assignment in geom_point when a single shape value was used with multiple fill and colour values mapped (@zeehio)
highlight()
’s selectize
argument. (#2217)ggplotly()
now provides better support for ggplot2 >v3.4.2. (#2262)ggplotly()
no longer silently drops legends that are customized through ggplot2::guide_legend()
.save_image()
no longer needs reticulate::py_run_string("import sys")
in order to run without error. (#2179)highlight(selectize = TRUE)
no longer yields an incorrect selectize.js result when there is a combination of crosstalk and non-crosstalk traces. (#2217)ggplotly()
no longer errors given a geom_area()
with 1 or less data points (error introduced by new behavior in ggplot2 v3.4.0). (#2209)ggplotly()
no longer errors on stat_summary(geom = "crossbar")
. (#2222)ggplotly()
no longer removes legends when setting guide properties via guides(aes = guide_xxx(...))
.plotlyOutput()
gains a new fill
parameter. When TRUE
(the default), the widget’s container element is allowed to grow/shrink to fit it’s parent container so long as that parent is opinionated about its height and has been marked with htmltools::bindFillRole(x, container = TRUE)
. (#2198)
bslib::card_body_fill()
ggplotly()
now supports the {ggalluvial}
package. (#2061, thanks @moutikabdessabour)highlight()
now supports on="plotly_selecting"
, enabling client-side linked brushing via mouse click+drag (no mouse-up event required, as with on="plotly_selected"
). (#1280)raster2uri()
supports nativeRaster objects. This enables nativeRaster support for the annotation_raster()
geom (#2174, @zeehio).ggplotly()
now converts stat_ecdf()
properly. (#2065)ggplotly()
now correctly handles geom_tile()
with no fill
aesthetic. (#2063)ggplotly()
now respects guide(aes = "none")
(e.g., guide(fill = "none")
) when constructing legend entries. (#2067)GGally::ggcorr()
via ggplotly()
. (#2012)map_color()
would throw an error on R 4.2 (#2131)ggplotly()
does not issue warnings with options(warnPartialMatchArgs = TRUE)
any longer. (#2046, thanks @bersbersbers)ggplotly()
does not issue warnings related to use of deprecated tidyr::gather_()
in internals. (#2125, thanks @simonpcouch)ggplotly()
now uses the layout.legend.title
(instead of layout.annotations
) plotly.js API to convert guides for discrete scales. (#1961)renderPlotly()
now uses Plotly.react()
(instead of Plotly.newPlot()
) to redraw when layout(transition = )
is specified. This makes it possible/easier to implement a smooth transitions when renderPlotly()
gets re-executed. (#2001)save_image()
and kaleido()
. See help(save_image, package = "plotly")
for installation info and example usage. (#1971)ggplotly()
now better positions axis titles for facet_wrap()
/facet_grid()
. (#1975)ggplotly()
with {crosstalk}
and {ggplot2}
v3.3.4 (#1952).highlight(selectize=T)
dropdowns are no longer rendered in Shiny (#1936).group_by.plotly()
now properly retains crosstalk information across {dplyr}
versions (#1920).ggplotly()
for the upcoming {ggplot2}
v3.3.4 release (#1952).name
and frames
when both attributes are specified. (#1903 and #1618).renderPlotly()
now works well with shiny::bindCache()
, meaning that plotly graphs can now be persistently cached in Shiny apps with renderPlotly(expr) %>% shiny::bindCache()
(#1879).
ggplotly()
now works well with the thematic package. That is, it can now correctly translate ggplot2 styling that derives from thematic. Note that, in order to use thematic’s auto theming in Shiny with ggplotly()
, you need shiny v1.5.0 (or higher) and htmlwidgets v1.5.2.9000 (or higher). Relatedly, if these versions are available, one may now also call getCurrentOutputInfo()
inside renderPlotly()
to get CSS styles of the output container (#1801 and #1802).
All HTTP requests are now retried upon failure (#1656, @jameslamb).
R linebreaks (\n
) in factor labels are now translated to HTML linebreaks (<br />
), too. Before, this conversion was only done for colums of type character. (#1700, @salim-b).
When R’s POSIXt
class is serialized to JSON, the time of day is now correctly preserved (in plotly.js expected 'yyyy-mm-dd HH:MM:SS.ssssss'
format). This should fix a whole host of issues where date-times were being rounded. (#1871, @FlukeAndFeather).
ggplotly()
now handles discrete axes of a facet_wrap
and facet_grid
correctly when there is only one category in panels > 1 (#1577 and #1720).
ggplotly()
now correctly accounts for linebreaks in tick label text when computing plot margins (#1791, @trekonom).
ggplotly()
now handles element_blank()
and factor()
labels in positional scales correctly (#1731 and #1772).
ggplotly()
now handles missing y
aesthetic in geom_errorbar()
(#1779, @trekonom).
This is minor patch release with a few minor bug fixes and updates test expectations in anticipation of new R 4.0 defaults.
ggplotly()
bug in axis tick translation (#1725, #1721).plot_mapbox()
now correctly defaults to a scattermapbox trace (unless z is present, then it defaults to choroplethmapbox) (#1707).ggplotly()
now correctly resolves overlapping axis tick text in coord_sf()
(#1673).toWebGL()
(#1569).treemap
and image
. The plotly.js release page has the full list of changes.add_image()
function was added to make it easier to create image traces via raster
objects.add_sf()
/geom_sf()
now correctly handle geometry columns that are named something other than "geometry"
(#1659).event_data()
gains support for the plotly_sunburstclick
event (#1648)renderPlotly()
(#1528).ggplotly()
now positions the x-axis in the last column of a facet_wrap()
properly (#1501).ggplotly()
now handles geom_hline()
/geom_vline()
correctly in conjunction with coord_flip()
(#1519).event_data()
now correctly relays the key
attribute for statistical traces (#1610).sunburst
, waterfall
, isosurface
.hovertemplate
attribute allows for finer-tuned control over tooltip text. See here for an example.title
is now deprecated (but still works). Instead, use title = list(text = "title")
. This change was made to support a new title placement API (e.g., title = list(text = "title", xanchor = "left")
). Note that these changes are relevant for layout.title
as well as layout.xaxis.title
/layout.yaxis.title
/etc.event
argument of the event_data()
function now supports the following events: plotly_selecting
, plotly_brushed
, plotly_brushing
, plotly_restyle
, plotly_legendclick
, plotly_legenddoubleclick
, plotly_clickannotation
, plotly_afterplot
, plotly_doubleclick
, plotly_deselect
, plotly_unhover
. For examples, see plotly_example("shiny", "event_data")
, plotly_example("shiny", "event_data_legends")
, and plotly_example("shiny", "event_data_annotation")
,event_register()
and event_unregister()
functions for declaring which events to transmit over the wire (i.e., from the browser to the shiny server). Events that are likely to have large overhead are not registered by default, so you’ll need to register these: plotly_selecting
, plotly_unhover
, plotly_restyle
, plotly_legendclick
, and plotly_legenddoubleclick
.priority
argument. By setting priority='event'
, the event
is treated like a true event: any reactive expression using the event
becomes invalidated (regardless of whether the input values has changed). For an example, see plotly_example("shiny", "event_priority")
.event_data()
function now relays the (official plotly.js) customdata
attribute in similar fashion to (unofficial) key
attribute (#1423). Run plotly_example("shiny", "event_data")
for an example.event_data("plotly_selected")
is no longer too eager to clear. That is, it is no longer set to NULL
when clicking on a plot after triggering the “plotly_selected” event (#1121) (#1122).orca()
function now supports conversion of much larger figures (#1322) and works without a mapbox api token (#1314).orca_serve()
function was added for efficient exporting of many plotly graphs. For examples, see help(orca_serve)
.orca()
function gains new arguments more_args
and ...
for finer control over the underlying system commands.ggplotly()
now respects horizontal alignment of ggplot2 titles (e.g., ggplotly(qplot(1:10) + ggtitle("A title") + theme(plot.title = element_text(hjust = 1)))
).saveRDS()
to save an object as an rds file and restore it on another machine with readRDS()
). Note this object is dynamically linked to JavaScript libraries, so one should take care to use consistent versions of plotly when serializing and unserializing (#1376).style()
function now supports “partial updates” (i.e. modification of a particular property of an object, rather than the entire object). For example, notice how the first plot retains the original marker shape (a square): p <- plot_ly(x = 1:10, y = 1:10, symbol = I(15)); subplot(style(p, marker.color = "red"), style(p, marker = list(color = "red")))
(#1342).method
argument of plotlyProxyInvoke()
gains support for a "reconfig"
method. This makes it possible to modify just the configuration of a plot in a shiny app. For an example use, see plotly_example("shiny", "event_data_annotation")
.plotly_example()
function will now attempt to open the source file(s) used to run the example. Set edit = FALSE
to prevent the source file(s) from opening.config()
.stroke
is specified, span
now defaults to I(1)
. This results in a slightly narrower default span for some trace types (e.g., box
, contour
), but it also ensures the stroke
is always visible when it’s relevant (e.g. plot_ly(x = 1:10, y = 1:10, stroke = I("black"))
), making for a more consistent overall default (#1507).config()
function no longer has a collaborate
argument.cloud
argument is now deprecated and will be removed in a future version. Use showSendToCloud
instead.ggplotly()
now translates title information to layout.title.text
(instead of layout.title
) and layout.title.font
(instead of layout.titlefont
)subplot()
now works much better with annotations, images, and shapes:
xref
/yref
references an x/y axis these references are bumped accordingly (#1181).xref
/yref
references paper coordinates, these coordinates are updated accordingly (#1332).subplot()
now repositions shapes with fixed height/width (i.e., xsizemode
/ysizemode
of "pixel"
) correctly (#1494).colorscale
attribute now correctly handles a wider range of input values (#1432, #1485)color
argument in plot_ly()
now uses an evenly spaced grid of values instead of quantiles (#1308).size
argument maps to marker.size
, it now converts to an array of appropriate length (#1479).color
and stroke
arguments now work as expected for trace types with fillcolor
but no fill
attribute (e.g. box
traces) (#1292).event_data()
for heatmaps with atomic vectors for x
/y
/z
is now correct (#1141).marker
objects (#1351).ggplotly()
colorbar would cause issues with hover behavior, which is now fixed (#1381).text
attribute is no longer collapsed to a string when hoveron='fills+points'
(#1448).layout.[x-y]axis.domain
is no longer supplied a default when layout.grid
is specified (#1427).api_create()
, layout attributes are no longer incorrectly src-ified, which was causing inconsistencies in local/remote rendering of ggplotly()
charts (#1197).plot_ly()
specific improvementsscattergl
to make it nearly feature complete with scatter
, localization of text rendering (i.e., international translations), and six new trace types (cone
, scatterpolar
, scatterpolargl
, splom
, table
, & violin
)! See here for a complete list of plotly.js-specific improvements.plot_ly()
, plot_mapbox()
, and plot_geo()
(via the new add_sf()
function). See this blog post for an overview.stroke
, strokes
, alpha_stroke
, span
, and spans
). For an overview, see the sf blog post linked to in the bullet point above and the new package demos (list all demos with demo(package = "plotly")
).ggplotly()
specific improvementsggplotly()
now supports conversion of ggplot2’s geom_sf()
.ggplotly()
about the relevant shiny output size via session$clientData
. This ensures ggplotly()
sizing is closer to ggplot2 sizing, even on window resize. For an example, run plotly_example("shiny", "ggplotly_sizing")
.TeX()
function may be used to flag a character vector as LaTeX (#375). Use the new mathjax
argument in config()
to specify either external (mathjax="cdn"
) or local (mathjax="local"
) MathJaX. If "cdn"
, mathjax is loaded externally (meaning an internet connection is needed for TeX rendering). If "local"
, the PLOTLY_MATHJAX_PATH environment variable must be set to the location (a local file path) of MathJax. IMPORTANT: plotly uses SVG-based mathjax rendering which doesn’t play nicely with HTML-based rendering (e.g., rmarkdown documents and shiny apps). To leverage both types of rendering, you must <iframe>
your plotly graph(s) into the larger document (see here for an rmarkdown example and here for a shiny example).persistent = TRUE
in highlight()
, but persistent = FALSE
(the default) is now recommended since it allows one to switch between persistent/transient selection in the browser, rather than at the command line.highlight()
function gains a debounce
argument for throttling the rate at which on
events may be fired. This is mainly useful for improving user experience when highlight(on = "plotly_hover")
and mousing over relevant markers at a rapid rate (#1277)partial_bundle()
function makes it easy to leverage partial bundles of plotly.js for reduced file sizes and faster render times.config()
function gains a locale
argument for easily changing localization defaults (#1270). This makes it possible localize date axes, and in some cases, modebar buttons (#1270).plot_geo()
function gains a offline
argument for rendering "scattergeo"
traces with or without an internet connection (#356). Leveraging this argument requires the new plotlyGeoAssets package.plotly_example("shiny", "async")
.ggplotly(NULL, "message")
and plotly_build(NULL, "message")
now returns htmltools::div("message")
, making it easier to relay messages in shiny when data isn’t yet ready to plot (#1116).animation_button()
function gains a label
argument, making it easier to control the label of an animation button generated through the frame
API (#1205).highlight_key()
function provides a wrapper around crosstalk::SharedData$new()
, making it easier to teach others how to leverage SharedData
objects with plotly and crosstalk.plot_ly()
specific changesname
attribute is now a “special plot_ly()
argument” and behaves similar to split
(it ensures a different trace for every unique value supplied). Although this leads to a breaking change (name
was previously appended to an automatically generated trace name), it leads to a more flexible and transparent API. Those that wish to have the old behavior back should provide relevant mappings to the name
attributes (e.g. plot_ly(mtcars, x = ~wt, y = ~mpg, color = ~factor(vs), name = "a")
should become plot_ly(mtcars, x = ~wt, y = ~mpg, color = ~factor(vs), name = ~paste(vs, "\na"))
)color
argument now maps to fillcolor
, making it much easier to use polygon fills to encode data values (e.g., choropleth maps). For backwards-compatibilty reasons, when color
maps to fillcolor
, alpha
defaults to 0.5 (instead of 1). For an example, plot_mapbox(mn_res, color = ~INDRESNAME)
or plot_mapbox(mn_res, split = ~INDRESNAME, color = ~AREA, showlegend = FALSE, stroke = I("black"))
.color
argument no longer automatically add "markers"
to the mode
attribute for scatter/scattergl trace types. Those who wish to have the old behavior back, should add "markers"
to the mode
explicity (e.g., change plot_ly(economics, x = ~pce, y = ~pop, color = ~as.numeric(date), mode = "lines")
to plot_ly(economics, x = ~pce, y = ~pop, color = ~as.numeric(date), mode = "lines+markers")
).size
argument now informs a default error_[x/y].width (and span
informs error_[x/y].thickness). Note you can override the default by specifying directly (e.g. plot_ly(x = 1:10, y = 1:10, size = I(10), error_x = list(value = 5, width = 0))
).layout.showlegend
now defaults to TRUE
for a single pie trace. This is a more sensible default and matches pure plotly.js behavior.automargin = TRUE
. The majority of the time this should make axis labels more readable, but may have un-intended consequences in some rare cases (#1252).elementId
field is no longer populated, which fixes the “Ignoring explicitly provided widget ID” warning in shiny applications (#985).ggplotly()
specific fixesheight
/width
that ggplotly()
assumes is now more consistently correct in various context, but it also now requires access to one of the following devices: Cairo::Cairo()
, png()
, or jpg()
.ggplotly()
was ignoring a specified height
/width
(#1190).ggplotly()
now uses fixed heights for facet strips meaning that their height is still correct after a window resize (#1265).plot_ly()
specific fixeslimits
argument of colorbar()
wasn’t being applied to line.color
/line.cmin
/line.cmax
(#1236).legendgroup
can now properly map data values (#1148).marker.size
) are now always based on the area when marker.sizemode='area'
(which is the default sizemode when using the size
argument). Previously, traces with one just one value supplied to marker.size
were being sized by their diameter (#1133).height
/width
via shiny reactive values, is now correct (#1068).add_*()
no longer inherits crosstalk::SharedData
key information when inherit = FALSE
(#1242).plotlyProxy()
and plotlyProxyInvoke()
functions. For examples, see plotly_example("shiny", "proxy_relayout")
and plotly_example("shiny", "proxy_mapbox")
. Closes #580.plotly_example()
function to make it easier to run shiny/rmarkdown examples included with the package under the inst/examples
directory.schema()
function now returns the plot schema (rather just printing it), making it easier to acquire/use values from the official plot schema. See help(schema)
for an example. Fixes #1038.ggplotly()
is no longer fixed to the device size inside RStudio. Fixes #1033.ArrayBuffer.isView()
, which should fix rendering issues on plaforms that don’t have a typed array polyfill (e.g., RStudio on Windows). Fixes #1055.event_data("plotly_relayout")
no longer fires NULL
for any event. Fixes #1039.color
with scattermapbox/scattergeo. Fixes #1038.marker.color
as an array. Fixes #1084.coord_equal()
, coord_fixed()
, coord_map()
, coord_quickmap()
).geom_sf()
and coord_sf()
.group2NA()
function is now exported and its performance has been greatly improved thanks to the new data.table dependency. Essentially any geom conversion that reduces to a polygon/path should see speed improvements. Similarly, any plot_ly()
graph that use group_by()
in conjunction with add_lines()
, add_paths()
, add_segments()
, etc will also see improvements, especially when there is a large number of groups. For details on the speed improvements, see #1022 and #996 (thanks @msummersgill).api_create()
function gains a new fileopt
argument, which is inspired from the fileopt
argument in the (deprecated) plotly_POST()
function (fixes #976). It currently supports to values: "new"
and "overwrite"
. The default, "overwrite"
, will overwrite existing file(s) with a matching filename
.filename
argument in api_create()
now accepts a character vector of length 2, the first string is used to name the plot, and the second is used to name the grid (i.e., data behind the plot).traces
argument in the style()
function now defaults to NULL
(instead of 1). Meaning that, by default, supplied attributes now modify every trace (instead of the first one).coord_flip()
(fixes #1012).api_create()
), both the plot and the data behind the plot are private (fixes #976).api_create()
) no longer creates multiple grids (fixes #1004).api_create()
function should now create grid references for all data array attributes (fixes #1014).ggplotly()
no longer opens an (off-screen) graphics device in RStudio for sizing. It will now correctly use the size of the viewer panel when querying the size of the graphics device.NULL
for pie charts (fixes #1002)demo(package = "plotly")
. For a more comprehensive overview, see https://plotly-r.com/client-side-linking.html. For some more complex examples, see https://pedestrians.cpsievert.me/highlight()
function for configuring selection modes/sequences/options.help(animation)
. For a more thorough overview, see https://plotly-r.com/animating-views.htmlframe
argument to plot_ly()
for creating animations. Also added the animation_opts()
, animation_slider()
, and animation_button()
functions for configuring animation defaults.plotly_POST()
and get_figure()
functions obsolete (use api_create()
and api_download_plot()
instead), and thus, are now deprecated, but remain around for backwards-compatibility. For more details, see help(api)
.ggplotly()
: GeomCol
, GeomRug
, GeomCrossbar
, GeomQuantile
, GeomSpoke
, GeomDotplot
, GeomRasterAnn
(i.e., annotation_raster()
), and GeomAnnotationMap
(i.e., annotation_map()
).raster2uri()
which makes it easier to embed raster objects as images via data URIs. For examples, see help(raster2uri)
.ggplotly()
gains a new argument, dynamicTicks
, which allows axis ticks to update upon zoom/pan interactions (fixes #485).plot_dendro()
function for a quick and dirty interactive dendrogram with support for hierarchial selection. For more, see – https://plotly-r.com/client-side-linking.html#fig:dendroexport()
function gains a selenium
argument for rendering/exporting WebGL plots and exporting to ‘svg’/‘webp’ file formats (via the plotly.js function Plotly.downloadImage()).legendgroup
(see #675, #817, #826).plotlyOutput()
function gains a inline
argument which makes it easier to place multiple plots in the same row (in a shiny application).ggplotly()
now applies format()
to automatically generated hoverinfo. This will allow for finer control over the text displayed (for instance, options(digits = 4)
can now be used to choose the number of significant digits used). See #834 for an example.HTMLwidgets.renderValue()
should now avoid creating too many active WebGL contexts (thanks @AleksandrIanevski).remove_typedarray_polyfill()
was added to make it easy to remove it. Fixes #824, #717, #825.ggplotly()
now tries to open/close a Cairo graphics device, then a bitmap (png/jpeg) device. If neither is available, it errors. This helps to ensure that a screen device is never opened by ggplotly()
(which fixes #829). Furthermore, if width
/height
is not specified and no graphics device is currently open, a default of 640/480 is used for width/height of the device.geom_bar()
, geom_histogram()
, geom_col()
). Fixes #560, #874, #901, #831.geom_bar()
via ggplotly()
. Fixes #557 and #662.embed_notebook()
now works in nteract notebooks (see #768).ggplotly()
). Fixes #804.ggplotly()
). Fixes #861.timezone
argument in ggplot2’s scale_datetime()
. Fixes (#743, thanks @earowang).p
, do config(p, modeBarButtonsToRemove = "Collaborate")
layout()
is now deprecated. Specify in ggplotly()
or plot_ly()
.ggplotly()
function now preserves all information about the layer mapping. This makes it possible to access input/output data from any layer.layout.width
/layout.height
.height
/width
are specified in ggplotly()
, relative sizes are now translated correctly. Fixes #489 and #510.ggplotly()
on a plot with geom_line
and group
aesthetic wrong tooltip information was shown. Fixes #774.colors
argument.colorbar()
function gains a new limits
arguments for controlling the colorscale limits.z
is now required in add_heatmap()
. If you want a z
to be computed, use add_histogram()
.split
, replaces the old functionality of the now deprecated group
argument by creating one trace per value.subplot()
without a specified color (once again) match the coloring defaults supplied by plotly.js (see #724).subplot()
colorbar()
function now works on colorbars generated via z
mapping.plot_mapbox()
and plot_geo()
functions, which make it easier to work with the “scattermapbox”, “scattergeo”, and “choropleth” trace types. See the maps chapter of the plotly book for some examples – https://plotly-r.com/maps.htmlsubplot()
now accepts, and correctly scales mapbox objects.add_mesh3d()
and add_pie()
functions as wrappers around the “mesh3d”, and “pie” trace types.add_scattergeo()
and add_choropleth()
functions have been deprecated in favor of plot_geo()
.add_area(...)
function changed it’s meaning from add_lines(..., fill = 'tozeroy')
to a wrapper around the area trace https://plotly.com/r/reference/#area. This is more consistent with the naming conventions already in place for other add_()
functions.add_ribbons()
now shows points (instead of fill) on hover.rangeslider()
function to make it easier to add a range slider to the x-axis.colorbar()
function to make it easier to modify an automatically generated colorbar.plot_ly(mpg, x = ~cty, y = ~hwy, symbol = ~factor(cyl), color = ~factor(cyl))
)inherit
argument for all add_()
functions to avoid inheriting attributes from plot_ly()
.add_fun()
function to add layers to a plot without modifying the original data associated with a plotly object.add_annotations()
function to make it easier to add annotations.layerData
argument to ggplotly()
to make it possible to retrieve the data from a particular ggplot2 layer.marker.line.color
is now transparent by default.marker.colorbar
.add_choropleth()
previously wasn’t relaying the z
attribute.add_segments()
(resulting in incorrect axis category order).plot_ly()
when the number of traces is a multiple of ten.event_data()
now works inside shiny modules (#659). For an example, see https://github.com/plotly/plotly.R/tree/master/inst/examples/shiny/event_data_modulesadd_bars()
.as_widget()
function was exported to make it easier to convert a list (adhering to the plotly spec) to a plotly htmlwidget object. This should only be needed when “manually” editing the underlying list object.plotlyOutput()
. In order to make this possible, ggplotly()
now has a method for plotly objects (the identity function), and ggplotly()
called on any expression provided to plotlyOutput()
.geom_text()
.last_plot()
can now be used to retrieve the most recently printed plotly graph. Thanks to this new feature, when plotly_POST()
is called with no plotly object supplied, the most recently printed plotly graph is sent to the users plotly account.colors
/symbols
/linetypes
arguments now accept named character vectors. The names specify the domain (i.e., data values) and the values specify the range (i.e., visual encodings). This is mainly useful to ensure a particular (discrete) data value is mapped to a particular visual attribute (yes, this is similar, in spirit, to ggplot2’s scale_*_manual()
).scales::shape_pal()
and scales::linetype_pal()
.color
/symbol
/linetype
, domain values are sorted alphabetically before scales are applied. Also, when mapping a factor to color
/symbol
/linetype
, domain values are sorted according to their factor levels before scales are applied. This leads to more consistent (categorical axis ordering behaves similarly) and predictable (compared to having values sorted in the order in which they appear) behavior.alpha
is now applied when color
isn’t specified (fixes #658).plot_ly()
now orders the categories of a discrete x/y axis according the level ordering (if a factor) or alphabetical order (if a character string). Fixes #578.ggplotly()
gains a new originalData
argument which allows one to attach either the original (global) data, or a “scaled”/“trained” version of the data used by ggplot2 to draw the graph (for a quick example, ggplotly(qplot(1:10), originalData = FALSE) %>% plotly_data()
).geom_polygon()
/geom_hex()
/geom_rect()
/geom_map()
).stat_identity()
is used, group domain values are preserved and displayed in hoverinfo.hide_guides()
/hide_legend()
were added (these work similarly to the existing hide_colorbar()
) to simply the hiding of guides (i.e., legends/colorbars).facet_wrap()
should now be correct.plot_ly(mtcars, x = wt, y = mpg, color = vs)
should now be plot_ly(mtcars, x = ~wt, y = ~mpg, color = ~vs)
. This is a major breaking change, but it is necessary to ensure that evaluation is correct in all contexts (as a result, evaluate
argument is now deprecated as it is no longer needed). It also has the benefit of being easier to program with (i.e., writing your own custom functions that wrap plot_ly()
) since it preserves referential transparency. For more details, see the lazyeval vignetteas.widget()
function has deprecated, and serialization/memory leak problems are no longer an issue. This change also implies that arbitrary data manipulation functions can no longer be intermingled inside a plot pipeline, but plotly methods for dplyr’s data manipulation verbs are now provided (see ?plotly_data
for examples).group
variable mapping no longer create multiple traces, but instead defines “gaps” within a trace (fixes #418, #381, #577). Groupings should be declared via the new group_by()
function (see help(plotly_data)
for examples) instead of the group
argument (which is now deprecated).plot_ly()
now initializes a plotly object (i.e., won’t add a scatter trace by default), meaning that something like plot_ly(x = 1:10, y = 1:10) %>% add_trace(y = 10:1)
creates one trace, instead of two. That being said, if you manually specify a trace type in plot_ly()
, it will add a layer with that trace type (e.g. plot_ly(x = 1:10, y = 1:10, type = "scatter") %>% add_trace(y = 10:1)
draws two scatter traces). If no trace type is provided, a sensible type is inferred from the supplied data, and automatically added (i.e., plot_ly(x = rnorm(100))
now creates a histogram).inherit
argument is deprecated. Any arguments/attributes specified in plot_ly()
will automatically be passed along to additional traces added via add_trace()
(or any of it’s add_*()
siblings).color
, symbol
, size
) is applied at the plot-level, instead of the trace level.linetype
/linetypes
arguments for mapping discrete variables to line types (works very much like the symbol
/symbols
).I()
(closes #428). This is mainly useful for changing default appearance (e.g. plot_ly(x = 1:10, y = 1:10, color = I("red"))
).pch
and lty
values (e.g. plot_ly(x = 1:25, y = 1:25, symbol = I(0:24))
)alpha
argument controls the alpha transparency of color
(e.g. plot_ly(x = 1:10, y = 1:10, color = I("red"), alpha = 0.1)
).sizes
argument for controlling the range of marker size scaling.add_polygons()
/add_ribbons()
/add_area()
/add_segments()
/add_lines()
/add_markers()
/add_paths()
/add_text()
functions provide a shorthand for common special cases of add_trace()
.toWebGL()
function for easy conversion from SVG to WebGL.export()
function makes it easy to save plots as png/jpeg/pdf (fixes #311).plotly_data()
function for returning/inspecting data frame(s) associated with a plotly object.plotly_json()
function for inspecting the data sent to plotly.js (as an R list or JSON).layout()
is now a generic function and uses method dispatch to avoid conflicts with graphics::layout()
(fixes #464).3.6.5 – 10 June 2016
IMPROVEMENT:
Multiple rows of facet strips will now be separated by
(i.e., line breaks) instead of ,. See #593.
3.6.4 – 31 May 2016
BUG FIX:
embed_notebook() will no longer use a ‘.embed’ extension in the iframe src attribute. See #613.
3.6.3 – 24 May 2016
CHANGES:
Provided a better way of reexporting magrittr::%>%
. See #597.
3.6.2 – 24 May 2016
CHANGES:
Removed unnecessary plyr dependency.
3.6.1 – 23 May 2016
BUG FIX:
Add a default method for plotly_build. Fixes #592.
3.6.0 – 16 May 2016
NEW FEATURES & CHANGES:
vignette("subplot")
.BUG FIX:
Column facet strips will no longer be drawn when there is only one column.
3.5.7 – 13 May 2016
CHANGES:
Better defaults for defaultWidth/defaultHeight in the htmlwidget’s sizing policy.
BUG FIX:
Pass knitr options to the named argument options. Fixes #582.
3.5.6 – 12 May 2016
BUG FIX:
Use .embed suffix in iframe src attribute. Fixes #581.
3.5.5 – 5 May 2016
CHANGES:
ggplotly() will now use plotly’s layout.axisid.title (instead of layout.annotations) for axis titles on non-faceted plots. This will make for a better title placement experience (see #510).
BUG FIX:
Space for interior facet_wrap() strips are now accounted for.
3.5.4 – 5 May 2016
BUG FIX:
gg2list() now returns an object of class “plotly_built” instead of “plotly” to ensure a sensible print method is invoked.
3.5.3 – 3 May 2016
CHANGES:
Upgrade to plotlyjs v1.10.1 – https://github.com/plotly/plotly.js/releases/tag/v1.10.1
3.5.2 – 2 May 2016
BUG FIX:
Added missing key properties in ggplotly() converter so selections can be accessible via event_data().
3.5.1 – 26 Apr 2016
CHANGES:
Upgrade to plotlyjs v1.10.0 – https://github.com/plotly/plotly.js/releases/tag/v1.10.0
Distinguish between “built” (plotly_built) and “non-built” (plotly_hash) plotly objects. See #562
3.5.0 – 19 Apr 2016
NEW FEATURES:
The toRGB() function will now respect alpha channels in hex color codes and can recursively apply alpha.
CHANGES:
The toRGB() function will always output color codes with an alpha channel (e.g. toRGB(‘black’) is now ‘rgba(0,0,0,1)’ instead of ‘rgb(0,0,0)’)
3.4.15 – 18 Apr 2016
BUGFIX:
The alpha in geom_smooth was incorrectly inheriting from other layers. See #551.
3.4.14 – 15 Apr 2016
CHANGES:
Upgrade to plotlyjs v1.9.0 – https://github.com/plotly/plotly.js/releases/tag/v1.9.0
3.4.13 – 6 Apr 2016
BUGFIX:
In some cases, marker color was inheriting from the marker line color when it shouldn’t have. See ##537.
3.4.12 – 5 Apr 2016
CHANGES:
Upgrade to plotlyjs v1.8.0 – https://github.com/plotly/plotly.js/releases/tag/v1.8.0
3.4.11 – 2 Apr 2016
BUGFIX:
Fix bug when altering modebar button defaults
3.4.10 – 1 Apr 2016
BUGFIX:
Fix a geom_errorbar bug introduced in 3.4.9. See #513.
3.4.9 – 25 Mar 2016
BUGFIX:
Upgrade to plotlyjs 1.7.0. Fixes #513
3.4.8 – 23 Mar 2016
BUGFIX:
3.4.7 – 19 Mar 2016
BUGFIX:
3.4.6 – 17 Mar 2016
NEW FEATURES:
The ‘plotly_relayout’ event is now accessible via the event_data() function.
Fixed #514.
3.4.5 – 17 Mar 2016
BUGFIX:
Fixed #514.
3.4.4 – 17 Mar 2016
BUGFIX:
Show discrete positional values in tooltip (see #515); better GeomTile conversion; pass plot object into layers2traces.
3.4.3 – 14 Mar 2016
BUGFIX:
Custom facet labeller functions will now translate correctly. See #507.
3.4.2 – 14 Mar 2016
BUGFIX:
Automatic resizing will now occur only when layout.autosize is true (the default). See #403.
3.4.1 – 13 Mar 2016
BUGFIX:
Legend titles are now supported.
3.4.0 – 12 Mar 2016
NEW FEATURES:
CHANGES:
BUGFIX:
3.3.1 – 10 Mar 2016
CHANGES:
BUGFIX:
3.2.1 – 10 Mar 2016
BUGFIX:
3.2.0 – 10 Mar 2016
CHANGES:
NEW FEATURES:
3.1.0 – 8 Mar 2016
CHANGES:
3.0.0 – 8 Mar 2016
NEW FEATURES:
CHANGES:
BUG FIXES:
2.5.0 – 1 Mar 2016
NEW FEATURES
New event_data() function provides easy access to plotly events in shiny. For an example, see https://github.com/ropensci/plotly/tree/master/inst/examples/plotlyEvents
plot_ly() and ggplotly() gain a source argument to differentiate between plotly events in shiny apps with multiple plots. ggplotly() also gains width and height arguments.
CHANGES
The arguments filename, fileopt, world_readable in ggplotly() were removed as they should be provided to plotly_POST() instead.
2.4.4 – 13 Feb 2016
as.widget() now returns htmlwidget objects untouched. See #449.
2.4.3 – 11 Feb 2016
Ensure that we always return HTTPS links. Fixes #455
2.4.2 – 9 Feb 2016
Fix for on-premise domain configuration.
2.4.1 – 2 Feb 2016
Attach base_url in as.widget() so it works in multiple contexts
2.4.0 – 1 Feb 2016
2.3.4 – 1 Feb 2016
Added a plotly_api_domain environment variable for configuring the API domain. Fixes #441
2.3.3 – 27 Jan 2016
Bump axis number for each trace matching a panel number. fixes #318
2.3.2 – 25 Jan 2016
More accurate list of data_array properties. Fixes #415
2.3.1 – 25 Jan 2016
More accurate conversion of path width. Fixes #373.
2.3.0 – 19 Jan 2016
Add sharing argument and deprecate world_readable. Fixes #332
2.2.4 – 18 Jan 2016
Fix for error in embed_notebook(). See #409.
2.2.3 – 18 Jan 2016
Fix for geom_vline(). See #402.
2.2.2 – 18 Jan 2016
Fix bar orientation when we detect geom_bar() + coord_flip() in ggplotly(). Fixes #390.
2.2.1 – 18 Jan 2016
Search for axis title in scene object. fixes #393.
2.2.0 – 13 Jan 2016
The default for layout.hovermode is now ‘closest’ for non-line scatter traces
2.1.3 – 12 Jan 2016
Fix size and alpha translation for geom_point. Fixes #386
2.1.2 – 11 Jan 2016
Upgraded to plotlyjs 1.4.1. For a list of changes, see https://github.com/plotly/plotly.js/releases/tag/v1.4.1
2.1.1 – 11 Jan 2016
Upgraded to plotlyjs 1.4. For a list of changes, see https://github.com/plotly/plotly.js/releases/tag/v1.4.0
2.1.0 – 29 Dec 2015
plot_ly() now defaults to inherit=FALSE and plotly_build() is now idempotent. Fixes #280 and #277. See #368 for details.
2.0.19 – 23 Dec 2015
Added as.widget() function for conveniency in converting plotly object to htmlwidget objects. See #294.
2.0.18 – 22 Dec 2015
Fix #365
2.0.17 – 22 Dec 2015
Fix #358
2.0.16 – 18 Dec 2015
Require ggplot2 2.0.0 or higher. For details, see #269.
2.0.15 – 13 Dec 2015
Fix #346
2.0.14 – 13 Dec 2015
Fix #212
2.0.13 – 12 Dec 2015
Fix #286
2.0.12 – 11 Dec 2015
Fix #221
2.0.11 – 11 Dec 2015
Fix #250
2.0.10 – 10 Dec 2015
Fix #225
2.0.9 – 10 Dec 2015
Fix #333
2.0.8 – 10 Dec 2015
Fix a bug with geom_segment (see #321 & #228)
2.0.7 – 10 Dec 2015
Fix #233
2.0.6 – 2 Dec 2015
Upgrade to plotlyjs 1.1.1. Fixes #319.
2.0.5 – 1 Dec 2015
Fix for legend names. See #236.
2.0.4 – 28 Nov 2015
Fix #313.
2.0.3 – 18 Nov 2015
Fixed bug causing knitr options to be ignored. Also added VignetteBuilder to DESCRIPTION to vignette is available.
2.0.2 – 17 Nov 2015
Using plotly_build() on a ggplot object should always return a plotly object
2.0.1 – 17 Nov 2015
Better printing of server figures. Documentation and other fixes for initial CRAN release!
2.0.0 – 2 Nov 2015
Added a dependency on htmlwidgets and ‘offline’ plots are now the default. If you want to create a figure on a plotly server, you need to use plotly_POST()
. Also added a config()
function to control the default appearance of the interactive plot
1.0.10 – 3 Nov 2015
Fixed #292.
1.0.9 – 28 Sep 2015
Fixed filename, fileopt arguments in plot_ly. Specifying the same filename will now overwrite the plot if it exists.
1.0.8 – 14 Sep 2015
Added the plotly_IMAGES() function which interfaces to the images endpoint https://api.plot.ly/v2/#images
Details -> https://github.com/ropensci/plotly/pull/279
1.0.7 – 26 Aug 2015
See https://github.com/ropensci/plotly/pull/275
1.0.6 – 25 Aug 2015
Fix a bug with subplot domain calculations (see https://github.com/ropensci/plotly/pull/274)
1.0.5 – 20 Aug 2015
Fix issue converting plotly offline markdown documents to HTML when using markdown::markdownToHTML
1.0.4 – 14 Aug 2015
Bug fix for subplot. See #265
1.0.3 – 7 Aug 2015
Improved legend positioning. See #241
1.0.2 – 2 Aug 2015
1.0.1 – 2 Aug 2015
Removed the stream() function as it wasn’t ready to be included.
1.0.0 – 31 July 2015
A major reworking of package internals which includes a few backwards incompatible changes.
Major changes include:
plot_ly()
, add_trace()
, layout()
, and style()
functions).subplot()
function for putting several graphs on a single page.renderPlotly()
and plotlyOutput()
functions for embedding plotly graphs in shiny applications.offline()
function for creating standalone HTML pages via Plotly Offline (see http://purchasing.plot.ly/)For more details, see the new vignettes with browseVignettes(package = "plotly")
and/or the pull request -> https://github.com/ropensci/plotly/pull/226
0.6.3 – 2 June 2015
Add new tests inspired by the R Cookbook distributions #214
0.6.2 – 19 May 2015
In geom_bar(stat = “identity”), sum y values if multiple for a given x.
0.6.1 – 5 May 2015
Add test-cookbook-lines.R and fix bugs that showed up in those tests.
0.6 – 4 May 2015
Let gg2list() return a figure object (backwards incompatible change).
0.5.29 – 16 April 2015
geom_density() as filled area chart #202
0.5.28 – 15 April 2015
Let ggplot handle histogram binning. Fix #198
0.5.27 – 19 Mar 2015
Reimplement geom_ribbon as a basic polygon. Fix #191. Fix #192.
0.5.26 – 18 Mar 2015
Implemented geom_rect #178
0.5.25 – 10 March 2015
Implemented geom_smooth() #183
0.5.24 – 10 March 2015
Implemented facet_wrap(scales=“free”) #167
0.5.23 – 10 March 2015.
geom_ribbon() now respects alpha transparency
0.5.22 – 2 March 2015.
Fixes for ylim() #171.
0.5.21 – 23 February 2015.
Fixes for error bars and tick marks.
0.5.20 – 9 February 2015.
Add alpha transparency to fill conversion. Let geom_area support colour and fill aesthetics.
0.5.19 – 23 January 2015.
Support class conversion such as as.Date() within ggplot code.
0.5.18 – 22 January 2015.
Return proper filepath when filename contains directories.
0.5.17 – 30 December 2014.
Support date-time binning in histograms.
0.5.16 – 29 December 2014.
Support colour aesthetic in geom_text().
0.5.15 – 19 December 2014.
Use proper RCurlOptions in get_figure() method.
0.5.14 – 1 December 2014.
Make layers geom_line + geom_point only one trace in Plotly.
0.5.13 – 27 November 2014.
Rename translation file and server endpoint parameter to be hip.
0.5.12 – 12 November 2014.
Improve legend title position.
0.5.11 – 11 November 2014.
Show legend title.
0.5.10 – 7 November 2014.
Improve showlegend and fix legend’s x
position.
0.5.9 – 3 November 2014.
Default colours for geom_polygon().
0.5.8 – 30 October 2014.
Support hline over a factor x range. Default colours for geom_boxplot().
0.5.7 – 29 October 2014.
Default colours for geom_area() and geom_ribbon().
0.5.6 – 28 October 2014.
Convert line size faithfully.
0.5.5 – 24 October 2014.
Support category histograms (with factors).
0.5.4 – 22 October 2014.
Support conversion of geom_vline().
0.5.3 – 21 October 2014.
Support conversion of geom_bar() with position_dodge().
0.5.2 – 18 October 2014.
Support aesthetic shape in geom_path() and, hence, geom_line() (conversion).
0.5.1 – 15 October 2014.
Do not show zero lines by default (as in ggplot2 plots).
0.5.0 – 15 October 2014.
From now on, version numbers are meaningful again… Many changes meanwhile, especially support for more geoms.
0.4 – 7 April 2014.
Re-write geom to trace conversion code.
0.3.8 – 21 March 2014.
ggplotly takes the last_plot() by default.
Support for ggplotly layout elements title, tickcolor, gridcolor, showlegend, plot_bgcolor, paper_bgcolor, tickangle, axis titles, plot border colors.
0.3.7 – 14 March 2014.
For ggplotly:
if on the command line, open a web browser (as before).
if in knitr/Rmd in a chunk with plotly=TRUE, embed the plot.
0.3.6 – 10 March 2014.
Merge ggplotly code.
0.3.5