CoolFace
Apppublic

Thecolorchanges/Python

sourceHugging Faceapache-2.0updated 3y agoView on Hugging Face
0likes
app.py140 linesDownload Raw Back to root
1from pathlib import Path2from typing import List3 4import pandas as pd5import seaborn as sns6import shinyswatch7from colors import bg_palette, palette8 9import shiny.experimental as x10from shiny import App, Inputs, Outputs, Session, reactive, render, req, ui11 12sns.set_theme()13 14www_dir = Path(__file__).parent.resolve() / "www"15 16df = pd.read_csv(Path(__file__).parent / "penguins.csv", na_values="NA")17numeric_cols: List[str] = df.select_dtypes(include=["float64"]).columns.tolist()18species: List[str] = df["Species"].unique().tolist()19species.sort()20 21app_ui = x.ui.page_fillable(22    shinyswatch.theme.minty(),23    x.ui.layout_sidebar(24        x.ui.sidebar(25            # Artwork by @allison_horst26            ui.input_selectize(27                "xvar",28                "X variable",29                numeric_cols,30                selected="Bill Length (mm)",31            ),32            ui.input_selectize(33                "yvar",34                "Y variable",35                numeric_cols,36                selected="Bill Depth (mm)",37            ),38            ui.input_checkbox_group(39                "species", "Filter by species", species, selected=species40            ),41            ui.hr(),42            ui.input_switch("by_species", "Show species", value=True),43            ui.input_switch("show_margins", "Show marginal plots", value=True),44        ),45        ui.output_ui("value_boxes"),46        x.ui.output_plot("scatter", fill=True),47        ui.help_text(48            "Artwork by ",49            ui.a("@allison_horst", href="https://twitter.com/allison_horst"),50            class_="text-end",51        ),52        fill=True,53        fillable=True,54    ),55)56 57 58def server(input: Inputs, output: Outputs, session: Session):59    @reactive.Calc60    def filtered_df() -> pd.DataFrame:61        """Returns a Pandas data frame that includes only the desired rows"""62 63        # This calculation "req"uires that at least one species is selected64        req(len(input.species()) > 0)65 66        # Filter the rows so we only include the desired species67        return df[df["Species"].isin(input.species())]68 69    @output70    @render.plot71    def scatter():72        """Generates a plot for Shiny to display to the user"""73 74        # The plotting function to use depends on whether margins are desired75        plotfunc = sns.jointplot if input.show_margins() else sns.scatterplot76 77        plotfunc(78            data=filtered_df(),79            x=input.xvar(),80            y=input.yvar(),81            palette=palette,82            hue="Species" if input.by_species() else None,83            hue_order=species,84            legend=False,85        )86 87    @output88    @render.ui89    def value_boxes():90        df = filtered_df()91 92        def penguin_value_box(title: str, count: int, bgcol: str, showcase_img: str):93            return x.ui.value_box(94                title,95                count,96                {"class_": "pt-1 pb-0"},97                showcase=x.ui.bind_fill_role(98                    ui.tags.img(99                        {"style": "object-fit:contain;"},100                        src=showcase_img,101                    ),102                    item=True,103                ),104                theme_color=None,105                style=f"background-color: {bgcol};",106                height="90px",107                full_screen=True,108            )109 110        if not input.by_species():111            return penguin_value_box(112                "Penguins",113                len(df.index),114                bg_palette["default"],115                # Artwork by @allison_horst116                showcase_img="penguins.png",117            )118 119        value_boxes = [120            penguin_value_box(121                name,122                len(df[df["Species"] == name]),123                bg_palette[name],124                # Artwork by @allison_horst125                showcase_img=f"{name}.png",126            )127            for name in species128            # Only include boxes for _selected_ species129            if name in input.species()130        ]131 132        return x.ui.layout_column_wrap(1 / len(value_boxes), *value_boxes)133 134 135app = App(136    app_ui,137    server,138    static_assets=str(www_dir),139)140