pub struct SankeyDiagram { /* private fields */ }Expand description
A structure representing a Sankey diagram.
The SankeyDiagram struct enables the creation of Sankey diagrams, which visualize flows
between discrete nodes with link widths proportional to the magnitude of the flow. It
offers extensive configuration options for flow orientation, node arrangement, spacing,
thickness, and coloring, as well as axis and title customization. Users can specify a
single uniform color or per-item colors for both nodes and links, adjust padding between
nodes, set node thickness, and supply custom titles and axis labels to produce clear,
publication-quality flow visualizations. Faceting support allows creating multiple Sankey
diagrams in a grid layout for comparing flows across categories.
§Arguments
data– A reference to theDataFramecontaining the data to be plotted.sources– A string slice naming the column indatathat contains the source node for each flow.targets– A string slice naming the column indatathat contains the target node for each flow.values– A string slice naming the column indatathat contains the numeric value of each flow.facet– An optional string slice naming the column indatato be used for creating facets (small multiples).facet_config– An optional reference to aFacetConfigstruct for customizing facet layout and behavior.orientation– An optionalOrientationenum to set the overall direction of the diagram (e.g.Orientation::HorizontalorOrientation::Vertical).arrangement– An optionalArrangementenum to choose the node-layout algorithm (e.g.Arrangement::Snap,Arrangement::Perpendicular, etc.).pad– An optionalusizespecifying the padding (in pixels) between adjacent nodes.thickness– An optionalusizedefining the uniform thickness (in pixels) of all nodes.node_color– An optionalRgbvalue to apply a single uniform color to every node.node_colors– An optionalVec<Rgb>supplying individual colors for each node in order.link_color– An optionalRgbvalue to apply a single uniform color to every link.link_colors– An optionalVec<Rgb>supplying individual colors for each link in order.plot_title– An optionalTextstruct for setting the overall title of the plot.legend_title– An optionalTextstruct specifying the title of the legend.legend– An optional reference to aLegendstruct for customizing the legend of the plot.
§Example
use plotlars::{Arrangement, SankeyDiagram, Orientation, Plot, Rgb, Text};
use polars::prelude::*;
let dataset = LazyCsvReader::new(PlRefPath::new("data/sankey_flow.csv"))
.finish()
.unwrap()
.collect()
.unwrap();
SankeyDiagram::builder()
.data(&dataset)
.sources("source")
.targets("target")
.values("value")
.orientation(Orientation::Horizontal)
.arrangement(Arrangement::Freeform)
.node_colors(vec![
Rgb(222, 235, 247),
Rgb(198, 219, 239),
Rgb(158, 202, 225),
Rgb(107, 174, 214),
Rgb( 66, 146, 198),
Rgb( 33, 113, 181),
])
.link_colors(vec![
Rgb(222, 235, 247),
Rgb(198, 219, 239),
Rgb(158, 202, 225),
Rgb(107, 174, 214),
Rgb( 66, 146, 198),
Rgb( 33, 113, 181),
])
.pad(20)
.thickness(30)
.plot_title(
Text::from("Sankey Diagram")
.font("Arial")
.size(18)
)
.build()
.plot();
Implementations§
Source§impl SankeyDiagram
impl SankeyDiagram
Sourcepub fn builder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7>() -> SankeyDiagramBuilder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7>
pub fn builder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7>() -> SankeyDiagramBuilder<'f1, 'f2, 'f3, 'f4, 'f5, 'f6, 'f7>
Examples found in repository?
examples/sankeydiagram.rs (line 11)
4fn main() {
5 let dataset = LazyCsvReader::new(PlRefPath::new("data/sankey_flow.csv"))
6 .finish()
7 .unwrap()
8 .collect()
9 .unwrap();
10
11 SankeyDiagram::builder()
12 .data(&dataset)
13 .sources("source")
14 .targets("target")
15 .values("value")
16 .orientation(Orientation::Horizontal)
17 .arrangement(Arrangement::Freeform)
18 .node_colors(vec![
19 Rgb(222, 235, 247),
20 Rgb(198, 219, 239),
21 Rgb(158, 202, 225),
22 Rgb(107, 174, 214),
23 Rgb(66, 146, 198),
24 Rgb(33, 113, 181),
25 ])
26 .link_colors(vec![
27 Rgb(222, 235, 247),
28 Rgb(198, 219, 239),
29 Rgb(158, 202, 225),
30 Rgb(107, 174, 214),
31 Rgb(66, 146, 198),
32 Rgb(33, 113, 181),
33 ])
34 .pad(20)
35 .thickness(30)
36 .plot_title(Text::from("Sankey Diagram").font("Arial").size(18))
37 .build()
38 .plot();
39}More examples
examples/faceting.rs (line 461)
428fn sankeydiagram_example() {
429 let dataset = CsvReadOptions::default()
430 .with_has_header(true)
431 .try_into_reader_with_file_path(Some("data/energy_transition.csv".into()))
432 .unwrap()
433 .finish()
434 .unwrap();
435
436 let facet_config = FacetConfig::new()
437 .cols(4)
438 .h_gap(0.06)
439 .title_style(Text::from("").size(11).color(Rgb(50, 50, 50)));
440
441 let node_colors = vec![
442 Rgb(64, 64, 64),
443 Rgb(100, 149, 237),
444 Rgb(139, 69, 19),
445 Rgb(255, 195, 0),
446 Rgb(135, 206, 250),
447 Rgb(65, 105, 225),
448 Rgb(220, 20, 60),
449 Rgb(34, 139, 34),
450 ];
451
452 let link_colors = vec![
453 Rgb(220, 220, 220),
454 Rgb(200, 220, 245),
455 Rgb(220, 200, 180),
456 Rgb(255, 240, 200),
457 Rgb(220, 240, 255),
458 Rgb(200, 220, 240),
459 ];
460
461 SankeyDiagram::builder()
462 .data(&dataset)
463 .sources("source")
464 .targets("target")
465 .values("value")
466 .facet("year")
467 .facet_config(&facet_config)
468 .node_colors(node_colors)
469 .link_colors(link_colors)
470 .arrangement(Arrangement::Perpendicular)
471 .plot_title(
472 Text::from("Energy Transition Timeline (2020-2023)")
473 .font("Arial")
474 .size(16),
475 )
476 .pad(18)
477 .thickness(22)
478 .build()
479 .plot();
480}examples/subplot_grid.rs (line 312)
248fn mixed_grid_example() {
249 // 2D cartesian scatter (baseline)
250 let penguins = LazyCsvReader::new(PlRefPath::new("data/penguins.csv"))
251 .finish()
252 .unwrap()
253 .collect()
254 .unwrap()
255 .lazy()
256 .select([
257 col("species"),
258 col("bill_length_mm"),
259 col("flipper_length_mm"),
260 col("body_mass_g"),
261 ])
262 .collect()
263 .unwrap();
264
265 let scatter_2d = ScatterPlot::builder()
266 .data(&penguins)
267 .x("bill_length_mm")
268 .y("flipper_length_mm")
269 .group("species")
270 .opacity(0.65)
271 .size(10)
272 .plot_title(Text::from("Penguins 2D").y(1.3))
273 .build();
274
275 // 3D scene subplot
276 let scatter_3d = Scatter3dPlot::builder()
277 .data(&penguins)
278 .x("bill_length_mm")
279 .y("flipper_length_mm")
280 .z("body_mass_g")
281 .group("species")
282 .opacity(0.35)
283 .size(6)
284 .plot_title(Text::from("Penguins 3D").y(1.45))
285 .build();
286
287 // Polar subplot
288 let polar_df = LazyCsvReader::new(PlRefPath::new("data/product_comparison_polar.csv"))
289 .finish()
290 .unwrap()
291 .collect()
292 .unwrap();
293
294 let polar = ScatterPolar::builder()
295 .data(&polar_df)
296 .theta("angle")
297 .r("score")
298 .group("product")
299 .mode(Mode::LinesMarkers)
300 .size(10)
301 .plot_title(Text::from("Product Comparison (Polar)").y(1.5).x(0.72))
302 .legend(&Legend::new().x(0.8))
303 .build();
304
305 // Domain-based subplot (Sankey)
306 let sankey_df = LazyCsvReader::new(PlRefPath::new("data/energy_transition.csv"))
307 .finish()
308 .unwrap()
309 .collect()
310 .unwrap();
311
312 let sankey = SankeyDiagram::builder()
313 .data(&sankey_df)
314 .sources("source")
315 .targets("target")
316 .values("value")
317 .orientation(Orientation::Horizontal)
318 .arrangement(Arrangement::Freeform)
319 .plot_title(Text::from("Energy Flow").y(1.2))
320 .build();
321
322 // Mapbox subplot
323 let map_df = LazyCsvReader::new(PlRefPath::new("data/cities.csv"))
324 .finish()
325 .unwrap()
326 .collect()
327 .unwrap();
328
329 let scatter_map = ScatterMap::builder()
330 .data(&map_df)
331 .latitude("latitude")
332 .longitude("longitude")
333 .group("city")
334 .zoom(4)
335 .center([50.0, 5.0])
336 .opacity(0.8)
337 .plot_title(Text::from("Cities (Mapbox)").y(1.2))
338 .build();
339
340 // Geo subplot
341 let geo_df = LazyCsvReader::new(PlRefPath::new("data/world_cities.csv"))
342 .finish()
343 .unwrap()
344 .collect()
345 .unwrap();
346
347 let scatter_geo = ScatterGeo::builder()
348 .data(&geo_df)
349 .lat("lat")
350 .lon("lon")
351 .group("continent")
352 .mode(Mode::Markers)
353 .size(10)
354 .color(Rgb(255, 140, 0))
355 .shape(Shape::Circle)
356 .plot_title(Text::from("Global Cities (Geo)").x(0.65).y(1.2))
357 .legend(&Legend::new().x(0.8))
358 .build();
359
360 SubplotGrid::regular()
361 .plots(vec![
362 &scatter_2d,
363 &scatter_3d,
364 &polar,
365 &sankey,
366 &scatter_map,
367 &scatter_geo,
368 ])
369 .rows(2)
370 .cols(3)
371 .h_gap(0.12)
372 .v_gap(0.22)
373 .title(
374 Text::from("Mixed Subplot Grid")
375 .size(16)
376 .font("Arial bold")
377 .y(0.95),
378 )
379 .build()
380 .plot();
381}Trait Implementations§
Source§impl Clone for SankeyDiagram
impl Clone for SankeyDiagram
Source§fn clone(&self) -> SankeyDiagram
fn clone(&self) -> SankeyDiagram
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Serialize for SankeyDiagram
impl Serialize for SankeyDiagram
impl PlotHelper for SankeyDiagram
Auto Trait Implementations§
impl Freeze for SankeyDiagram
impl !RefUnwindSafe for SankeyDiagram
impl !Send for SankeyDiagram
impl !Sync for SankeyDiagram
impl Unpin for SankeyDiagram
impl UnsafeUnpin for SankeyDiagram
impl !UnwindSafe for SankeyDiagram
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more