|
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 = 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() |
|
|