From 519d41119ed492ce5c880c1fe7912bce8eee20ac Mon Sep 17 00:00:00 2001 From: ebikatsudon Date: Thu, 19 Sep 2024 19:05:28 -0700 Subject: [PATCH 1/5] create new plotly express .funnel entry --- .../concepts/express/terms/funnel/funnel.md | 95 ++++++++++++++++++ media/plotly-express-funnel-example1.png | Bin 0 -> 21888 bytes media/plotly-express-funnel-example2.png | Bin 0 -> 26928 bytes 3 files changed, 95 insertions(+) create mode 100644 content/plotly/concepts/express/terms/funnel/funnel.md create mode 100644 media/plotly-express-funnel-example1.png create mode 100644 media/plotly-express-funnel-example2.png diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md new file mode 100644 index 00000000000..f920b5fb007 --- /dev/null +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -0,0 +1,95 @@ +--- +Title: '.funnel()' +Description: 'Generates a funnel chart that visualizes the reduction of data in progressive stages.' +Subjects: + - 'Computer Science' + - 'Data Science' +Tags: + - 'Data' + - 'Graphs' + - 'Libraries' + - 'Methods' + - 'Plotly' +CatalogContent: + - 'learn-python-3' + - 'paths/computer-science' + - 'paths/data-science' + - 'paths/data-science-foundations' +--- + +The **.funnel()** method in Plotly Express creates a chart showing the progressive reduction, or "funneling," of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with the length of each bar representing a value at each stage in the process. This helps visualize how the values change as they move through each stage, and can highlight bottlenecks or drop-offs in values. + +## Syntax + +```pseudo +plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=None, facet_col=None,...) +``` + +- `data_frame`: The dataset (typically a [Pandas dataframe](https://www.codecademy.com/resources/docs/pandas/dataframe)) to be plotted. +- `x`: The column in the dataframe that specifies the length of the bars, plotted along the x-axis in cartesian coordinates. +- `y`: The column in the dataframe that represents the stages of the funnel, plotted along the y-axis. + +> **Note:** The ellipsis (...) indicates there are additional optional parameters beyond those listed in the example syntax. + +Some optional parameters: +- `color`: The column in the dataframe that assigns colors to the bars of the funnel. +- `facet_row`: Splits the funnel chart into vertically-stacked subplots based on a specified column from the dataframe. +- `facet_col`: Splits the funnel chart into horizontally-arranged subplots based on a specified column from the dataframe. +- `title`: The title of the chart. +- `labels`: Custom labels for different axes or legend items. + +## Examples + +The example below generates a funnel chart representing the job search process for an applicant. + +```python +# Import Plotly Express module and Pandas library +import plotly.express as px +import pandas as pd + +# Create sample dictionary +data = { + 'Stage': ['Applications Sent', 'Phone Interview', 'Technical Interview', 'Onsite Interview', 'Offers Received', 'Offers Accepted'], + 'Job Applications': [500, 348, 92, 56, 10, 1] +} + +# Convert the dictionary into a DataFrame +df = pd.DataFrame(data) + +# Create the funnel chart with title "Job Search" +fig = px.funnel(df, x='Job Applications', y='Stage', title='Job Search') + +# Show the chart +fig.show() +``` + +The above example produces the following output: + +![Funnel Chart Illustrating Job Search](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotly-express-funnel-example1.png) + +As a variation on the previous example, the next example adds subplots using the `facet_col` parameter to compare two different job applicants side by side. + +```python +# Import Plotly Express module and Pandas library +import plotly.express as px +import pandas as pd + +# Create sample dictionary +data = { + 'Stage': ['Applications Sent', 'Phone Interview', 'Technical Interview', 'Onsite Interview', 'Offers Received', 'Offers Accepted'] * 2, + 'Job Applications': [500, 348, 92, 56, 10, 1, 500, 329, 290, 225, 167, 1], + 'Applicants': ['Candidate 1'] * 6 + ['Candidate 2'] * 6 +} + +# Convert the dictionary into a DataFrame +df = pd.DataFrame(data) + +# Create the funnel chart with title "Job Search" +fig = px.funnel(df, x='Job Applications', y='Stage', facet_col='Applicants', title='Job Search Comparison') + +# Show the chart +fig.show() +``` +The above code will result in the following output: + +![Funnel Chart Comparing Two Applicants](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotly-express-funnel-example2.png) diff --git a/media/plotly-express-funnel-example1.png b/media/plotly-express-funnel-example1.png new file mode 100644 index 0000000000000000000000000000000000000000..b347877f3bf9bfbe99dfb9f470bbc085f775d09a GIT binary patch literal 21888 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 literal 0 HcmV?d00001 diff --git a/media/plotly-express-funnel-example2.png b/media/plotly-express-funnel-example2.png new file mode 100644 index 0000000000000000000000000000000000000000..24073624441ca30850590d8ad48d0ab453195263 GIT binary patch literal 26928 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 Date: Mon, 23 Sep 2024 13:11:00 -0700 Subject: [PATCH 2/5] minor edits to funnel() page --- .../plotly/concepts/express/terms/funnel/funnel.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md index f920b5fb007..90b170d4e71 100644 --- a/content/plotly/concepts/express/terms/funnel/funnel.md +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -17,27 +17,25 @@ CatalogContent: - 'paths/data-science-foundations' --- -The **.funnel()** method in Plotly Express creates a chart showing the progressive reduction, or "funneling," of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with the length of each bar representing a value at each stage in the process. This helps visualize how the values change as they move through each stage, and can highlight bottlenecks or drop-offs in values. +The **.funnel()** method in Plotly Express creates a chart showing the progressive reduction, or "funneling," of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with the length of each bar representing a value at each stage in the process. This helps visualize how the values change as they move through each stage and can highlight bottlenecks or drop-offs in values. ## Syntax ```pseudo -plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=None, facet_col=None,...) +plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=None, facet_col=None, ...) ``` -- `data_frame`: The dataset (typically a [Pandas dataframe](https://www.codecademy.com/resources/docs/pandas/dataframe)) to be plotted. +- `data_frame`: The dataset (typically a [Pandas dataframe](https://www.codecademy.com/resources/docs/pandas/dataframe)) to be plotted. If this is not provided, Plotly Express will construct a dataframe using the other arguments. - `x`: The column in the dataframe that specifies the length of the bars, plotted along the x-axis in cartesian coordinates. - `y`: The column in the dataframe that represents the stages of the funnel, plotted along the y-axis. - -> **Note:** The ellipsis (...) indicates there are additional optional parameters beyond those listed in the example syntax. - -Some optional parameters: - `color`: The column in the dataframe that assigns colors to the bars of the funnel. - `facet_row`: Splits the funnel chart into vertically-stacked subplots based on a specified column from the dataframe. - `facet_col`: Splits the funnel chart into horizontally-arranged subplots based on a specified column from the dataframe. - `title`: The title of the chart. - `labels`: Custom labels for different axes or legend items. +> **Note:** The ellipsis (...) indicates there can be additional optional parameters beyond those listed here. + ## Examples The example below generates a funnel chart representing the job search process for an applicant. @@ -84,7 +82,7 @@ data = { # Convert the dictionary into a DataFrame df = pd.DataFrame(data) -# Create the funnel chart with title "Job Search" +# Create the funnel chart with title "Job Search Comparison" fig = px.funnel(df, x='Job Applications', y='Stage', facet_col='Applicants', title='Job Search Comparison') # Show the chart From 9e3bb6808a824b1f19c411cb47456512f663e6b9 Mon Sep 17 00:00:00 2001 From: ebikatsudon Date: Mon, 23 Sep 2024 21:21:59 -0700 Subject: [PATCH 3/5] update funnel() --- content/plotly/concepts/express/terms/funnel/funnel.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md index 90b170d4e71..6e39b75798c 100644 --- a/content/plotly/concepts/express/terms/funnel/funnel.md +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -31,8 +31,6 @@ plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=Non - `color`: The column in the dataframe that assigns colors to the bars of the funnel. - `facet_row`: Splits the funnel chart into vertically-stacked subplots based on a specified column from the dataframe. - `facet_col`: Splits the funnel chart into horizontally-arranged subplots based on a specified column from the dataframe. -- `title`: The title of the chart. -- `labels`: Custom labels for different axes or legend items. > **Note:** The ellipsis (...) indicates there can be additional optional parameters beyond those listed here. From ab6a1621762810ecb7e46283aea0c0dce951abcd Mon Sep 17 00:00:00 2001 From: ebikatsudon Date: Tue, 24 Sep 2024 00:06:07 -0700 Subject: [PATCH 4/5] fixed trailing spaces and minor formatting --- content/plotly/concepts/express/terms/funnel/funnel.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md index 6e39b75798c..fec4d197918 100644 --- a/content/plotly/concepts/express/terms/funnel/funnel.md +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -26,7 +26,7 @@ plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=Non ``` - `data_frame`: The dataset (typically a [Pandas dataframe](https://www.codecademy.com/resources/docs/pandas/dataframe)) to be plotted. If this is not provided, Plotly Express will construct a dataframe using the other arguments. -- `x`: The column in the dataframe that specifies the length of the bars, plotted along the x-axis in cartesian coordinates. +- `x`: The column in the dataframe that specifies the length of the bars, plotted along the x-axis in cartesian coordinates. - `y`: The column in the dataframe that represents the stages of the funnel, plotted along the y-axis. - `color`: The column in the dataframe that assigns colors to the bars of the funnel. - `facet_row`: Splits the funnel chart into vertically-stacked subplots based on a specified column from the dataframe. @@ -38,8 +38,7 @@ plotly.express.funnel(data_frame=None, x=None, y=None, color=None, facet_row=Non The example below generates a funnel chart representing the job search process for an applicant. -```python -# Import Plotly Express module and Pandas library +```py import plotly.express as px import pandas as pd @@ -65,8 +64,7 @@ The above example produces the following output: As a variation on the previous example, the next example adds subplots using the `facet_col` parameter to compare two different job applicants side by side. -```python -# Import Plotly Express module and Pandas library +```py import plotly.express as px import pandas as pd @@ -86,6 +84,7 @@ fig = px.funnel(df, x='Job Applications', y='Stage', facet_col='Applicants', tit # Show the chart fig.show() ``` + The above code will result in the following output: ![Funnel Chart Comparing Two Applicants](https://raw.githubusercontent.com/Codecademy/docs/main/media/plotly-express-funnel-example2.png) From 6edf206a441daab141e647a9e7d26ba7d76e847a Mon Sep 17 00:00:00 2001 From: ebikatsudon <99709771+ebikatsudon@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:59:07 -0700 Subject: [PATCH 5/5] Update content/plotly/concepts/express/terms/funnel/funnel.md added backticks around method name Co-authored-by: Savi Dahegaonkar <124272050+SaviDahegaonkar@users.noreply.github.com> --- content/plotly/concepts/express/terms/funnel/funnel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/plotly/concepts/express/terms/funnel/funnel.md b/content/plotly/concepts/express/terms/funnel/funnel.md index fec4d197918..bf534e4d1bf 100644 --- a/content/plotly/concepts/express/terms/funnel/funnel.md +++ b/content/plotly/concepts/express/terms/funnel/funnel.md @@ -17,7 +17,7 @@ CatalogContent: - 'paths/data-science-foundations' --- -The **.funnel()** method in Plotly Express creates a chart showing the progressive reduction, or "funneling," of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with the length of each bar representing a value at each stage in the process. This helps visualize how the values change as they move through each stage and can highlight bottlenecks or drop-offs in values. +The **`.funnel()`** method in Plotly Express creates a chart showing the progressive reduction, or "funneling," of data as it moves through sequential stages. The chart is composed of stacked horizontal bars, with the length of each bar representing a value at each stage in the process. This helps visualize how the values change as they move through each stage and can highlight bottlenecks or drop-offs in values. ## Syntax