| import gradio as gr | |
| import xyzservices.providers as xyz | |
| from bokeh.models import ColumnDataSource, Whisker | |
| from bokeh.plotting import figure | |
| from bokeh.sampledata.autompg2 import autompg2 as df | |
| from bokeh.sampledata.penguins import data | |
| from bokeh.transform import factor_cmap, jitter, factor_mark | |
| def get_plot(plot_type): | |
| if plot_type == "map": | |
| plot = figure( | |
| x_range=(-2000000, 6000000), | |
| y_range=(-1000000, 7000000), | |
| x_axis_type="mercator", | |
| y_axis_type="mercator", | |
| ) | |
| plot.add_tile(xyz.OpenStreetMap.Mapnik) | |
| return plot | |
| elif plot_type == "whisker": | |
| classes = list(sorted(df["class"].unique())) | |
| p = figure( | |
| height=400, | |
| x_range=classes, | |
| background_fill_color="#efefef", | |
| title="Car class vs HWY mpg with quintile ranges", | |
| ) | |
| p.xgrid.grid_line_color = None | |
| g = df.groupby("class") | |
| upper = g.hwy.quantile(0.80) | |
| lower = g.hwy.quantile(0.20) | |
| source = ColumnDataSource(data=dict(base=classes, upper=upper, lower=lower)) | |
| error = Whisker( | |
| base="base", | |
| upper="upper", | |
| lower="lower", | |
| source=source, | |
| level="annotation", | |
| line_width=2, | |
| ) | |
| error.upper_head.size = 20 | |
| error.lower_head.size = 20 | |
| p.add_layout(error) | |
| p.circle( | |
| jitter("class", 0.3, range=p.x_range), | |
| "hwy", | |
| source=df, | |
| alpha=0.5, | |
| size=13, | |
| line_color="white", | |
| color=factor_cmap("class", "Light6", classes), | |
| ) | |
| return p | |
| elif plot_type == "scatter": | |
| SPECIES = sorted(data.species.unique()) | |
| MARKERS = ["hex", "circle_x", "triangle"] | |
| p = figure(title="Penguin size", background_fill_color="#fafafa") | |
| p.xaxis.axis_label = "Flipper Length (mm)" | |
| p.yaxis.axis_label = "Body Mass (g)" | |
| p.scatter( | |
| "flipper_length_mm", | |
| "body_mass_g", | |
| source=data, | |
| legend_group="species", | |
| fill_alpha=0.4, | |
| size=12, | |
| marker=factor_mark("species", MARKERS, SPECIES), | |
| color=factor_cmap("species", "Category10_3", SPECIES), | |
| ) | |
| p.legend.location = "top_left" | |
| p.legend.title = "Species" | |
| return p | |
| with gr.Blocks() as demo: | |
| with gr.Row(): | |
| plot_type = gr.Radio(value="scatter", choices=["scatter", "whisker", "map"]) | |
| plot = gr.Plot() | |
| plot_type.change(get_plot, inputs=[plot_type], outputs=[plot]) | |
| demo.load(get_plot, inputs=[plot_type], outputs=[plot]) | |
| if __name__ == "__main__": | |
| demo.launch() | |