forked from streamlit/streamlit-example
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchart_by_block.py
116 lines (90 loc) · 4.1 KB
/
chart_by_block.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
from chart_base import ChartBase
from urval import UrvalsLista
import pandas as pd
import altair as alt
from altair import datum
from grunddata import Grunddata
class ChartByBlockBase(ChartBase):
def __init__(self, data: pd.DataFrame, title: str, subtitle, urval: UrvalsLista, lookup_block: pd.DataFrame, spärr: bool=True):
self.spärr = spärr
self.lookup_block = lookup_block
super().__init__(data=data, title=title, subtitle=subtitle, urval=urval)
def add_transform_fold(self):
self.add_tranform_fold_wide_to_long_by_party()
def add_transform_lookup(self):
self.c = self.c.transform_lookup(lookup='Parti', from_=alt.LookupData(self.lookup_block, key='Parti', fields=['Block']))
def add_filter(self):
if self.spärr:
self.c = self.c.transform_filter(
(datum.medel_stöd > Grunddata.riksdagsspärr)
)
class ChartByBlockBar(ChartByBlockBase):
def add_marker(self):
self.c = self.c.mark_bar()
def add_transform_aggregate(self):
self.c = self.c.transform_aggregate(medel_stöd="mean(stöd)", groupby=["Parti"])
def add_encode(self):
self.c = self.c.encode(
x=alt.X(
"Block:O",
scale=alt.Scale(domain=Grunddata.blocknamn),
),
y=alt.Y("medel_stöd:Q", title="Procent"),
color= self.get_alt_color_by_parti_and_urval(orient='right'),
tooltip=["Parti:N", "medel_stöd:Q"],
)
class ChartByBlockAddText(ChartByBlockBase):
def __init__(self, data: pd.DataFrame, urval: UrvalsLista, lookup_block: pd.DataFrame, spärr: bool):
super().__init__(data, title = '', subtitle= '', urval=urval, lookup_block=lookup_block, spärr=spärr)
def add_transform_aggregate(self):
self.c = self.c.transform_aggregate(medel_stöd="mean(stöd)", groupby=["Parti"])
def add_marker(self):
self.c = self.c.mark_text(dx=0, baseline="middle", dy=-8, color="darkslategrey")
def add_encode(self):
self.c = self.c.encode(
x=alt.X("Block:O", stack="zero"),
y=alt.Y("sum(medel_stöd):Q"),
text=alt.Text("sum(medel_stöd):Q", format=".1f"),
)
class ChartByBlockDateTimeSeries(ChartByBlockBase):
def add_marker(self):
self.c = self.c.mark_circle(opacity=0.35, size=32)
def add_transform_aggregate(self):
self.c = self.c.transform_aggregate(medel_stöd="mean(stöd)", groupby=["Publiceringsdatum", "Parti", "Institut"])
def add_encode(self):
y_uttryck = "sum(medel_stöd):Q"
datum_uttryck = "Publiceringsdatum:T"
self.c = self.c.encode(
x=alt.X(datum_uttryck, title="Månad"),
y=alt.Y(y_uttryck, title="Procent", scale=alt.Scale(domain=(43, 55))),
color = alt.Color(
"Block:O",
scale=alt.Scale(
domain=Grunddata.blocknamn,
range=["#FF8080", "#80C0FF"],
),
legend=alt.Legend(orient='top'),
),
tooltip=[y_uttryck, "Block:O", "Institut", datum_uttryck],
)
class ChartByBlockDateTimeSeriesLine(ChartByBlockBase):
def add_marker(self):
self.c = self.c.mark_line(size=1.8, opacity=1)
def add_transform_aggregate(self):
self.c = self.c.transform_aggregate(medel_stöd="mean(stöd)", groupby=["Publiceringsdatum", "Parti"])
def add_encode(self):
y_uttryck = "sum(medel_stöd):Q"
datum_uttryck = "Publiceringsdatum:T"
self.c = self.c.encode(
x=alt.X(datum_uttryck, title="Månad"),
y=alt.Y(y_uttryck, title="Procent", scale=alt.Scale(domain=(43, 55))),
color = alt.Color(
"Block:O",
scale=alt.Scale(
domain=Grunddata.blocknamn,
range=["#FF8080", "#80C0FF"],
),
legend=alt.Legend(orient='top'),
),
tooltip=[y_uttryck, "Block:O", datum_uttryck],
)