diff --git a/CHANGELOG.md b/CHANGELOG.md index b645edc1..bc20c273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.9.1] - 2024-09-06 +## [0.10.0] - 2024-09-16 +### Added +- [[#231](https://github.com/plotly/plotly.rs/pull/231)] Added new `plotly_embed_js` feature to reduce binary sizes by not embedding `plotly.min.js` in the library unless explicitly enabled via the feature flag. Deprecates `use_local_plotly` in favor of explicit opt-in via the feature flag and introduce method `use_cdn_plotly` to allow users to use CDN version even behind the `plotly_embed_js` feature flag. + +### Fixed +- [[#230](https://github.com/plotly/plotly.rs/pull/230)] Make Bar chart `width` and `offset` use `f64` values. + +## [0.10.0] - 2024-09-06 ### Added - [[#217](https://github.com/plotly/plotly.rs/pull/217)] Added show_html(filename) method to bypass situations where accessing default `/tmp` is not possible, e.g., with in SNAP Firefox - [[#227](https://github.com/plotly/plotly.rs/pull/227)] Switch from HTML template render from `askama` to `rinja` diff --git a/README.md b/README.md index 64a46609..4849b39b 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -plotly = "0.9.1" +plotly = "0.10.0" ``` ## Exporting an Interactive Plot @@ -78,12 +78,12 @@ plot.add_trace(trace); plot.write_html("out.html"); ``` -By default, the Plotly JavaScript library will be included via CDN, which results in a smaller filesize, but slightly slower first load as the JavaScript library has to be downloaded first. To instead embed the JavaScript library (several megabytes in size) directly into the HTML file, the following can be done: +By default, the Plotly JavaScript library will be included via CDN, which results in a smaller filesize, but slightly slower first load as the JavaScript library has to be downloaded first. To instead embed the JavaScript library (several megabytes in size) directly into the HTML file, the library must be compiled with the feature flag `plotly_embed_js`. Once enabled, by default the JavaScript library is directly embedded in the generated HTML file. It is still possible to use the CDN version, by using the `use_cdn_plotly` method. ```rust // <-- Create a `Plot` --> -plot.use_local_plotly(); +plot.use_cdn_plotly(); plot.write_html("out.html"); ``` @@ -103,7 +103,7 @@ To save a plot as a static image, the `kaleido` feature is required: # Cargo.toml [dependencies] -plotly = { version = "0.9.1", features = ["kaleido"] } +plotly = { version = "0.10.0", features = ["kaleido"] } ``` With this feature enabled, plots can be saved as any of `png`, `jpeg`, `webp`, `svg`, `pdf` and `eps`. Note that the plot will be a static image, i.e. they will be non-interactive. @@ -130,7 +130,7 @@ Using `Plotly.rs` in a Wasm-based frontend framework is possible by enabling the # Cargo.toml [dependencies] -plotly = { version = "0.9.1", features = ["wasm"] } +plotly = { version = "0.10.0", features = ["wasm"] } ``` First, make sure that you have the Plotly JavaScript library in your base HTML template: @@ -201,6 +201,16 @@ Adds trait implementations so that `image::RgbImage` and `image::RgbaImage` can Adds support for creating plots directly using [ndarray](https://github.com/rust-ndarray/ndarray) types. +### `plotly_embed_js` + +By default, the CDN version of `plotly.js` is used in the library and in the generated HTML files. This feature can be used to opt in for embedding `plotly.min.js` in the generated HTML files. The benefit is that the plot will load faster in the browser. + +However, there are two downsides of using this feature flag, one is that the resulting html will be much larger, as a copy of the `plotly.min.js` library is embedded in each HTML file. The second, more relevant, is that a copy of the `plotly.min.js` library needs to be compiled in the `plotly-rs` library itself which increases the size by approx `3.5 Mb`. + +When the feature is enabled, users can still opt in for the CDN version by using the method `use_cdn_plotly`. + +Note that when using `Plot::to_inline_html()`, it is assumed that the `plotly.js` library is already in scope within the HTML file, so enabling this feature flag will have no effect. + ### `wasm` Enables compilation for the `wasm32-unknown-unknown` target and provides access to a `bindings` module containing wrappers around functions exported by the plotly.js library. diff --git a/docs/book/src/getting_started.md b/docs/book/src/getting_started.md index e0a069f3..f6d3a37e 100644 --- a/docs/book/src/getting_started.md +++ b/docs/book/src/getting_started.md @@ -22,7 +22,7 @@ To start using [plotly.rs](https://github.com/plotly/plotly.rs) in your project ```toml [dependencies] -plotly = "0.9.1" +plotly = "0.10.0" ``` [Plotly.rs](https://github.com/plotly/plotly.rs) is ultimately a thin wrapper around the `plotly.js` library. The main job of this library is to provide `structs` and `enums` which get serialized to `json` and passed to the `plotly.js` library to actually do the heavy lifting. As such, if you are familiar with `plotly.js` or its derivatives (e.g. the equivalent Python library), then you should find [`plotly.rs`](https://github.com/plotly/plotly.rs) intuitive to use. @@ -97,7 +97,7 @@ To add the ability to save plots in the following formats: png, jpeg, webp, svg, ```toml [dependencies] -plotly = { version = "0.9.1", features = ["kaleido"] } +plotly = { version = "0.10.0", features = ["kaleido"] } ``` ## WebAssembly Support diff --git a/plotly/Cargo.toml b/plotly/Cargo.toml index 6f8cf593..553a3a7d 100644 --- a/plotly/Cargo.toml +++ b/plotly/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "plotly" -version = "0.9.1" +version = "0.10.0" description = "A plotting library powered by Plotly.js" authors = ["Ioannis Giagkiozis "] license = "MIT" @@ -17,6 +17,7 @@ exclude = ["target/*"] kaleido = ["plotly_kaleido"] plotly_ndarray = ["ndarray"] plotly_image = ["image"] +plotly_embed_js = [] wasm = ["getrandom", "js-sys", "wasm-bindgen", "wasm-bindgen-futures"] with-axum = ["rinja/with-axum", "rinja_axum"] @@ -28,8 +29,8 @@ erased-serde = "0.4" getrandom = { version = "0.2", features = ["js"], optional = true } image = { version = "0.25", optional = true } js-sys = { version = "0.3", optional = true } -plotly_derive = { version = "0.9.1", path = "../plotly_derive" } -plotly_kaleido = { version = "0.9.1", path = "../plotly_kaleido", optional = true } +plotly_derive = { version = "0.10.0", path = "../plotly_derive" } +plotly_kaleido = { version = "0.10.0", path = "../plotly_kaleido", optional = true } ndarray = { version = "0.16.0", optional = true } once_cell = "1" serde = { version = "1.0.132", features = ["derive"] } @@ -46,5 +47,5 @@ image = "0.25" itertools = ">=0.10, <0.14" itertools-num = "0.1.3" ndarray = "0.16.0" -plotly_kaleido = { version = "0.9.1", path = "../plotly_kaleido" } +plotly_kaleido = { version = "0.10.0", path = "../plotly_kaleido" } rand_distr = "0.4" diff --git a/plotly/src/plot.rs b/plotly/src/plot.rs index 716fa784..1936b1c6 100644 --- a/plotly/src/plot.rs +++ b/plotly/src/plot.rs @@ -15,7 +15,7 @@ use crate::{Configuration, Layout}; #[template(path = "plot.html", escape = "none")] struct PlotTemplate<'a> { plot: &'a Plot, - remote_plotly_js: bool, + plotly_js_source: String, } #[derive(Template)] @@ -24,7 +24,7 @@ struct PlotTemplate<'a> { struct StaticPlotTemplate<'a> { plot: &'a Plot, format: ImageFormat, - remote_plotly_js: bool, + plotly_js_source: String, width: usize, height: usize, } @@ -182,7 +182,7 @@ pub struct Plot { #[serde(rename = "config")] configuration: Configuration, #[serde(skip)] - remote_plotly_js: bool, + plotly_js_source: String, } impl Plot { @@ -190,21 +190,18 @@ impl Plot { pub fn new() -> Plot { Plot { traces: Traces::new(), - remote_plotly_js: true, + plotly_js_source: Self::plotly_js_source(), ..Default::default() } } - /// This option results in the plotly.js library being written directly in - /// the html output. The benefit is that the plot will load faster in - /// the browser and the downside is that the resulting html will be much - /// larger. - /// - /// Note that when using `Plot::to_inline_html()`, it is assumed that the - /// `plotly.js` library is already in scope, so setting this attribute - /// will have no effect. - pub fn use_local_plotly(&mut self) { - self.remote_plotly_js = false; + /// Switch to CDN `plotly.js` in the generated HTML instead of the default + /// local `plotly.js` version. Method is only available when the feature + /// `plotly_embed_js` is enabled since without this feature the default + /// version used is always the CDN version. + #[cfg(feature = "plotly_embed_js")] + pub fn use_cdn_plotly(&mut self) { + self.plotly_js_source = Self::cdn_plotly_js(); } /// Add a `Trace` to the `Plot`. @@ -422,7 +419,7 @@ impl Plot { fn render(&self) -> String { let tmpl = PlotTemplate { plot: self, - remote_plotly_js: self.remote_plotly_js, + plotly_js_source: self.plotly_js_source.clone(), }; tmpl.render().unwrap() } @@ -432,7 +429,7 @@ impl Plot { let tmpl = StaticPlotTemplate { plot: self, format, - remote_plotly_js: self.remote_plotly_js, + plotly_js_source: self.plotly_js_source.clone(), width, height, }; @@ -447,6 +444,23 @@ impl Plot { tmpl.render().unwrap() } + fn plotly_js_source() -> String { + if cfg!(feature = "plotly_embed_js") { + Self::local_plotly_js() + } else { + Self::cdn_plotly_js() + } + } + + fn local_plotly_js() -> String { + let local_plotly = include_str!("../templates/plotly.min.js"); + format!("", local_plotly).to_string() + } + + fn cdn_plotly_js() -> String { + r##""##.to_string() + } + pub fn to_json(&self) -> String { serde_json::to_string(self).unwrap() } diff --git a/plotly/src/traces/bar.rs b/plotly/src/traces/bar.rs index 0acaed0d..92ccc0b5 100644 --- a/plotly/src/traces/bar.rs +++ b/plotly/src/traces/bar.rs @@ -55,8 +55,8 @@ where legend_group_title: Option, opacity: Option, ids: Option>, - width: Option, - offset: Option>, + width: Option, + offset: Option>, text: Option>, #[serde(rename = "textposition")] text_position: Option>, @@ -162,8 +162,8 @@ mod tests { .legend_group_title("legend-group-title") .marker(Marker::new()) .name("Bar") - .offset(5) - .offset_array(vec![5, 5]) + .offset(5.0) + .offset_array(vec![5.0, 5.0]) .offset_group("offset_group") .opacity(0.5) .orientation(Orientation::Vertical) @@ -178,7 +178,7 @@ mod tests { .text_template("text_template") .text_template_array(vec!["text_template"]) .visible(Visible::LegendOnly) - .width(999) + .width(999.0) .x_axis("xaxis") .x_calendar(Calendar::Nanakshahi) .y_axis("yaxis") @@ -197,8 +197,8 @@ mod tests { "legendgrouptitle": {"text": "legend-group-title"}, "opacity": 0.5, "ids": ["1"], - "width": 999, - "offset": [5, 5], + "width": 999.0, + "offset": [5.0, 5.0], "text": ["text"], "textposition": ["none"], "texttemplate": ["text_template"], diff --git a/plotly/templates/plot.html b/plotly/templates/plot.html index a5236ac7..22b8e0b4 100644 --- a/plotly/templates/plot.html +++ b/plotly/templates/plot.html @@ -8,11 +8,8 @@
- {% if remote_plotly_js -%} - - {% else -%} - - {% endif -%} + + {{plotly_js_source}}
diff --git a/plotly/templates/static_plot.html b/plotly/templates/static_plot.html index c5631596..4586ad1d 100644 --- a/plotly/templates/static_plot.html +++ b/plotly/templates/static_plot.html @@ -6,11 +6,8 @@
- {% if remote_plotly_js -%} - - {% else -%} - - {% endif -%} + + {{plotly_js_source}} @@ -33,4 +30,4 @@
- \ No newline at end of file + diff --git a/plotly_derive/Cargo.toml b/plotly_derive/Cargo.toml index 61266795..25814d2a 100644 --- a/plotly_derive/Cargo.toml +++ b/plotly_derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "plotly_derive" -version = "0.9.1" +version = "0.10.0" description = "Internal proc macro crate for Plotly-rs." authors = ["Ioannis Giagkiozis "] license = "MIT" diff --git a/plotly_kaleido/Cargo.toml b/plotly_kaleido/Cargo.toml index 5819edbc..544fde05 100644 --- a/plotly_kaleido/Cargo.toml +++ b/plotly_kaleido/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "plotly_kaleido" -version = "0.9.1" +version = "0.10.0" description = "Additional output format support for plotly using Kaleido" authors = ["Ioannis Giagkiozis "] license = "MIT"