diff --git a/mesa/experimental/jupyter_viz.py b/mesa/experimental/jupyter_viz.py index 96970b8c56b..77122cdb7ef 100644 --- a/mesa/experimental/jupyter_viz.py +++ b/mesa/experimental/jupyter_viz.py @@ -51,6 +51,23 @@ def make_model(): set_current_step(0) return model + def calculate_space_size(): + if model_parameters["N"] > 50: + fixed_size = int(model_parameters["N"] / 5) + model_parameters.update({"width": fixed_size, "height": fixed_size}) + plt.rcParams["figure.figsize"] = (fixed_size, fixed_size) + + def calculate_agent_size(): + fill_fraction_high = ( + 0.5 # maintain this aspect ration b/w agent size and space size + ) + aspect_ratio_low = 0.1 # + print() + size_of_agent = fill_fraction_high * ( + model_parameters["width"] * model_parameters["height"] + ) + return size_of_agent + reset_counter = solara.use_reactive(0) model = solara.use_memo( make_model, dependencies=[*list(model_parameters.values()), reset_counter.value] @@ -61,20 +78,28 @@ def handle_change_model_params(name: str, value: any): # 3. Set up UI solara.Markdown(name) + + # 4. Calculate space size and scale agents + + calculate_space_size() + ag_size = calculate_agent_size() + print(ag_size) + UserInputs(user_params, on_change=handle_change_model_params) ModelController(model, play_interval, current_step, set_current_step, reset_counter) - with solara.GridFixed(columns=2): - # 4. Space + with solara.Row(): + # 5. Space if space_drawer == "default": # draw with the default implementation - make_space(model, agent_portrayal) + make_space(model, agent_portrayal, ag_size=ag_size) elif space_drawer: # if specified, draw agent space with an alternate renderer space_drawer(model, agent_portrayal) # otherwise, do nothing (do not draw space) - # 5. Plots + # 6. Plots + with solara.Row(): for measure in measures: if callable(measure): # Is a custom object @@ -234,7 +259,7 @@ def change_handler(value, name=name): raise ValueError(f"{input_type} is not a supported input type") -def make_space(model, agent_portrayal): +def make_space(model, agent_portrayal, ag_size=50): def portray(g): x = [] y = [] @@ -253,7 +278,8 @@ def portray(g): x.append(i) y.append(j) if "size" in data: - s.append(data["size"]) + print(ag_size) + s.append(ag_size) if "color" in data: c.append(data["color"]) out = {"x": x, "y": y}