David Pomerenke commited on
Commit
a9e6b9b
·
1 Parent(s): 603effe

Improve plots and dataset table

Browse files
frontend/src/components/DatasetTable.js CHANGED
@@ -140,13 +140,13 @@ const DatasetTable = ({ data }) => {
140
  body={linkBodyTemplate}
141
  />
142
  <Column
143
- field='tasks'
144
- header='Tasks'
 
145
  filter
146
- filterElement={tasksRowFilterTemplate}
147
- showFilterMatchModes={false}
148
- style={{ minWidth: '10rem', maxWidth: '10rem' }}
149
- body={tasksBodyTemplate}
150
  />
151
  <Column
152
  field='translation'
@@ -158,13 +158,13 @@ const DatasetTable = ({ data }) => {
158
  body={translationBodyTemplate}
159
  />
160
  <Column
161
- field='n_languages'
162
- header='Languages'
163
- headerTooltip='Number of languages in the dataset'
164
  filter
165
- sortable
166
- style={{ minWidth: '5rem', maxWidth: '10rem' }}
167
- body={nLanguagesBodyTemplate}
 
168
  />
169
  </DataTable>
170
  )
 
140
  body={linkBodyTemplate}
141
  />
142
  <Column
143
+ field='n_languages'
144
+ header='Languages'
145
+ headerTooltip='Number of languages in the dataset'
146
  filter
147
+ sortable
148
+ style={{ minWidth: '5rem', maxWidth: '10rem' }}
149
+ body={nLanguagesBodyTemplate}
 
150
  />
151
  <Column
152
  field='translation'
 
158
  body={translationBodyTemplate}
159
  />
160
  <Column
161
+ field='tasks'
162
+ header='Tasks'
 
163
  filter
164
+ filterElement={tasksRowFilterTemplate}
165
+ showFilterMatchModes={false}
166
+ style={{ minWidth: '10rem', maxWidth: '15rem' }}
167
+ body={tasksBodyTemplate}
168
  />
169
  </DataTable>
170
  )
frontend/src/components/LanguagePlot.js CHANGED
@@ -3,32 +3,46 @@ import * as Plot from '@observablehq/plot'
3
 
