# Figure Friday 2025 - week 18

**URL:** <https://community.plotly.com/t/figure-friday-2025-week-18/92102>\
**Category:** Dash Python\
**Tags:** announcements, figure-friday\
**Created:** [May 2, 2025, 2:24pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102 "2025-05-02T14:24:43Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![adamschroeder](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/adamschroeder/32/17280_2.png) [@adamschroeder](https://community.plotly.com/u/adamschroeder)\
**Post date:** [May 2, 2025, 2:24pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/1 "2025-05-02T14:24:43Z")

</div>

> join the [Figure Friday session](https://streamyard.com/mbmx2vjpcm) on May 9, at noon Eastern Time, to showcase your creation and receive feedback from the community.

What percentage of the OECD countries have access to green space? What percentage of the OECD countries experience job strain?

Answer these and many other questions by using Plotly and Dash on the [OECD dataset](https://github.com/plotly/Figure-Friday/tree/main/2025/week-18).

## Things to consider:

- what can you improve in the app or sample figure below ([dumbbell charts](https://plotly.com/python/dumbbell-plots/))?
- would you like to tell a different data story using a different graph?
- can you create a different Dash app?

Sample figure:

 ![image](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/f/4/f408cd46a25c9a5a28bf2c9d09e6e111ca2b36ae.png)

> **Code for sample figure:**
>
> ```python
> import plotly.express as px
> import pandas as pd
> import plotly.graph_objects as go
> from dash import Dash, dcc
> import dash_ag_grid as dag
> 
> # Download CSV sheet at: https://drive.google.com/file/d/1CXxOQA2uBso64VEyvQ3L76AZLxyUlQDB/view?usp=sharing
> df = pd.read_csv("OECD-wellbeing.csv")
> 
> # Group the dataset
> df_grouped = df.groupby(['Measure', 'Education', 'Country', 'Year'])['OBS_VALUE'].sum()
> df_grouped = df_grouped.reset_index()
> 
> # focus on a specific measure, year, and education level
> df_grouped = df_grouped[df_grouped['Measure'] == 'Feeling lonely']
> df_grouped = df_grouped[df_grouped['Year'] == 2022]
> df_grouped = df_grouped[df_grouped['Education'].isin(['Primary education', 'Secondary education'])]
> 
> # Pivot the table to get Primary and Secondary values side-by-side
> df_pivot = df_grouped.pivot(index='Country', columns='Education', values='OBS_VALUE').reset_index()
> 
> df_pivot.columns.name = None # Remove the name of the index colum
> 
> df_pivot = df_pivot.rename(columns={
> 'Primary education': 'Primary',
> 'Secondary education': 'Secondary'
> })
> 
> # Sort countries
> df_pivot = df_pivot.sort_values(by='Secondary', ascending=True)
> 
> # Get the sorted list of countries for the y-axis
> countries_sorted = df_pivot['Country'].tolist()
> 
> # Prepare Data for Plotly Traces
> line_x = []
> line_y = []
> primary_vals = []
> secondary_vals = []
> 
> for country in countries_sorted:
> row = df_pivot[df_pivot['Country'] == country]
> primary_val = row['Primary'].iloc[0]
> secondary_val = row['Secondary'].iloc[0]
> 
> primary_vals.append(primary_val)
> secondary_vals.append(secondary_val)
> 
> # For the connecting line segment
> line_x.extend([primary_val, secondary_val, None]) # Add None to break the line
> line_y.extend([country, country, None])
> 
> fig = go.Figure()
> fig.add_trace(go.Scatter(
> x=line_x,
> y=line_y,
> mode='lines',
> showlegend=False,
> line=dict(color='grey', width=1),
> ))
> 
> # Add markers for Primary Education
> fig.add_trace(go.Scatter(
> x=primary_vals,
> y=countries_sorted,
> mode='markers',
> name='Primary Education', # Legend entry
> marker=dict(color='skyblue', size=10),
> hovertemplate =
> '<b>%{y}</b><br>' +
> 'Primary Education: %{x:.2f}%' +
> '<extra></extra>'
> ))
> 
> # Add markers for Secondary Education
> fig.add_trace(go.Scatter(
> x=secondary_vals,
> y=countries_sorted,
> mode='markers',
> name='Secondary Education', # Legend entry
> marker=dict(color='royalblue', size=10),
> hovertemplate =
> '<b>%{y}</b><br>' +
> 'Secondary Education: %{x:.2f}%' +
> '<extra></extra>'
> ))
> 
> fig.update_layout(
> title=dict(text="Feeling Lonely by Education Level (2022)", x=0.5),
> xaxis_title="Percentage Feeling Lonely (%)",
> yaxis_title="Country",
> height=900,
> yaxis=dict(tickmode='array', tickvals=countries_sorted, ticktext=countries_sorted), # Ensure all country labels are shown
> legend_title_text='Education Level',
> legend=dict(
> orientation="h", # Horizontal legend
> yanchor="bottom",
> y=1.02, # Position above plot
> xanchor="right",
> x=1
> ),
> margin=dict(l=100) # Add left margin for country names
> )
> 
> grid = dag.AgGrid(
> rowData=df.to_dict("records"),
> columnDefs=[{"field": i, 'filter': True, 'sortable': True} for i in df.columns],
> dashGridOptions={"pagination": True},
> columnSize="sizeToFit"
> )
> 
> app = Dash()
> app.layout = [
> grid,
> dcc.Graph(figure=fig)
> ]
> 
> if __name__ == " __main__":
> app.run(debug=False)
> 
> ```

## Participation Instructions:

- **Create** - use the weekly data set to build your own Plotly visualization or Dash app. Or, enhance the sample figure provided in this post, using Plotly or Dash.
- **Submit** - post your creation to LinkedIn or Twitter with the hashtags `#FigureFriday` and `#plotly` by midnight Thursday, your time zone. Please also submit your visualization as a new post in this thread.
- **Celebrate** - join the [Figure Friday sessions](https://streamyard.com/ug4z52kcya) to showcase your creation and receive feedback from the community.

👉 If you prefer to collaborate with others on Discord, join the [Plotly Discord channel](https://discord.gg/Pa8scsgepB).

## Data Source:

Thank you to [OECD Data Explorer](https://data-explorer.oecd.org/vis?fs%5B0%5D=Topic%2C1%7CSociety%23SOC%23%7CWell-being%20and%20beyond%20GDP%23SOC_WEL%23&pg=0&fc=Topic&bp=true&snb=26&vw=tb&df%5Bds%5D=dsDisseminateFinalDMZ&df%5Bid%5D=DSD_HSL%40DF_HSL_CWB&df%5Bag%5D=OECD.WISE.WDP&df%5Bvs%5D=1.1&dq=.11_2%2B11_1%2B9_3%2B9_2%2B8_2%2B8_1_DEP%2B7_2%2B7_1_DEP%2B6_2_DEP%2B6_2%2B5_3%2B5_1%2B4_3%2B4_1%2B3_2%2B3_1%2B2_7%2B2_2%2B2_1%2B1_3%2B1_2%2B1_1.._T._T._T.&lom=LASTNOBSERVATIONS&lo=1&pd=%2C&to%5BTIME_PERIOD%5D=false) for the data.

---

<div class="post-metadata">

**Author:** ![thedatahawk](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/thedatahawk/32/31429_2.png) [@thedatahawk](https://community.plotly.com/u/thedatahawk)\
**Post date:** [May 5, 2025, 12:31am UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/2 "2025-05-05T00:31:03Z")

</div>

Looks very cool! I just finished my first two apps using OECD data. I tried to get multipage to work on render, but I was only able to get it to work on my own computer.

> **[Dash](https://world-source.onrender.com/)**

> **[Dash](https://us-source.onrender.com/)**

(sorry, they will take up to a minute to load)

---

<div class="post-metadata">

**Author:** ![adamschroeder](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/adamschroeder/32/17280_2.png) [@adamschroeder](https://community.plotly.com/u/adamschroeder)\
**Post date:** [May 5, 2025, 2:31pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/3 "2025-05-05T14:31:49Z")

</div>

What an interesting way to explore the data, @thedatahawk . Did you use a different dataset from the OECD website?

---

<div class="post-metadata">

**Author:** ![thedatahawk](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/thedatahawk/32/31429_2.png) [@thedatahawk](https://community.plotly.com/u/thedatahawk)\
**Post date:** [May 5, 2025, 3:04pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/4 "2025-05-05T15:04:48Z")

</div>

Yes! I should have been more clear. I am using a completely different oecd dataset. It is the trade in value added dataset here [https://www.oecd.org/en/topics/sub-issues/trade-in-value-added.html](https://www.oecd.org/en/topics/sub-issues/trade-in-value-added.html)

Thanks @adamschroeder

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 7, 2025, 2:55pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/5 "2025-05-07T14:55:57Z")

</div>

Hello Everyone,

For this week Figure Friday my proposal/suggestion is a dashboard/app for exploring and understanding well-being data from the OECD (Organisation for Economic Co-operation and Development). It allows users to select various dimensions of well-being, compare countries, analyze trends over time, and even explore potential future scenarios through basic predictive modeling and country clustering.

A summary of the main functionalities:

1. **Interactive Data Exploration:**

2. **Data Visualization:**

3. **Insight Generation and Storytelling:**

4. **Advanced Analytics (Basic):**

5. **User Interface and Styling:**

Important to mention the dashboard is far from being perfect you can find some errors, this is a type of “MVP”

Some images:

 ![screencapture-127-0-0-1-8051-2025-05-07-11_28_07](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/c/c/cc1abe653a71a73e1a847f1aa4a46718efe21165.png)  
 ![screencapture-127-0-0-1-8051-2025-05-07-11_28_57](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/6/9/6947f4de63cee238305c6a24cc69c53d3df68f2b.png)  
 ![screencapture-127-0-0-1-8051-2025-05-07-11_29_18](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/d/7/d73c543c600f095ae75f5f5d365490d5c5eebf3e.png)  
 ![screencapture-127-0-0-1-8051-2025-05-07-11_35_24](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/f/f/ff729284b0a442e7a0a4b1fd2bbc225fa6c38090.png)

the web app:

> **[PyCafe - Dash - oecd](https://py.cafe/app/acabrera.citizens/oecd)**
>
> Create & Share Streamlit, Dash and Python Apps Online.

As usual highly apprecciate your comments/suggestions

Have a nice day

---

<div class="post-metadata">

**Author:** ![marieanne](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/marieanne/32/29767_2.png) [@marieanne](https://community.plotly.com/u/marieanne)\
**Post date:** [May 7, 2025, 4:38pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/6 "2025-05-07T16:38:52Z")

</div>

Hi @Avacsiglo21, you left no stone unturned 💪. I was surprised by the avg. gross salary in the Netherlands because it differs so much from what we hear every year. In the dataset it’s far higher/too high? Same for Belgium.

A small google search to validate my thoughts:  
What is the average salary in the Netherlands? As of February 2024, the gross average salary in the Netherlands is **€44,000 per year** or €3,666 per month. This is around $49,000 or ₤37,000. In the Netherlands working hours are, for the most part, kept to 40 hours per week or under.

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 7, 2025, 5:03pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/7 "2025-05-07T17:03:35Z")

</div>

Hi Marianne, hahaha, you know you’re right. In fact, if you look at the chart and apply any filter for gender, age, or education, “Total” always appears. It’s one of the many concessions I had to make to be able to create these charts, including a “Total” button. In the Unit of Measure Column is reported US dollars, PPP converted

---

<div class="post-metadata">

**Author:** ![adamschroeder](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/adamschroeder/32/17280_2.png) [@adamschroeder](https://community.plotly.com/u/adamschroeder)\
**Post date:** [May 7, 2025, 7:59pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/8 "2025-05-07T19:59:02Z")

</div>

What an interesting app, @Avacsiglo21 .

I liked looking at life expectancy at birth:

 ![image](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/d/8/d8a10c34fdd48501842de4db619ab35b69b4ca53.png)

Is it possible to modify the legend to be discrete-based instead of continuous? Blue 80-89; Yellow 72-29; purple 65-72 ?

That green text of Cluster Insight can probably be changed into a pop-up, because I really just need to read it once, and it kind of blocks the x axis labels.

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 7, 2025, 8:15pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/9 "2025-05-07T20:15:48Z")

</div>

> [@adamschroeder](#):
>
> Is it possible to modify the legend to be discrete-based instead of continuous? Blue 80-89; Yellow 72-29; purple 65-72 ?
> 
> That green text of Cluster Insight can probably be changed into a pop-up, because I really just need to read it once, and it kind of blocks the x axis labels.

Let me see if I understood you correctly: you want to change the color scale so that each cluster has a single color, is that it? Eliminate the color scale?

Regarding the label, I can change it, move it down a bit, but yes, I agree, it could even be a tooltip. However, I’m not sure if I’ll have time for Friday.

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 7, 2025, 8:37pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/10 "2025-05-07T20:37:40Z")

</div>

![screencapture-py-cafe-app-acabrera-citizens-oecd-2025-05-07-17_39_07 (1)](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/7/5/752f63175baf93b97423991a9020eec1c554b4c6.png)  
This one done, just moving where the xlabel was. Just One left hahaha

---

<div class="post-metadata">

**Author:** ![adamschroeder](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/adamschroeder/32/17280_2.png) [@adamschroeder](https://community.plotly.com/u/adamschroeder)\
**Post date:** [May 8, 2025, 5:52pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/11 "2025-05-08T17:52:23Z")

</div>

nice update with the label.  
I’m not sure exactly how this could be done. I need to read the docs more.  
Your graph really just uses three colors: pink, yellow, purple. But the legend suggests a continuous color mode where one would expect to see a variety of colors and shades. Plus, the color represents the group number each country is in. But i wonder if there is a way to have the legend represent the range of average annual gross earnings instead..

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 8, 2025, 9:47pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/12 "2025-05-08T21:47:56Z")

</div>

Ah okkk, I understood your point, the reason Is the color parámeter in the scatter plot Is “Clúster”. So, there are 3 clúster defined. That the reason does not change. Here what I need to do is hide the color scale. To avoid the confusión

---

<div class="post-metadata">

**Author:** ![Mike\_Purtell](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/mike_purtell/32/21990_2.png) [@Mike\_Purtell](https://community.plotly.com/u/Mike_Purtell)\
**Post date:** [May 8, 2025, 10:47pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/13 "2025-05-08T22:47:54Z")

</div>

Nice work @thedatahawk. I really like the second dashboard with the Treemap. Wondering why it has a dropdown menu to select the year when the only choice is 2020?

---

<div class="post-metadata">

**Author:** ![Mike\_Purtell](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/mike_purtell/32/21990_2.png) [@Mike\_Purtell](https://community.plotly.com/u/Mike_Purtell)\
**Post date:** [May 8, 2025, 10:50pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/14 "2025-05-08T22:50:21Z")

</div>

Great work @Avacsiglo21, so impressed 😀

---

<div class="post-metadata">

**Author:** ![thedatahawk](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/thedatahawk/32/31429_2.png) [@thedatahawk](https://community.plotly.com/u/thedatahawk)\
**Post date:** [May 9, 2025, 2:14am UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/15 "2025-05-09T02:14:17Z")

</div>

Thanks @Mike_Purtell. Good question. I have the data going back to 1997 but the files are quite large. I could only get one year in under GitHubs for size limits.

In my personal computer I have all the data back to 1997.

---

<div class="post-metadata">

**Author:** ![Ester](https://avatars.discourse-cdn.com/v4/letter/e/f04885/32.png) [@Ester](https://community.plotly.com/u/Ester)\
**Post date:** [May 9, 2025, 7:50am UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/16 "2025-05-09T07:50:47Z")

</div>

Hi everyone,  
I haven’t used _ **dumbbell chart** _ in plotly yet, this was a good opportunity to try it out. 🧑‍💻🚀

This Dash application visualizes temporal changes in the “Access to green space” metric for urban populations across OECD countries using a **dumbbell chart**.

#### **Core Features:**

- **Data Source** : The app loads a CSV file (`OECD-wellbeing.csv`), filters for the measure “Access to green space”, and includes only the years **2012** and **2018**.
- **Data Transformation** : A pivot table is created using `Country` as the index and `Year` as columns to get comparable OBS\_VALUEs side-by-side for each year.
- **UI Components** :
  - **Dropdown filter** for selecting countries (including a “Select All” option).
  - **KPIs** (Key Performance Indicators) display:
    - Country with the highest 2018 value.
    - Country with greatest positive change from 2012 to 2018.
    - Country with the lowest 2018 value.
    - Country with the largest decline.

  - **Dumbbell Chart** using `plotly.graph_objects`:
    - Two scatter traces (2012 and 2018).
    - Connecting lines between years per country.
    - Annotations showing percentage change.

#### **Callback Logic** :

- Triggered by the country dropdown (`Input`).
- Dynamically filters data and recalculates:
  - The dumbbell chart.
  - All KPI values.

- Handles edge case for no selection or “Select All”.

#### **Styling & Layout** :

- Clean, modern CSS-like styling for KPIs and layout blocks.
- Chart and layout responsive and designed for clarity with Plotly’s white theme and high contrast markers.
- Uses margin and spacing tweaks to accommodate annotations and long country names.

 ![image](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/2/6/263ac5e808c14165f4d4c436570cbd604670ebeb.png)

> **[PyCafe - Dash - Dash & Plotly Data Visualization for OECD Green Space Access](https://py.cafe/app/banana0000/OECD%20wellbeing%3A%20acess%20to%20green-space)**
>
> Create & Share Streamlit, Dash and Python Apps Online.

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 9, 2025, 1:19pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/17 "2025-05-09T13:19:14Z")

</div>

Hi Adam as requested 😜 😂

 ![screencapture-127-0-0-1-8050-2025-05-09-10_08_33](https://us1.discourse-cdn.com/flex024/uploads/plot/original/3X/2/2/2281a8c66fe148db5475d922c0fd7df09dd3cb9e.png)

Here the code snippet I modified for the label positioning chage the y value in add\_annotation to -0.4,  
for the color scale, add coloraxis\_showscale=False, in update layout.

I

```auto
fig = px.scatter(
        cluster_df,
        x='Country',
        y='OBS_VALUE',
        color='Cluster',
        color_discrete_map={i: cluster_colors[i] for i in range(len(cluster_labels))},
        title=f"Country Clusters for {measure} ({year})",
        labels={'OBS_VALUE': measure, 'Cluster': 'Group', 'Country':''},
        category_orders={"Cluster": sorted(cluster_df['Cluster'].unique())},
        size=[12] * len(cluster_df)
    )
    
    # Add horizontal lines for cluster centers
    for cluster, label in cluster_labels.items():
        cluster_mean = cluster_df[cluster_df['Cluster'] == cluster]['OBS_VALUE'].mean()
        fig.add_shape(
            type="line",
            x0=-0.5,
            y0=cluster_mean,
            x1=len(cluster_df['Country'].unique()) - 0.5,
            y1=cluster_mean,
            line=dict(
                color=cluster_colors[cluster],
                width=2,
                dash="dash",
            )
        )
        
        # Add annotation for cluster label
        fig.add_annotation(
            x=len(cluster_df['Country'].unique()) - 0.5,
            y=cluster_mean,
            text=label,
            showarrow=False,
            xshift=50,
            font=dict(
                color=cluster_colors[cluster],
                size=12
            ),
            bgcolor="rgba(255, 255, 255, 0.8)",
            bordercolor=cluster_colors[cluster],
            borderwidth=1,
            borderpad=4
        )
    
    # Improve styling
    fig.update_layout(
        plot_bgcolor=COLORS["card-bg"],
        paper_bgcolor=COLORS["card-bg"],
        font_family="'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif",
        font_color=COLORS["text-primary"],
        ***showlegend=False,***
 ***coloraxis_showscale=False,***
        margin=dict(l=40, r=120, t=60, b=120),
        title={
            'text': f"<b>Country Performance Groups</b> for {measure} ({year})",
            'y':0.95,
            'x':0.5,
            'xanchor': 'center',
            'yanchor': 'top',
            'font': dict(size=18)
        }
    )
    
    # Better x-axis with rotated labels
    fig.update_xaxes(
        tickangle=45,
        tickmode='array',
        tickvals=list(range(len(cluster_df['Country'].unique()))),
        ticktext=cluster_df['Country'].unique()
    )
    
    # Add a storytelling annotation
    fig.add_annotation(
        x=0.5,
        y=-0.4,
        xref="paper",
        yref="paper",
        text=f"<i>Cluster Insight:</i> Countries are grouped by similar performance patterns",
        showarrow=False,
        font=dict(
            family="'Segoe UI', italic",
            size=12,
            color=COLORS["secondary"]
        ),
        align="center",
        bgcolor=COLORS["secondary-light"],
        bordercolor=COLORS["secondary"],
        borderwidth=1,
        borderpad=4
    )

```

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 9, 2025, 1:39pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/18 "2025-05-09T13:39:29Z")

</div>

Hi Ester,

I like your application. Excellent topic you chose (Environmental Quality),. If you add the other indicators (‘Exposed to air pollution’,‘Exposure to extreme temperature’), it would make for a very complete story. 💪 💪

---

<div class="post-metadata">

**Author:** ![Ester](https://avatars.discourse-cdn.com/v4/letter/e/f04885/32.png) [@Ester](https://community.plotly.com/u/Ester)\
**Post date:** [May 9, 2025, 1:49pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/19 "2025-05-09T13:49:16Z")

</div>

Thank you, unfortunately I don’t have time for it today. See you next time. 🙂 Your work is better with more tabs!

---

<div class="post-metadata">

**Author:** ![Avacsiglo21](https://sea2.discourse-cdn.com/flex024/user_avatar/community.plotly.com/avacsiglo21/32/29861_2.png) [@Avacsiglo21](https://community.plotly.com/u/Avacsiglo21)\
**Post date:** [May 9, 2025, 1:59pm UTC](https://community.plotly.com/t/figure-friday-2025-week-18/92102/20 "2025-05-09T13:59:15Z")

</div>

Ester as it is works perfectly, it achieves the objective. It’s not about having more content to be better, they are two different approaches and that’s the point. Good job. 🥰

[Next page](https://community.plotly.com/t/figure-friday-2025-week-18/92102.md?page=2)
