From 5d20f9cad8b273056318916f295ff5004c42c5ce Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sat, 1 Mar 2025 19:53:09 +0100 Subject: [PATCH 01/10] feat: add initial empty sankey entry --- content/plotly/concepts/graph-objects/terms/sankey/sankey.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 content/plotly/concepts/graph-objects/terms/sankey/sankey.md diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md new file mode 100644 index 00000000000..e69de29bb2d From 1c31283857aed36097553a9b904e83604810db6f Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sat, 1 Mar 2025 19:53:36 +0100 Subject: [PATCH 02/10] docs: add metadata of sankey entry --- .../graph-objects/terms/sankey/sankey.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index e69de29bb2d..2ebb99d217d 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -0,0 +1,18 @@ +--- +Title: '.Sankey()' +Description: 'Creates a Sankey diagram in Plotly using the graph_objects module.' +Subjects: + - 'Data Science' + - 'Data Visualization' +Tags: + - 'Graphics' + - 'Charts' + - 'Plotly' + - 'Python' +CatalogContent: + - 'learn-python-3' + - 'paths/data-science' + - 'paths/data-science-foundations' +--- + + From 4c7d79b9c267a8286eec88ae5f6447ea30d6a04f Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sat, 1 Mar 2025 21:50:11 +0100 Subject: [PATCH 03/10] docs: add syntax definition --- .../graph-objects/terms/sankey/sankey.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index 2ebb99d217d..7241a02c0aa 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -15,4 +15,65 @@ CatalogContent: - 'paths/data-science-foundations' --- +**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates **Sankey diagrams +**. These diagrams are a type of visualization that illustrates flow from one set of values to another. The items being +connected are called **nodes**, and the connections between them are called **links**. The width of the links is +proportional to the flow quantity. + +## Syntax + +```pseudo +plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientation = 'h', valueformat = None, ...)) +``` + +- `node`: A dictionary that defines the properties of the nodes in the Sankey + diagram. It has the following keys: + + - `label`: An array of strings, each representing the name of a node. The + order of the labels in this array corresponds to the node indices used + in the `link` parameter. + - `color`: A string or an array of strings specifying the color of each + node. If a single string is provided, all nodes will have the same + color. If an array is provided, each element defines the color of the + node with the same index. + +- `link`: A dictionary that defines the links (connections) between nodes and + their flow values. It contains the following keys: + + - `source`: An array of numerical indices. Each index specifies the source + node of a link. The numerical index refers to the position of the node's + name in the `label` array. + - `target`: An array of numerical indices. Each index specifies the target + node of a link. The numerical index refers to the position of the node's + name in the `label` array. + - `value`: An array of numerical values. Each value represents the flow + quantity associated with a specific link. The order of values + corresponds to the order of the source-target pairs. + - `color`: A string or an array of strings specifying the color of each + link. + - `line`: A dictionary used to define the border of the links, contains + the following keys: + - `color`: Defines the color of the link border. + - `width`: Defines the width of the link border. + + > **Note:** The `source`, `target`, and `value` arrays must have the same + > length. Each set of elements at the same index in these arrays defines a + > single link. The index used in the `source` and `target` array, refer to + > the position of the node in the `label` array. + +- `arrangement`: Sets the arrangement of the nodes in the Sankey diagram. The + possible values are: `'snap'`, `'perpendicular'`, `'freeform'` and + `'fixed'`. The default value is `'snap'`. + +- `orientation`: Sets the orientation of the Sankey diagram. The possible + values are: `'h'` for horizontal and `'v'` for vertical. The default value + is `'h'`. + +- `valueformat`: Sets the format of the numerical values displayed on the + links, using d3-format's syntax. + +> **Note:** There are many additional, optional parameters that are not listed +> here, as indicated by the ellipsis (`...`) in the syntax. + + From b7201bf2c4d265b5f2838ac0b98a954882757870 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sun, 2 Mar 2025 12:24:08 +0100 Subject: [PATCH 04/10] docs: add syntax example --- .../graph-objects/terms/sankey/sankey.md | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index 7241a02c0aa..ecbd641cb00 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -49,12 +49,6 @@ plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientat - `value`: An array of numerical values. Each value represents the flow quantity associated with a specific link. The order of values corresponds to the order of the source-target pairs. - - `color`: A string or an array of strings specifying the color of each - link. - - `line`: A dictionary used to define the border of the links, contains - the following keys: - - `color`: Defines the color of the link border. - - `width`: Defines the width of the link border. > **Note:** The `source`, `target`, and `value` arrays must have the same > length. Each set of elements at the same index in these arrays defines a @@ -75,5 +69,53 @@ plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientat > **Note:** There are many additional, optional parameters that are not listed > here, as indicated by the ellipsis (`...`) in the syntax. +## Example + +This code displays a Sankey diagram, illustrating the advertising cash flow through its nodes and links. + +```py +import plotly.graph_objects as go + +# Define the data for the Sankey diagram (Advertising Cash Flow). +data = { + 'source': ['Ad Campaign', 'Social Media', 'Search Engines', 'Referrals', 'Social Media', 'Search Engines', 'Referrals', 'Social Media', 'Search Engines', 'Referrals'], + 'target': ['Clicks', 'Clicks', 'Clicks', 'Clicks', 'Leads', 'Leads', 'Leads', 'Conversions', 'Conversions', 'Conversions'], + 'value': [500, 300, 200, 100, 150, 80, 40, 60, 30, 10] +} + +# Create a list of unique nodes. +all_nodes = data['source'] + data['target'] +# Create a dictionary that links the name of the node to its index. +node_to_index = {node: i for i, node in enumerate(all_nodes)} + +# Convert source and target names to indices. +source_indices = [node_to_index[source] for source in data['source']] +target_indices = [node_to_index[target] for target in data['target']] + +# Create the Sankey diagram. +fig = go.Figure(data=[go.Sankey( + node=dict( + label=all_nodes, + pad=20, # Add padding between nodes. + thickness=10, # Define the thickness of the nodes. + line=dict(color="black", width=0.5) # Add a border to the nodes. + ), + link=dict( + source=source_indices, + target=target_indices, + value=data['value'], + color=['lightblue', 'lightgreen', 'lightcoral', 'khaki', 'blueviolet', 'teal', 'chartreuse', 'darkmagenta', 'dodgerblue', 'lightblue'], # Define the color of the links. + line=dict(color='black', width=0.2) # Define the border of the links. + ), + arrangement='snap', # Set the arrangement of the nodes. + orientation='h' # Set the orientation of the diagram. +)]) + +# Update layout to add a title. +fig.update_layout(title_text="Advertising Cash Flow", font_size=10) + +# Display the plot. +fig.show() +``` From 177b17c93bb81c423beeb272b6d3eab357facfb0 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sun, 2 Mar 2025 12:40:33 +0100 Subject: [PATCH 05/10] docs: correct syntax example --- .../plotly/concepts/graph-objects/terms/sankey/sankey.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index ecbd641cb00..f4c71120e33 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -105,7 +105,7 @@ fig = go.Figure(data=[go.Sankey( source=source_indices, target=target_indices, value=data['value'], - color=['lightblue', 'lightgreen', 'lightcoral', 'khaki', 'blueviolet', 'teal', 'chartreuse', 'darkmagenta', 'dodgerblue', 'lightblue'], # Define the color of the links. + color=['lightblue', 'lightgreen', 'lightcoral', 'indigo', 'turquoise', 'mediumvioletred', 'darkorange', 'yellowgreen', 'dodgerblue', 'lightblue'], # Define the color of the links. line=dict(color='black', width=0.2) # Define the border of the links. ), arrangement='snap', # Set the arrangement of the nodes. @@ -119,3 +119,7 @@ fig.update_layout(title_text="Advertising Cash Flow", font_size=10) fig.show() ``` +This example results in the following output: + +![The output will be a Sankey diagram illustrating the advertising cash flow.](https://raw.githubusercontent.com/Codecademy/docs/main/media/sankey-cash-flow.png) + From 5270575543e6f8af5d9263a9f589cefb7a2ab465 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sun, 2 Mar 2025 12:40:56 +0100 Subject: [PATCH 06/10] docs: add output image of syntax example --- media/sankey-cash-flow.png | Bin 0 -> 57818 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/sankey-cash-flow.png diff --git a/media/sankey-cash-flow.png b/media/sankey-cash-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..33da65335bfe3fc0baf941ddb245917dcf611107 GIT binary patch literal 57818 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 Fe*)Tk83q6V literal 0 HcmV?d00001 From 1552b9521298f58dd5e198e5443580d33f3210a5 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sun, 2 Mar 2025 21:19:36 +0100 Subject: [PATCH 07/10] docs: correct style --- .../graph-objects/terms/sankey/sankey.md | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index f4c71120e33..13be5ba2be6 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -15,9 +15,9 @@ CatalogContent: - 'paths/data-science-foundations' --- -**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates **Sankey diagrams -**. These diagrams are a type of visualization that illustrates flow from one set of values to another. The items being -connected are called **nodes**, and the connections between them are called **links**. The width of the links is +**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates Sankey diagrams. +These diagrams are a type of visualization that illustrates flow from one set of values to another. The items being +connected are called nodes, and the connections between them are called links. The width of the links is proportional to the flow quantity. ## Syntax @@ -51,16 +51,14 @@ plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientat corresponds to the order of the source-target pairs. > **Note:** The `source`, `target`, and `value` arrays must have the same - > length. Each set of elements at the same index in these arrays defines a - > single link. The index used in the `source` and `target` array, refer to - > the position of the node in the `label` array. - + > length. + - `arrangement`: Sets the arrangement of the nodes in the Sankey diagram. The - possible values are: `'snap'`, `'perpendicular'`, `'freeform'` and + possible values are: `'snap'`, `'perpendicular'`, `'freeform'`, and `'fixed'`. The default value is `'snap'`. - `orientation`: Sets the orientation of the Sankey diagram. The possible - values are: `'h'` for horizontal and `'v'` for vertical. The default value + values are: `'h'` for horizontal, and `'v'` for vertical. The default value is `'h'`. - `valueformat`: Sets the format of the numerical values displayed on the @@ -69,9 +67,9 @@ plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientat > **Note:** There are many additional, optional parameters that are not listed > here, as indicated by the ellipsis (`...`) in the syntax. -## Example +## Example -This code displays a Sankey diagram, illustrating the advertising cash flow through its nodes and links. +This code displays a Sankey diagram, illustrating the advertising cash flow through its nodes, and links. ```py import plotly.graph_objects as go @@ -89,7 +87,7 @@ all_nodes = data['source'] + data['target'] # Create a dictionary that links the name of the node to its index. node_to_index = {node: i for i, node in enumerate(all_nodes)} -# Convert source and target names to indices. +# Convert source, and target names to indices. source_indices = [node_to_index[source] for source in data['source']] target_indices = [node_to_index[target] for target in data['target']] From dedda11e3f76f11733cec88fff1198f67bc98f42 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Sun, 2 Mar 2025 22:03:29 +0100 Subject: [PATCH 08/10] fix: prettier code styling --- .../graph-objects/terms/sankey/sankey.md | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index 13be5ba2be6..b9767964d85 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -15,7 +15,7 @@ CatalogContent: - 'paths/data-science-foundations' --- -**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates Sankey diagrams. +**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates Sankey diagrams. These diagrams are a type of visualization that illustrates flow from one set of values to another. The items being connected are called nodes, and the connections between them are called links. The width of the links is proportional to the flow quantity. @@ -23,49 +23,47 @@ proportional to the flow quantity. ## Syntax ```pseudo -plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientation = 'h', valueformat = None, ...)) +plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientation = 'h', valueformat = None, ...) ``` - `node`: A dictionary that defines the properties of the nodes in the Sankey diagram. It has the following keys: - - `label`: An array of strings, each representing the name of a node. The - order of the labels in this array corresponds to the node indices used - in the `link` parameter. - - `color`: A string or an array of strings specifying the color of each - node. If a single string is provided, all nodes will have the same - color. If an array is provided, each element defines the color of the - node with the same index. + - `label`: An array of strings, each representing the name of a node. The + order of the labels in this array corresponds to the node indices used + in the `link` parameter. + - `color`: A string or an array of strings specifying the color of each + node. If a single string is provided, all nodes will have the same + color. If an array is provided, each element defines the color of the + node with the same index. - `link`: A dictionary that defines the links (connections) between nodes and their flow values. It contains the following keys: - - `source`: An array of numerical indices. Each index specifies the source - node of a link. The numerical index refers to the position of the node's - name in the `label` array. - - `target`: An array of numerical indices. Each index specifies the target - node of a link. The numerical index refers to the position of the node's - name in the `label` array. - - `value`: An array of numerical values. Each value represents the flow - quantity associated with a specific link. The order of values - corresponds to the order of the source-target pairs. + - `source`: An array of numerical indices. Each index specifies the source + node of a link. The numerical index refers to the position of the node's + name in the `label` array. + - `target`: An array of numerical indices. Each index specifies the target + node of a link. The numerical index refers to the position of the node's + name in the `label` array. + - `value`: An array of numerical values. Each value represents the flow + quantity associated with a specific link. The order of values + corresponds to the order of the source-target pairs. - > **Note:** The `source`, `target`, and `value` arrays must have the same - > length. +> **Note:** The `source`, `target`, and `value` arrays must have the same length. - `arrangement`: Sets the arrangement of the nodes in the Sankey diagram. The - possible values are: `'snap'`, `'perpendicular'`, `'freeform'`, and - `'fixed'`. The default value is `'snap'`. + possible values are: `snap`, `perpendicular`, `freeform`, and + `fixed`. The default value is `snap`. - `orientation`: Sets the orientation of the Sankey diagram. The possible - values are: `'h'` for horizontal, and `'v'` for vertical. The default value - is `'h'`. + values are: `h` for horizontal, and `v` for vertical. The default value + is `h`. - `valueformat`: Sets the format of the numerical values displayed on the links, using d3-format's syntax. -> **Note:** There are many additional, optional parameters that are not listed -> here, as indicated by the ellipsis (`...`) in the syntax. +> **Note:** There are many additional, optional parameters that are not listed here, as indicated by the ellipsis (`...`) in the syntax. ## Example @@ -119,5 +117,4 @@ fig.show() This example results in the following output: -![The output will be a Sankey diagram illustrating the advertising cash flow.](https://raw.githubusercontent.com/Codecademy/docs/main/media/sankey-cash-flow.png) - +![The output will be a Sankey diagram.](https://raw.githubusercontent.com/Codecademy/docs/main/media/sankey-cash-flow.png) From c13869df862206df8eef88d5c9395dfe0c64d8c0 Mon Sep 17 00:00:00 2001 From: Alessandro Capialbi Date: Mon, 3 Mar 2025 14:53:08 +0100 Subject: [PATCH 09/10] fix: PR issues --- .../concepts/graph-objects/terms/sankey/sankey.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index b9767964d85..0c684a541f6 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -1,5 +1,5 @@ --- -Title: '.Sankey()' +Title: 'Sankey' Description: 'Creates a Sankey diagram in Plotly using the graph_objects module.' Subjects: - 'Data Science' @@ -15,10 +15,8 @@ CatalogContent: - 'paths/data-science-foundations' --- -**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that generates Sankey diagrams. -These diagrams are a type of visualization that illustrates flow from one set of values to another. The items being -connected are called nodes, and the connections between them are called links. The width of the links is -proportional to the flow quantity. +**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that creates visualizations to illustrate the flow between different values. Sankey diagrams. The connected elements are referred to as nodes, and the connections between nodes are called links. The width of each link represents +the quantity of flow. ## Syntax @@ -56,9 +54,8 @@ plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientat possible values are: `snap`, `perpendicular`, `freeform`, and `fixed`. The default value is `snap`. -- `orientation`: Sets the orientation of the Sankey diagram. The possible - values are: `h` for horizontal, and `v` for vertical. The default value - is `h`. +- `orientation`: Determines whether the Sankey diagram is displayed horizontally or vertically. The + possible values are: `h` for horizontal, and `v` for vertical. The default value is `h`. - `valueformat`: Sets the format of the numerical values displayed on the links, using d3-format's syntax. From fd591f2106cc34973fefc8f656fd0e613a2a187e Mon Sep 17 00:00:00 2001 From: Mamta Wardhani Date: Wed, 12 Mar 2025 18:07:18 +0530 Subject: [PATCH 10/10] minor fixes --- .../graph-objects/terms/sankey/sankey.md | 54 ++++++------------- 1 file changed, 15 insertions(+), 39 deletions(-) diff --git a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md index 0c684a541f6..622144d954f 100644 --- a/content/plotly/concepts/graph-objects/terms/sankey/sankey.md +++ b/content/plotly/concepts/graph-objects/terms/sankey/sankey.md @@ -1,22 +1,20 @@ --- -Title: 'Sankey' -Description: 'Creates a Sankey diagram in Plotly using the graph_objects module.' +Title: '.Sankey()' +Description: 'Creates Sankey diagrams, which visualize flow between categories using nodes and links.' Subjects: - 'Data Science' - 'Data Visualization' Tags: - - 'Graphics' - 'Charts' + - 'Graphics' - 'Plotly' - 'Python' CatalogContent: - 'learn-python-3' - 'paths/data-science' - - 'paths/data-science-foundations' --- -**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that creates visualizations to illustrate the flow between different values. Sankey diagrams. The connected elements are referred to as nodes, and the connections between nodes are called links. The width of each link represents -the quantity of flow. +**`.Sankey()`** is a method in Plotly's [`graph_objects`](https://www.codecademy.com/resources/docs/plotly/graph-objects) module that creates Sankey diagrams, which visualize the flow between different values. The connected elements are called nodes, and the connections between them are links, where the width of each link represents the quantity of flow. ## Syntax @@ -24,47 +22,25 @@ the quantity of flow. plotly.graph_objects.Sankey(node=None, link=None, arrangement = 'snap', orientation = 'h', valueformat = None, ...) ``` -- `node`: A dictionary that defines the properties of the nodes in the Sankey - diagram. It has the following keys: - - - `label`: An array of strings, each representing the name of a node. The - order of the labels in this array corresponds to the node indices used - in the `link` parameter. - - `color`: A string or an array of strings specifying the color of each - node. If a single string is provided, all nodes will have the same - color. If an array is provided, each element defines the color of the - node with the same index. - -- `link`: A dictionary that defines the links (connections) between nodes and - their flow values. It contains the following keys: - - - `source`: An array of numerical indices. Each index specifies the source - node of a link. The numerical index refers to the position of the node's - name in the `label` array. - - `target`: An array of numerical indices. Each index specifies the target - node of a link. The numerical index refers to the position of the node's - name in the `label` array. - - `value`: An array of numerical values. Each value represents the flow - quantity associated with a specific link. The order of values - corresponds to the order of the source-target pairs. +- `node`: A dictionary that defines the properties of the nodes in the Sankey diagram. It has the following keys: + - `label`: Names of the nodes, where the order corresponds to their indices used in `link`. + - `color`: A string or an array of strings specifying the color of each node. If a single string is provided, all nodes will have the same color. If an array is provided, each element defines the color of the node with the same index. +- `link`: A dictionary that defines the links (connections) between nodes and their flow values. It contains the following keys: + - `source`: An array of numerical indices. Each index specifies the source node of a link. The numerical index refers to the position of the node's name in the `label` array. + - `target`: An array of numerical indices. Each index specifies the target node of a link. The numerical index refers to the position of the node's name in the `label` array. + - `value`: An array of numerical values. Each value represents the flow quantity associated with a specific link. The order of values corresponds to the order of the source-target pairs. > **Note:** The `source`, `target`, and `value` arrays must have the same length. -- `arrangement`: Sets the arrangement of the nodes in the Sankey diagram. The - possible values are: `snap`, `perpendicular`, `freeform`, and - `fixed`. The default value is `snap`. - -- `orientation`: Determines whether the Sankey diagram is displayed horizontally or vertically. The - possible values are: `h` for horizontal, and `v` for vertical. The default value is `h`. - -- `valueformat`: Sets the format of the numerical values displayed on the - links, using d3-format's syntax. +- `arrangement`: Sets the arrangement of the nodes in the Sankey diagram. The possible values are: `snap`, `perpendicular`, `freeform`, and `fixed`. The default value is `snap`. +- `orientation`: Determines whether the Sankey diagram is displayed horizontally or vertically. The possible values are: `h` for horizontal, and `v` for vertical. The default value is `h`. +- `valueformat`: Sets the numerical format for flow values, using d3-format syntax. > **Note:** There are many additional, optional parameters that are not listed here, as indicated by the ellipsis (`...`) in the syntax. ## Example -This code displays a Sankey diagram, illustrating the advertising cash flow through its nodes, and links. +This code displays a Sankey diagram, illustrating the advertising cash flow through its nodes, and links: ```py import plotly.graph_objects as go