4
  const LanguagePlot = ({ data }) => {
5
  const containerRef = useRef()
6
- const languages = data.language_table.filter (a => a.average > 0)
7
  const families = [...new Set(languages.map(a => a.family))]
8
 
9
  useEffect(() => {
10
  const plot = Plot.plot({
11
  width: 750,
12
  height: 500,
13
- // title: 'Proficiency of Languages by Number of Speakers',
14
  x: {
15
  label: 'Number of Speakers',
16
  type: 'log'
17
  },
18
  y: {
19
- label: 'Language Proficiency Score',
20
  },
21
  marks: [
22
  Plot.dot(languages, {
23
  x: 'speakers',
24
  y: d => d.average,
25
- r: "speakers",
26
  fill: 'family',
27
- fillOpacity: 0.5,
28
- title: d => d.language_name,
 
 
29
  tip: true
30
  }),
31
- ],
 
 
 
 
 
 
 
 
 
 
 
 
32
  })
33
  containerRef.current.append(plot)
34
  return () => plot.remove()
@@ -42,7 +56,7 @@ const LanguagePlot = ({ data }) => {
42
  height: '100%',
43
  display: 'flex',
44
  alignItems: 'center',
45
- justifyContent: 'center',
46
  }}
47
  />
48
  )
 
3
 
4
  const LanguagePlot = ({ data }) => {
5
  const containerRef = useRef()
6
+ const languages = data.language_table.filter(a => a.average > 0)
7
  const families = [...new Set(languages.map(a => a.family))]
8
 
9
  useEffect(() => {
10
  const plot = Plot.plot({
11
  width: 750,
12
  height: 500,
13
+ subtitle: 'Proficiency scores by language',
14
  x: {
15
  label: 'Number of Speakers',
16
  type: 'log'
17
  },
18
  y: {
19
+ label: 'Language Proficiency Score'
20
  },
21
  marks: [
22
  Plot.dot(languages, {
23
  x: 'speakers',
24
  y: d => d.average,
25
+ r: 'speakers',
26
  fill: 'family',
27
+ title: d =>
28
+ `${d.language_name}\n${d.speakers.toLocaleString('en-US', {
29
+ notation: 'compact'
30
+ })} speakers\nScore: ${d.average.toFixed(2)}`,
31
  tip: true
32
  }),
33
+ Plot.text(
34
+ languages.filter(a => a.speakers > 5e8),
35
+ {
36
+ x: 'speakers',
37
+ y: d => d.average,
38
+ text: d => d.language_name,
39
+ fill: 'black',
40
+ frameAnchor: 'left',
41
+ dx: 10,
42
+ marginRight: 100
43
+ }
44
+ )
45
+ ]
46
  })
47
  containerRef.current.append(plot)
48
  return () => plot.remove()
 
56
  height: '100%',
57
  display: 'flex',
58
  alignItems: 'center',
59
+ justifyContent: 'center'
60
  }}
61
  />
62
  )
frontend/src/components/SpeakerPlot.js CHANGED
@@ -3,56 +3,81 @@ import * as Plot from '@observablehq/plot'
3
 
4
  const SpeakerPlot = ({ data }) => {
5
  const containerRef = useRef()
6
- const allSpeakers = data.language_table.reduce((sum, curr) => sum + curr.speakers, 0)
7
- const languages = data.language_table.sort((a, b) => b.speakers - a.speakers).slice(0, 100).reduce((acc, d) => {
8
- acc.push({
9
- ...d,
10
- rank: acc.length + 1,
11
- cumSpeakers: acc.reduce((sum, curr) => sum + curr.speakers, 0) + d.speakers,
12
- cumSpeakersPercent: (acc.reduce((sum, curr) => sum + curr.speakers, 0) + d.speakers) / allSpeakers
13
- })
14
- return acc
15
- }, [])
 
 
 
 
 
 
 
 
 
16
 
17
  useEffect(() => {
18
  const plot = Plot.plot({
19
  width: 750,
20
  height: 500,
21
- // title: 'Proficiency of Languages by Number of Speakers',
22
  x: {
23
  label: 'Languages',
24
- ticks: [],
25
  },
26
  y: {
27
- label: 'Number of Speakers (millions)',
28
  },
29
  color: {
30
  legend: true,
31
- domain: ["Speakers", "Cumulative Speakers"],
32
- range: ["green", "lightgrey"],
33
  },
34
  marks: [
35
- Plot.barY(languages,
36
- {
37
- x: "rank",
38
  y: d => d.cumSpeakers / 1e6,
39
- fill: d => "Cumulative Speakers",
40
  sort: { x: 'y' },
41
- title: d => `The ${d.rank} most spoken languages cover\n${d.cumSpeakersPercent.toLocaleString("en-US", { style: 'percent'})} of all speakers`,
 
 
 
 
 
 
42
  tip: true // {y: d => d.cumSpeakers / 1e6 * 2}
43
  }),
44
- Plot.barY(languages,
45
- {
46
- x: "rank",
47
  y: d => d.speakers / 1e6,
48
- title: d => `${d.language_name}\n(${d.speakers.toLocaleString("en-US", {notation: 'compact', compactDisplay: 'long'})} speakers)`,
 
 
 
 
49
  tip: true,
50
- fill: d => "Speakers",
51
  sort: { x: '-y' }
52
  }),
53
- Plot.crosshairX(languages, {x: "rank", y: d => d.cumSpeakers / 1e6, textStrokeOpacity: 0, textFillOpacity: 0}),
54
- Plot.tip(["The 41 most spoken languages cover 80% of all speakers."], {x: 41, y: languages[40].cumSpeakers / 1e6})
55
- ],
 
 
 
 
 
 
 
 
56
  })
57
  containerRef.current.append(plot)
58
  return () => plot.remove()
@@ -66,7 +91,7 @@ const SpeakerPlot = ({ data }) => {
66
  height: '100%',
67
  display: 'flex',
68
  alignItems: 'center',
69
- justifyContent: 'center',
70
  }}
71
  />
72
  )
 
3
 
4
  const SpeakerPlot = ({ data }) => {
5
  const containerRef = useRef()
6
+ const allSpeakers = data.language_table.reduce(
7
+ (sum, curr) => sum + curr.speakers,
8
+ 0
9
+ )
10
+ const languages = data.language_table
11
+ .sort((a, b) => b.speakers - a.speakers)
12
+ .slice(0, 100)
13
+ .reduce((acc, d) => {
14
+ acc.push({
15
+ ...d,
16
+ rank: acc.length + 1,
17
+ cumSpeakers:
18
+ acc.reduce((sum, curr) => sum + curr.speakers, 0) + d.speakers,
19
+ cumSpeakersPercent:
20
+ (acc.reduce((sum, curr) => sum + curr.speakers, 0) + d.speakers) /
21
+ allSpeakers
22
+ })
23
+ return acc
24
+ }, [])
25
 
26
  useEffect(() => {
27
  const plot = Plot.plot({
28
  width: 750,
29
  height: 500,
30
+ subtitle: 'Number of languages vs speakers covered',
31
  x: {
32
  label: 'Languages',
33
+ ticks: []
34
  },
35
  y: {
36
+ label: 'Number of Speakers (millions)'
37
  },
38
  color: {
39
  legend: true,
40
+ domain: ['Speakers', 'Cumulative Speakers'],
41
+ range: ['green', 'lightgrey']
42
  },
43
  marks: [
44
+ Plot.barY(languages, {
45
+ x: 'rank',
 
46
  y: d => d.cumSpeakers / 1e6,
47
+ fill: d => 'Cumulative Speakers',
48
  sort: { x: 'y' },
49
+ title: d =>
50
+ `The ${
51
+ d.rank
52
+ } most spoken languages cover\n${d.cumSpeakersPercent.toLocaleString(
53
+ 'en-US',
54
+ { style: 'percent' }
55
+ )} of all speakers`,
56
  tip: true // {y: d => d.cumSpeakers / 1e6 * 2}
57
  }),
58
+ Plot.barY(languages, {
59
+ x: 'rank',
 
60
  y: d => d.speakers / 1e6,
61
+ title: d =>
62
+ `${d.language_name}\n(${d.speakers.toLocaleString('en-US', {
63
+ notation: 'compact',
64
+ compactDisplay: 'long'
65
+ })} speakers)`,
66
  tip: true,
67
+ fill: d => 'Speakers',
68
  sort: { x: '-y' }
69
  }),
70
+ Plot.crosshairX(languages, {
71
+ x: 'rank',
72
+ y: d => d.cumSpeakers / 1e6,
73
+ textStrokeOpacity: 0,
74
+ textFillOpacity: 0
75
+ }),
76
+ Plot.tip(['The 41 most spoken languages cover 80% of all speakers.'], {
77
+ x: 41,
78
+ y: languages[40].cumSpeakers / 1e6
79
+ })
80
+ ]
81
  })
82
  containerRef.current.append(plot)
83
  return () => plot.remove()
 
91
  height: '100%',
92
  display: 'flex',
93
  alignItems: 'center',
94
+ justifyContent: 'center'
95
  }}
96
  />
97
  )
frontend/src/components/WorldMap.js CHANGED
@@ -44,6 +44,7 @@ const WorldMap = ({ data }) => {
44
  return acc
45
  }, {})
46
  const plot = Plot.plot({
 
47
  width: 750,
48
  height: 500,
49
  projection: 'equal-earth',
 
44
  return acc
45
  }, {})
46
  const plot = Plot.plot({
47
+ subtitle: 'Language Proficiency Score by Country',
48
  width: 750,
49
  height: 500,
50
  projection: 'equal-earth',