David Pomerenke commited on
Commit
f52ec6e
·
1 Parent(s): b54f543

Add model history plot

Browse files
frontend/src/App.js CHANGED
@@ -8,6 +8,7 @@ import WorldMap from './components/WorldMap'
8
  import AutoComplete from './components/AutoComplete'
9
  import LanguagePlot from './components/LanguagePlot'
10
  import SpeakerPlot from './components/SpeakerPlot'
 
11
  import { Carousel } from 'primereact/carousel'
12
 
13
  function App () {
@@ -123,20 +124,22 @@ function App () {
123
  flex: '100vw 100vw 100vw',
124
  maxWidth: 'min(100vw, 800px)',
125
  alignItems: 'center',
126
- justifyContent: 'center'
 
127
  }}
128
  >
129
  <Carousel
130
  value={[
131
  <WorldMap data={data.countries} />,
132
  <LanguagePlot data={data} />,
133
- <SpeakerPlot data={data} />
 
134
  ]}
135
  numScroll={1}
136
  numVisible={1}
137
  itemTemplate={item => item}
138
  circular
139
- style={{ width: '800px', minHeight: '650px' }}
140
  />
141
  </div>
142
  </>
 
8
  import AutoComplete from './components/AutoComplete'
9
  import LanguagePlot from './components/LanguagePlot'
10
  import SpeakerPlot from './components/SpeakerPlot'
11
+ import HistoryPlot from './components/HistoryPlot'
12
  import { Carousel } from 'primereact/carousel'
13
 
14
  function App () {
 
124
  flex: '100vw 100vw 100vw',
125
  maxWidth: 'min(100vw, 800px)',
126
  alignItems: 'center',
127
+ justifyContent: 'center',
128
+ width: '100%'
129
  }}
130
  >
131
  <Carousel
132
  value={[
133
  <WorldMap data={data.countries} />,
134
  <LanguagePlot data={data} />,
135
+ <SpeakerPlot data={data} />,
136
+ <HistoryPlot data={data} />,
137
  ]}
138
  numScroll={1}
139
  numVisible={1}
140
  itemTemplate={item => item}
141
  circular
142
+ style={{ width: '100%', minHeight: '650px' }}
143
  />
144
  </div>
145
  </>
frontend/src/components/HistoryPlot.js ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { useRef, useEffect } from 'react'
2
+ import * as Plot from '@observablehq/plot'
3
+
4
+ const HistoryPlot = ({ data }) => {
5
+ const containerRef = useRef()
6
+ const models = data.model_table
7
+ .sort((a, b) => new Date(a.creation_date) - new Date(b.creation_date))
8
+ .reduce((acc, curr) => {
9
+ const last = acc[acc.length - 1]?.maxAverage || 0
10
+ acc.push({
11
+ ...curr,
12
+ maxAverage: Math.max(last, curr.average),
13
+ newRecord: curr.average > last
14
+ })
15
+ return acc
16
+ }, [])
17
+ console.log(models)
18
+ useEffect(() => {
19
+ const plot = Plot.plot({
20
+ width: 750,
21
+ height: 500,
22
+ subtitle: 'Model performance over time',
23
+ x: {
24
+ label: 'Date',
25
+ type: 'time',
26
+ tickFormat: '%Y-%m'
27
+ },
28
+ y: {
29
+ label: 'Language Proficiency Score'
30
+ },
31
+ color: {
32
+ legend: true
33
+ },
34
+ marks: [
35
+ Plot.dot(models, {
36
+ x: d => d.creation_date,
37
+ y: d => d.average,
38
+ fill: d => d.provider_name,
39
+ title: d =>
40
+ `${d.provider_name} - ${d.name} (${
41
+ d.size?.toLocaleString('en-US', { notation: 'compact' }) || '?B'
42
+ })\nPublished: ${d.creation_date}\nScore: ${d.average.toFixed(2)}`,
43
+ tip: true
44
+ }),
45
+ Plot.line(
46
+ [
47
+ ...models.filter(d => d.newRecord),
48
+ {
49
+ creation_date: new Date(),
50
+ maxAverage: models[models.length - 1].maxAverage
51
+ }
52
+ ],
53
+ {
54
+ x: d => d.creation_date,
55
+ y: d => d.maxAverage,
56
+ curve: 'step-after',
57
+ strokeOpacity: 0.5
58
+ }
59
+ )
60
+ ]
61
+ })
62
+ containerRef.current.append(plot)
63
+ return () => plot.remove()
64
+ }, [])
65
+
66
+ return (
67
+ <div
68
+ ref={containerRef}
69
+ style={{
70
+ width: '100%',
71
+ height: '100%',
72
+ display: 'flex',
73
+ alignItems: 'center',
74
+ justifyContent: 'center'
75
+ }}
76
+ />
77
+ )
78
+ }
79
+
80
+ export default HistoryPlot
results.json CHANGED
The diff for this file is too large to render. See raw diff