Source code for mesa.visualization.modules.PieChartVisualization

"""
Pie Chart Module
============

Module for drawing live-updating pie charts using d3.js
"""
import json

from mesa.visualization.ModularVisualization import D3_JS_FILE, VisualizationElement


[docs]class PieChartModule(VisualizationElement): """Each chart can visualize one set of fields from a datacollector as a pie chart. Attributes: fields: A list of dictionaries containing information on fields to plot. Each dictionary must contain (at least) the "Label" and "Color" keys. The "Label" value must correspond to a model-level field collected by the model's DataCollector, and "Color" must have a valid HTML color. canvas_height, canvas_width: The width and height to draw the chart on the page, in pixels. Default to 500 x 500 data_collector_name: Name of the DataCollector object in the model to retrieve data from. """ package_includes = [D3_JS_FILE, "PieChartModule.js"] def __init__( self, fields, canvas_height=500, canvas_width=500, data_collector_name="datacollector", ): """ Create a new line chart visualization. Args: fields: A list of dictionaries containing fields names and HTML colors to chart them in, e.g. [{"Label": "happy", "Color": "Black"},] canvas_height, canvas_width: Size in pixels of the chart to draw. data_collector_name: Name of the DataCollector to use. """ self.fields = fields self.canvas_height = canvas_height self.canvas_width = canvas_width self.data_collector_name = data_collector_name fields_json = json.dumps(self.fields) new_element = "new PieChartModule({}, {}, {})" new_element = new_element.format(fields_json, canvas_width, canvas_height) self.js_code = "elements.push(" + new_element + ");"
[docs] def render(self, model): current_values = [] data_collector = getattr(model, self.data_collector_name) for s in self.fields: name = s["Label"] try: val = data_collector.model_vars[name][-1] # Latest value except (IndexError, KeyError): val = 0 current_values.append(val) return current_values