@@ -7,6 +7,7 @@ use plotly::{
77 ColorScale , ColorScalePalette , DashType , Domain , Fill , Font , HoverInfo , Line , LineShape ,
88 Marker , Mode , Orientation , Pattern , PatternShape ,
99 } ,
10+ funnel:: Connector as FunnelConnector ,
1011 icicle:: {
1112 BranchValues as IcicleBranchValues , Leaf as IcicleLeaf , Marker as IcicleMarker ,
1213 PathBar as IciclePathBar , Side as IcicleSide , Tiling as IcicleTiling ,
@@ -31,8 +32,8 @@ use plotly::{
3132 } ,
3233 treemap:: { BranchValues , Marker as TreemapMarker , Packing , PathBar , Side , Tiling } ,
3334 waterfall:: { Marker as WaterfallMarker , Measure , MeasureStyle } ,
34- Bar , Icicle , Indicator , Parcats , Pie , Plot , Sankey , Scatter , ScatterPolar , Sunburst , Table ,
35- Treemap , Waterfall ,
35+ Bar , Funnel , Icicle , Indicator , Parcats , Pie , Plot , Sankey , Scatter , ScatterPolar , Sunburst ,
36+ Table , Treemap , Waterfall ,
3637} ;
3738use plotly_utils:: write_example_to_html;
3839use rand_distr:: { Distribution , Normal , Uniform } ;
@@ -812,6 +813,59 @@ fn bar_chart_with_pattern_fills(show: bool, file_name: &str) {
812813}
813814// ANCHOR_END: bar_chart_with_pattern_fills
814815
816+ // Funnel Charts
817+ // ANCHOR: basic_funnel
818+ fn basic_funnel ( show : bool , file_name : & str ) {
819+ let trace = Funnel :: new (
820+ vec ! [ 100 , 60 , 40 , 25 ] ,
821+ vec ! [ "Visits" , "Signups" , "Trials" , "Purchases" ] ,
822+ )
823+ . text_info ( "value+percent previous" )
824+ . connector ( FunnelConnector :: new ( ) . visible ( true ) )
825+ . marker ( Marker :: new ( ) . color ( NamedColor :: SteelBlue ) ) ;
826+
827+ let layout = Layout :: new ( ) . title ( "Conversion Funnel" ) ;
828+ let mut plot = Plot :: new ( ) ;
829+ plot. set_layout ( layout) ;
830+ plot. add_trace ( trace) ;
831+
832+ let path = write_example_to_html ( & plot, file_name) ;
833+ if show {
834+ plot. show_html ( path) ;
835+ }
836+ }
837+ // ANCHOR_END: basic_funnel
838+
839+ // Waterfall Charts
840+ // ANCHOR: basic_waterfall
841+ fn basic_waterfall ( show : bool , file_name : & str ) {
842+ let trace = Waterfall :: new (
843+ vec ! [ "Start" , "Revenue" , "Costs" , "End" ] ,
844+ vec ! [ 100.0 , 40.0 , -25.0 , 0.0 ] ,
845+ )
846+ . measure ( vec ! [
847+ Measure :: Absolute ,
848+ Measure :: Relative ,
849+ Measure :: Relative ,
850+ Measure :: Total ,
851+ ] )
852+ . text_info ( "label+delta" )
853+ . increasing ( MeasureStyle :: new ( ) . marker ( WaterfallMarker :: new ( ) . color ( NamedColor :: SeaGreen ) ) )
854+ . decreasing ( MeasureStyle :: new ( ) . marker ( WaterfallMarker :: new ( ) . color ( NamedColor :: Tomato ) ) )
855+ . totals ( MeasureStyle :: new ( ) . marker ( WaterfallMarker :: new ( ) . color ( NamedColor :: SteelBlue ) ) ) ;
856+
857+ let layout = Layout :: new ( ) . title ( "Basic Waterfall" ) ;
858+ let mut plot = Plot :: new ( ) ;
859+ plot. set_layout ( layout) ;
860+ plot. add_trace ( trace) ;
861+
862+ let path = write_example_to_html ( & plot, file_name) ;
863+ if show {
864+ plot. show_html ( path) ;
865+ }
866+ }
867+ // ANCHOR_END: basic_waterfall
868+
815869// Sankey Diagrams
816870// ANCHOR: basic_sankey_diagram
817871fn basic_sankey_diagram ( show : bool , file_name : & str ) {
@@ -1508,6 +1562,12 @@ fn main() {
15081562
15091563 bar_chart_with_pattern_fills ( false , "bar_chart_with_pattern_fills" ) ;
15101564
1565+ // Funnel Charts
1566+ basic_funnel ( true , "basic_funnel" ) ;
1567+
1568+ // Waterfall Charts
1569+ basic_waterfall ( true , "basic_waterfall" ) ;
1570+
15111571 // Sankey Diagrams
15121572 basic_sankey_diagram ( false , "basic_sankey_diagram" ) ;
15131573 custom_node_sankey_diagram ( false , "custom_node_sankey_diagram" ) ;
0 commit comments