| import marimo |
|
|
| __generated_with = "0.13.0" |
| app = marimo.App(width="full") |
|
|
|
|
| @app.cell |
| def _(): |
| import marimo as mo |
| import pandas as pd |
| import plotly.graph_objects as go |
| from sklearn.preprocessing import MinMaxScaler |
| import matplotlib.cm as cm |
| import matplotlib.colors as mcolors |
| return cm, go, mcolors, mo, pd, MinMaxScaler |
|
|
|
|
| @app.cell |
| def _(MinMaxScaler, pd): |
| |
| df = pd.read_excel("plant_species_richness.xlsx") |
|
|
| |
| radar_cols = [ |
| "Woody_Spps", |
| "Veg_Spps", |
| "Bryo_Spps", |
| "Coffee structure index", |
| "Coffee density in 30 x 30m plot", |
| "Coffee dominance", |
| ] |
|
|
| |
| scaler = MinMaxScaler() |
| df_scaled = df.copy() |
| df_scaled[radar_cols] = scaler.fit_transform(df[radar_cols]) |
|
|
| site_options = df["Site ID"].tolist() |
| return df, df_scaled, radar_cols, site_options |
|
|
|
|
| @app.cell |
| def _(mo, site_options): |
| |
| mo.md("# Radar Chart – Site Comparison") |
| return |
|
|
|
|
| @app.cell |
| def _(mo, site_options): |
| selected_sites = mo.ui.multiselect( |
| options=site_options, |
| value=[site_options[0], site_options[1]], |
| label="Select sites to compare", |
| ) |
| selected_sites |
| return (selected_sites,) |
|
|
|
|
| @app.cell |
| def _(cm, df, df_scaled, go, mcolors, mo, radar_cols, selected_sites): |
| |
| _cmap = cm.get_cmap("Blues", 256) |
|
|
| def get_color(rank, total): |
| norm = rank / max(total - 1, 1) |
| return mcolors.to_hex(_cmap(0.3 + 0.7 * norm)) |
|
|
| |
| selected_df = df[df["Site ID"].isin(selected_sites.value)].copy() |
| selected_df = selected_df.sort_values("Mean_CC_Yield") |
| n = len(selected_df) |
|
|
| |
| fig = go.Figure() |
|
|
| for i, (_, row) in enumerate(selected_df.iterrows()): |
| site = row["Site ID"] |
| yield_value = row["Mean_CC_Yield"] |
| row_scaled = df_scaled[df_scaled["Site ID"] == site] |
| values = row_scaled[radar_cols].values.flatten().tolist() |
| values += values[:1] |
| labels = radar_cols + [radar_cols[0]] |
| color = get_color(i, n) |
|
|
| fig.add_trace( |
| go.Scatterpolar( |
| r=values, |
| theta=labels, |
| fill="toself", |
| name=f"{site} (Yield: {yield_value:.0f})", |
| line=dict(color=color, width=3), |
| opacity=0.85, |
| hovertemplate=( |
| "<b>%{theta}</b><br>" |
| "Normalized value: %{r:.2f}<extra></extra>" |
| ), |
| ) |
| ) |
|
|
| fig.update_layout( |
| polar=dict(radialaxis=dict(visible=True, range=[0, 1])), |
| showlegend=True, |
| height=700, |
| ) |
|
|
| mo.ui.plotly(fig) |