Skip to content

Commit

Permalink
Fix multi sourced belief charts (#228)
Browse files Browse the repository at this point in the history
Multi-sourced beliefs now overlap rather than stack, and chart defaults are refactored to entire field definitions.


* Use full string representation for DataSource in JSON

* Update default chart to handle showing beliefs from multiple sources

* Refactor default field definition titles

* Move to setting defaults for entire field definitions, and add test
  • Loading branch information
Flix6x committed Nov 2, 2021
1 parent da25054 commit 4f29029
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 16 deletions.
27 changes: 14 additions & 13 deletions flexmeasures/data/models/charts/belief_charts.py
@@ -1,27 +1,28 @@
from flexmeasures.data.models.charts.defaults import TIME_TITLE, TIME_TOOLTIP_TITLE
from flexmeasures.data.models.charts.defaults import FIELD_DEFINITIONS


def bar_chart(title: str, quantity: str = "unknown quantity", unit: str = "a.u."):
if not unit:
unit = "a.u."
event_value_field_definition = dict(
title=f"{quantity} ({unit})",
format=".3s",
stack=None,
**FIELD_DEFINITIONS["event_value"],
)
return {
"description": "A simple bar chart.",
"title": title,
"mark": "bar",
"encoding": {
"x": {"field": "event_start", "type": "T", "title": TIME_TITLE},
"y": {
"field": "event_value",
"type": "quantitative",
"title": quantity + " (" + unit + ")",
},
"x": FIELD_DEFINITIONS["event_start"],
"y": event_value_field_definition,
"color": FIELD_DEFINITIONS["source"],
"opacity": {"value": 0.7},
"tooltip": [
{"field": "full_date", "title": TIME_TOOLTIP_TITLE, "type": "nominal"},
{
"field": "event_value",
"title": quantity + " (" + unit + ")",
"type": "quantitative",
},
FIELD_DEFINITIONS["full_date"],
event_value_field_definition,
FIELD_DEFINITIONS["source"],
],
},
}
23 changes: 21 additions & 2 deletions flexmeasures/data/models/charts/defaults.py
Expand Up @@ -9,9 +9,28 @@
REDUCED_HEIGHT = REDUCED_WIDTH = 60
SELECTOR_COLOR = "darkred"
TIME_FORMAT = "%I:%M %p on %A %b %e, %Y"
TIME_TOOLTIP_TITLE = "Time and date"
TIME_TITLE = None
TIME_SELECTION_TOOLTIP = "Click and drag to select a time window"
FIELD_DEFINITIONS = {
"event_start": dict(
field="event_start",
type="temporal",
title=None,
),
"event_value": dict(
field="event_value",
type="quantitative",
),
"source": dict(
field="source",
type="ordinal",
title="Source",
),
"full_date": dict(
field="full_date",
type="nominal",
title="Time and date",
),
}


def apply_chart_defaults(fn):
Expand Down
9 changes: 9 additions & 0 deletions flexmeasures/data/models/charts/test_chart_defaults.py
@@ -0,0 +1,9 @@
import altair as alt

from flexmeasures.data.models.charts.defaults import FIELD_DEFINITIONS


def test_default_encodings():
"""Check default encodings for valid vega-lite specifications."""
for field_name, field_definition in FIELD_DEFINITIONS.items():
assert alt.StringFieldDefWithCondition(**field_definition)
2 changes: 1 addition & 1 deletion flexmeasures/data/models/time_series.py
Expand Up @@ -97,7 +97,7 @@ def search_beliefs(
)
if as_json:
df = bdf.reset_index()
df["source"] = df["source"].apply(lambda x: x.name)
df["source"] = df["source"].astype(str)
return df.to_json(orient="records")
return bdf

Expand Down

0 comments on commit 4f29029

Please sign in to comment.