diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 764 |
1 files changed, 764 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..06c6d6c --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,764 @@ +/*! + +# Plotters - A Rust drawing library focus on data plotting for both WASM and native applications 🦀📈🚀 + +<a href="https://crates.io/crates/plotters"> + <img style="display: inline!important" src="https://img.shields.io/crates/v/plotters.svg"></img> +</a> +<a href="https://docs.rs/plotters"> + <img style="display: inline!important" src="https://docs.rs/plotters/badge.svg"></img> +</a> +<a href="https://plotters-rs.github.io/rustdoc/plotters/"> + <img style="display: inline! important" src="https://img.shields.io/badge/docs-development-lightgrey.svg"></img> +</a> +<a href="https://travis-ci.org/38/plotters"> + <img style="display: inline! important" src="https://travis-ci.org/38/plotters.svg?branch=master"></img> +</a> +<a href="https://codecov.io/gh/38/plotters"> + <img style="display: inline! important" src="https://codecov.io/gh/38/plotters/branch/master/graph/badge.svg" /> +</a> + +Plotters is drawing library designed for rendering figures, plots, and charts, in pure rust. Plotters supports various types of back-ends, +including bitmap, vector graph, piston window, GTK/Cairo and WebAssembly. + +- A new Plotters Developer's Guide is working in progress. The preview version is available at [here](https://plotters-rs.github.io/book). +- To try Plotters with interactive Jupyter notebook, or view [here](https://plotters-rs.github.io/plotters-doc-data/evcxr-jupyter-integration.html) for the static HTML version. +- To view the WASM example, go to this [link](https://plumberserver.com/plotters-wasm-demo/index.html) +- Currently we have all the internal code ready for console plotting, but a console based backend is still not ready. See [this example](https://github.com/38/plotters/blob/master/examples/console.rs) for how to plotting on Console with a customized backend. + +## Gallery + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/sample.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/sample.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Multiple Plot + <a href="https://github.com/38/plotters/blob/master/examples/chart.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/stock.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/stock.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Candlestick Plot + <a href="https://github.com/38/plotters/blob/master/examples/stock.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/histogram.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/histogram.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Histogram + <a href="https://github.com/38/plotters/blob/master/examples/histogram.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/0.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/0.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Simple Chart + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/console-2.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/console-2.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Plotting the Console + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/mandelbrot.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/mandelbrot.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Mandelbrot set + <a href="https://github.com/38/plotters/blob/master/examples/mandelbrot.rs">[code]</a> + </div> +</div> + + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/evcxr_animation.gif"> + <img src="https://plotters-rs.github.io/plotters-doc-data/evcxr_animation.gif" class="galleryItem"></img> + </a> + <div class="galleryText"> + Jupyter Support + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/plotters-piston.gif"> + <img src="https://plotters-rs.github.io/plotters-doc-data/plotters-piston.gif" class="galleryItem"></img> + </a> + <div class="galleryText"> + Real-time Rendering + <a href="https://github.com/38/plotters/tree/master/examples/piston-demo">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/normal-dist.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/normal-dist.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Histogram with Scatter + <a href="https://github.com/38/plotters/blob/master/examples/normal-dist.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/twoscale.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/twoscale.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Dual Y-Axis Example + <a href="https://github.com/38/plotters/blob/master/examples/two-scales.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/matshow.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/matshow.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + The Matplotlib Matshow Example + <a href="https://github.com/38/plotters/blob/master/examples/matshow.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/sierpinski.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/sierpinski.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + The Sierpinski Carpet + <a href="https://github.com/38/plotters/blob/master/examples/sierpinski.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/normal-dist2.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/normal-dist2.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + The 1D Gaussian Distribution + <a href="https://github.com/38/plotters/blob/master/examples/nomal-dist2.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/errorbar.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/errorbar.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + The 1D Gaussian Distribution + <a href="https://github.com/38/plotters/blob/master/examples/errorbar.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/slc-temp.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/slc-temp.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Monthly Time Coordinate + <a href="https://github.com/38/plotters/blob/master/examples/slc-temp.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/area-chart.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/area-chart.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Monthly Time Coordinate + <a href="https://github.com/38/plotters/blob/master/examples/area-chart.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/snowflake.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/snowflake.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Koch Snowflake + <a href="https://github.com/38/plotters/blob/master/examples/snowflake.rs">[code]</a> + </div> +</div> + + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/animation.gif"> + <img src="https://plotters-rs.github.io/plotters-doc-data/animation.gif" class="galleryItem"></img> + </a> + <div class="galleryText"> + Koch Snowflake Animation + <a href="https://github.com/38/plotters/blob/master/examples/animation.rs">[code]</a> + </div> +</div> + + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/console.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/console.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Drawing on a Console + <a href="https://github.com/38/plotters/blob/master/examples/console.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/blit-bitmap.png"> + <img src="https://plotters-rs.github.io/plotters-doc-data/blit-bitmap.png" class="galleryItem"></img> + </a> + <div class="galleryText"> + Drawing bitmap on chart + <a href="https://github.com/38/plotters/blob/master/examples/blit-bitmap.rs">[code]</a> + </div> +</div> + +<div class="galleryItem"> + <a href="https://plotters-rs.github.io/plotters-doc-data/boxplot.svg"> + <img src="https://plotters-rs.github.io/plotters-doc-data/boxplot.svg" class="galleryItem"></img> + </a> + <div class="galleryText"> + Drawing bitmap on chart + <a href="https://github.com/38/plotters/blob/master/examples/boxplot.rs">[code]</a> + </div> +</div> + + +## Table of Contents + * [Gallery](#gallery) + * [Quick Start](#quick-start) + * [Trying with Jupyter evcxr Kernel Interactively](#trying-with-jupyter-evcxr-kernel-interactively) + * [Interactive Tutorial with Jupyter Notebook](#interactive-tutorial-with-jupyter-notebook) + * [Plotting in Rust](#plotting-in-rust) + * [Plotting on HTML5 canvas with WASM Backend](#plotting-on-html5-canvas-with-wasm-backend) + * [What types of figure are supported?](#what-types-of-figure-are-supported) + * [Concepts by examples](#concepts-by-examples) + + [Drawing Back-ends](#drawing-backends) + + [Drawing Area](#drawing-area) + + [Elements](#elements) + + [Composable Elements](#composable-elements) + + [Chart Context](#chart-context) + * [Misc](#misc) + + [Development Version](#development-version) + + [Reducing Depending Libraries && Turning Off Backends](#reducing-depending-libraries--turning-off-backends) + + [List of Features](#list-of-features) + * [FAQ List](#faq-list) + +## Quick Start + +To use Plotters, you can simply add Plotters into your `Cargo.toml` +```toml +[dependencies] +plotters = "^0.2.15" +``` + +And the following code draws a quadratic function. `src/main.rs`, + +```rust +use plotters::prelude::*; +fn main() -> Result<(), Box<dyn std::error::Error>> { + let root = BitMapBackend::new("plotters-doc-data/0.png", (640, 480)).into_drawing_area(); + root.fill(&WHITE)?; + let mut chart = ChartBuilder::on(&root) + .caption("y=x^2", ("sans-serif", 50).into_font()) + .margin(5) + .x_label_area_size(30) + .y_label_area_size(30) + .build_ranged(-1f32..1f32, -0.1f32..1f32)?; + + chart.configure_mesh().draw()?; + + chart + .draw_series(LineSeries::new( + (-50..=50).map(|x| x as f32 / 50.0).map(|x| (x, x * x)), + &RED, + ))? + .label("y = x^2") + .legend(|(x, y)| PathElement::new(vec![(x, y), (x + 20, y)], &RED)); + + chart + .configure_series_labels() + .background_style(&WHITE.mix(0.8)) + .border_style(&BLACK) + .draw()?; + + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/0.png) + + +## Trying with Jupyter evcxr Kernel Interactively + +Plotters now supports integrate with `evcxr` and is able to interactively drawing plots in Jupyter Notebook. +The feature `evcxr` should be enabled when including Plotters to Jupyter Notebook. + +The following code shows a minimal example of this. + +```text +:dep plotters = { git = "https://github.com/38/plotters", default_features = false, features = ["evcxr"] } +extern crate plotters; +use plotters::prelude::*; + +let figure = evcxr_figure((640, 480), |root| { + root.fill(&WHITE); + let mut chart = ChartBuilder::on(&root) + .caption("y=x^2", ("Arial", 50).into_font()) + .margin(5) + .x_label_area_size(30) + .y_label_area_size(30) + .build_ranged(-1f32..1f32, -0.1f32..1f32)?; + + chart.configure_mesh().draw()?; + + chart.draw_series(LineSeries::new( + (-50..=50).map(|x| x as f32 / 50.0).map(|x| (x, x * x)), + &RED, + )).unwrap() + .label("y = x^2") + .legend(|(x,y)| PathElement::new(vec![(x,y), (x + 20,y)], &RED)); + + chart.configure_series_labels() + .background_style(&WHITE.mix(0.8)) + .border_style(&BLACK) + .draw()?; + Ok(()) +}); +figure +``` + +<img src="https://plotters-rs.github.io/plotters-doc-data/evcxr_animation.gif" width="450px"></img> + +## Interactive Tutorial with Jupyter Notebook + +*This tutorial is now working in progress and isn't complete* + +Thanks to the evcxr, now we have an interactive tutorial for Plotters! +To use the interactive notebook, you must have Jupyter and evcxr installed on your computer. +Follow the instruction on [this page](https://github.com/google/evcxr/tree/master/evcxr_jupyter) below to install it. + +After that, you should be able to start your Jupyter server locally and load the tutorial! + +```bash +git clone https://github.com/38/plotters-doc-data +cd plotteres-doc-data +jupyter notebook +``` + +And select the notebook called `evcxr-jupyter-integration.ipynb`. + +Also, there's a static HTML version of this notebook available at the [this location](https://plumberserver.com/plotters-docs/evcxr-jupyter-integration.html) + +## Plotting in Rust + +Rust is a perfect language for data visualization. Although there are many mature visualization libraries in many different languages. +But Rust is one of the best languages fits the need. + +* **Easy to use** Rust has a very good iterator system built into the standard library. With the help of iterators, +Plotting in Rust can be as easy as most of the high-level programming languages. The Rust based plotting library +can be very easy to use. + +* **Fast** If you need rendering a figure with trillions of data points, +Rust is a good choice. Rust's performance allows you to combine data processing step +and rendering step into a single application. When plotting in high-level programming languages, +e.g. Javascript or Python, data points must be down-sampled before feeding into the plotting +program because of the performance considerations. Rust is fast enough to do the data processing and visualization +within a single program. You can also integrate the +figure rendering code into your application handling a huge amount of data and visualize it in real-time. + +* **WebAssembly Support** Rust is one of few the language with the best WASM support. Plotting in Rust could be +very useful for visualization on a web page and would have a huge performance improvement comparing to Javascript. + +## Plotting on HTML5 canvas with WASM Backend + +Plotters currently supports backend that uses the HTML5 canvas. To use the WASM support, you can simply use +`CanvasBackend` instead of other backend and all other API remains the same! + +There's a small demo for Plotters + WASM under `examples/wasm-demo` directory of this repo. +To play with the deployed version, follow this [link](https://plumberserver.com/plotters-wasm-demo/index.html). + + +## What types of figure are supported? + +Plotters is not limited to any specific type of figure. +You can create your own types of figures easily with the Plotters API. + +But Plotters provides some builtin figure types for convenience. +Currently, we support line series, point series, candlestick series, and histogram. +And the library is designed to be able to render multiple figure into a single image. +But Plotter is aimed to be a platform that is fully extendable to support any other types of figure. + +## Concepts by examples + +### Drawing Back-ends +Plotters can use different drawing back-ends, including SVG, BitMap, and even real-time rendering. For example, a bitmap drawing backend. + +```rust +use plotters::prelude::*; +fn main() -> Result<(), Box<dyn std::error::Error>> { + // Create a 800*600 bitmap and start drawing + let mut backend = BitMapBackend::new("plotters-doc-data/1.png", (300, 200)); + // And if we want SVG backend + // let backend = SVGBackend::new("output.svg", (800, 600)); + backend.draw_rect((50, 50), (200, 150), &RED, true)?; + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/1.png) + +### Drawing Area +Plotters uses a concept called drawing area for layout purpose. +Plotters support multiple integrating into a single image. +This is done by creating sub-drawing-areas. + +Besides that, the drawing area also allows the customized coordinate system, by doing so, the coordinate mapping is done by the drawing area automatically. + +```rust +use plotters::prelude::*; +fn main() -> Result<(), Box<dyn std::error::Error>> { + let root_drawing_area = + BitMapBackend::new("plotters-doc-data/2.png", (300, 200)).into_drawing_area(); + // And we can split the drawing area into 3x3 grid + let child_drawing_areas = root_drawing_area.split_evenly((3, 3)); + // Then we fill the drawing area with different color + for (area, color) in child_drawing_areas.into_iter().zip(0..) { + area.fill(&Palette99::pick(color))?; + } + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/2.png) + +### Elements + +In Plotters, elements are build blocks of figures. All elements are able to draw on a drawing area. +There are different types of built-in elements, like lines, texts, circles, etc. +You can also define your own element in the application code. + +You may also combine existing elements to build a complex element. + +To learn more about the element system, please read the [element module documentation](./element/index.html). + +```rust +use plotters::prelude::*; +fn main() -> Result<(), Box<dyn std::error::Error>> { + let root = BitMapBackend::new("plotters-doc-data/3.png", (300, 200)).into_drawing_area(); + root.fill(&WHITE)?; + // Draw an circle on the drawing area + root.draw(&Circle::new( + (100, 100), + 50, + Into::<ShapeStyle>::into(&GREEN).filled(), + ))?; + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/3.png) + +### Composable Elements + +Besides the built-in elements, elements can be composed into a logic group we called composed elements. +When composing new elements, the upper-left corner is given in the target coordinate, and a new pixel-based +coordinate which has the upper-left corner defined as `(0,0)` is used for further element composition purpose. + +For example, we can have an element which includes a dot and its coordinate. + +```rust +use plotters::prelude::*; + +fn main() -> Result<(), Box<dyn std::error::Error>> { + let root = BitMapBackend::new("plotters-doc-data/4.png", (640, 480)).into_drawing_area(); + + root.fill(&RGBColor(240, 200, 200))?; + + let root = root.apply_coord_spec(RangedCoord::<RangedCoordf32, RangedCoordf32>::new( + 0f32..1f32, + 0f32..1f32, + (0..640, 0..480), + )); + + let dot_and_label = |x: f32, y: f32| { + return EmptyElement::at((x, y)) + + Circle::new((0, 0), 3, ShapeStyle::from(&BLACK).filled()) + + Text::new( + format!("({:.2},{:.2})", x, y), + (10, 0), + ("sans-serif", 15.0).into_font(), + ); + }; + + root.draw(&dot_and_label(0.5, 0.6))?; + root.draw(&dot_and_label(0.25, 0.33))?; + root.draw(&dot_and_label(0.8, 0.8))?; + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/4.png) + +### Chart Context + +In order to draw a chart, Plotters need a data object built on top of the drawing area called `ChartContext`. +The chart context defines even higher level constructs compare to the drawing area. +For example, you can define the label areas, meshes, and put a data series onto the drawing area with the help +of the chart context object. + +```rust +use plotters::prelude::*; +fn main() -> Result<(), Box<dyn std::error::Error>> { + let root = BitMapBackend::new("plotters-doc-data/5.png", (640, 480)).into_drawing_area(); + root.fill(&WHITE); + let root = root.margin(10, 10, 10, 10); + // After this point, we should be able to draw construct a chart context + let mut chart = ChartBuilder::on(&root) + // Set the caption of the chart + .caption("This is our first plot", ("sans-serif", 40).into_font()) + // Set the size of the label region + .x_label_area_size(20) + .y_label_area_size(40) + // Finally attach a coordinate on the drawing area and make a chart context + .build_ranged(0f32..10f32, 0f32..10f32)?; + + // Then we can draw a mesh + chart + .configure_mesh() + // We can customize the maximum number of labels allowed for each axis + .x_labels(5) + .y_labels(5) + // We can also change the format of the label text + .y_label_formatter(&|x| format!("{:.3}", x)) + .draw()?; + + // And we can draw something in the drawing area + chart.draw_series(LineSeries::new( + vec![(0.0, 0.0), (5.0, 5.0), (8.0, 7.0)], + &RED, + ))?; + // Similarly, we can draw point series + chart.draw_series(PointSeries::of_element( + vec![(0.0, 0.0), (5.0, 5.0), (8.0, 7.0)], + 5, + &RED, + &|c, s, st| { + return EmptyElement::at(c) // We want to construct a composed element on-the-fly + + Circle::new((0,0),s,st.filled()) // At this point, the new pixel coordinate is established + + Text::new(format!("{:?}", c), (10, 0), ("sans-serif", 10).into_font()); + }, + ))?; + Ok(()) +} +``` + +![](https://plotters-rs.github.io/plotters-doc-data/5.png) + +## Misc + +### Development Version + +To use the latest development version, pull https://github.com/38/plotters.git. In `Cargo.toml` + +```toml +[dependencies] +plotters = { git = "https://github.com/38/plotters.git" } +``` + +### Reducing Depending Libraries && Turning Off Backends +Plotters now supports use features to control the backend dependencies. By default, `BitMapBackend` and `SVGBackend` are supported, +use `default_features = false` in the dependency description in `Cargo.toml` and you can cherry-pick the backend implementations. + +- `svg` Enable the `SVGBackend` +- `bitmap` Enable the `BitMapBackend` + +For example, the following dependency description would avoid compiling with bitmap support: + +```toml +[dependencies] +plotters = { git = "https://github.com/38/plotters.git", default_features = false, features = ["svg"] } +``` + +The library also allows consumers to make use of the [`Palette`](https://crates.io/crates/palette/) crate's color types by default. +This behavior can also be turned off by setting `default_features = false`. + +### List of Features + +This is the full list of features that is defined by `Plotters` crate. +Use `default_features = false` to disable those default enabled features, +and then you should be able to cherry-pick what features you want to include into `Plotters` crate. +By doing so, you can minimize the number of dependencies down to only `itertools` and compile time is less than 6s. + +The following list is a complete list of features that can be opt in and out. + +- Drawing backends related features + +| Name | Description | Additional Dependency |Default?| +|---------|--------------|--------|------------| +| image\_encoder | Allow `BitMapBackend` save the result to bitmap files | image, rusttype, font-kit | Yes | +| svg | Enable `SVGBackend` Support | None | Yes | +| gif\_backend| Opt-in GIF animation Rendering support for `BitMapBackend`, implies `bitmap` enabled | gif | Yes | +| piston | Enable `PistonWindowBackend` | piston\_window, rusttype, font-kit | No | +| cairo | Enable `CairoBackend` | cairo-rs, rusttype, font-kit | No | + +- Font manipulation features + +| Name | Description | Additional Dependency |Default?| +|---------|--------------|--------|------------| +| ttf | Allows TrueType font support | rusttype, font-kit | Yes | + +- Coordinate features + +| Name | Description | Additional Dependency |Default?| +|---------|--------------|--------|------------| +| datetime | Eanble the date and time coordinate support | chrono | Yes | + +- Element, series and util functions + +| Name | Description | Additional Dependency |Default?| +|---------|--------------|--------|------------| +| errorbar | The errorbar element support | None | Yes | +| candlestick | The candlestick element support | None | Yes | +| boxplot | The boxplot element support | None | Yes | +| area\_series | The area series support | None | Yes | +| line\_series | The line series support | None | Yes | +| histogram | The histogram series support | None | Yes | +| point\_series| The point series support | None | Yes | + +- Misc + +| Name | Description | Additional Dependency |Default?| +|---------|--------------|--------|------------| +| deprecated\_items | This feature allows use of deprecated items which is going to be removed in the future | None | Yes | +| debug | Enable the code used for debugging | None | No | + + +## FAQ List + +* Why does the WASM example break on my machine ? + + The WASM example requires using `wasm32` target to build. Using `cargo build` is likely to use the default target + which in most of the case is any of the x86 target. Thus you need add `--target=wasm32-unknown-unknown` in the cargo + parameter list to build it. + +* How to draw text/circle/point/rectangle/... on the top of chart ? + + As you may realized, Plotters is a drawing library rather than a traditional data plotting library, + you have the freedom to draw anything you want on the drawing area. + Use `DrawingArea::draw` to draw any element on the drawing area. + + +<style> + img { + display: block; + margin: 0 auto; + max-width: 500px; + } + .galleryItem { + width: 250px; + display: inline-block; + } + .galleryImg { + max-width: 100%; + } + .galleryText { + text-align: center; + } +</style> + + +*/ +pub mod chart; +pub mod coord; +pub mod data; +pub mod drawing; +pub mod element; +pub mod series; +pub mod style; + +#[cfg(feature = "evcxr")] +pub mod evcxr; + +#[cfg(test)] +pub use crate::drawing::create_mocked_drawing_area; + +#[cfg(feature = "palette_ext")] +pub use palette; + +/// The module imports the most commonly used types and modules in Plotters +pub mod prelude { + pub use crate::chart::{ChartBuilder, ChartContext, LabelAreaPosition, SeriesLabelPosition}; + pub use crate::coord::{ + Category, CoordTranslate, GroupBy, IntoCentric, IntoPartialAxis, LogCoord, LogRange, + LogScalable, Ranged, RangedCoord, RangedCoordf32, RangedCoordf64, RangedCoordi32, + RangedCoordi64, RangedCoordu32, RangedCoordu64, ToGroupByRange, + }; + + #[cfg(feature = "chrono")] + pub use crate::coord::{make_partial_axis, RangedDate, RangedDateTime, RangedDuration}; + + pub use crate::drawing::*; + #[cfg(feature = "area_series")] + pub use crate::series::AreaSeries; + #[cfg(feature = "histogram")] + pub use crate::series::Histogram; + #[cfg(feature = "line_series")] + pub use crate::series::LineSeries; + #[cfg(feature = "point_series")] + pub use crate::series::PointSeries; + + pub use crate::style::{ + AsRelative, Color, FontDesc, FontFamily, FontStyle, FontTransform, HSLColor, IntoFont, + Palette, Palette100, Palette99, Palette9999, PaletteColor, RGBColor, ShapeStyle, + SimpleColor, TextStyle, + }; + pub use crate::style::{BLACK, BLUE, CYAN, GREEN, MAGENTA, RED, TRANSPARENT, WHITE, YELLOW}; + + pub use crate::element::{ + Circle, Cross, DynElement, EmptyElement, IntoDynElement, MultiLineText, PathElement, Pixel, + Polygon, Rectangle, Text, TriangleMarker, + }; + + #[cfg(feature = "boxplot")] + pub use crate::element::Boxplot; + #[cfg(feature = "candlestick")] + pub use crate::element::CandleStick; + #[cfg(feature = "errorbar")] + pub use crate::element::ErrorBar; + + #[cfg(feature = "bitmap")] + pub use crate::element::BitMapElement; + + pub use crate::data::Quartiles; + + // TODO: This should be deprecated and completely removed + #[cfg(feature = "deprecated_items")] + #[allow(deprecated)] + pub use crate::element::Path; + + #[allow(type_alias_bounds)] + /// The type used to returns a drawing operation that can be failed + /// - `T`: The return type + /// - `D`: The drawing backend type + pub type DrawResult<T, D: DrawingBackend> = + Result<T, crate::drawing::DrawingAreaErrorKind<D::ErrorType>>; + + #[cfg(feature = "evcxr")] + pub use crate::evcxr::evcxr_figure; +} |