@cdc/chart 4.25.3 → 4.25.5-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cdcchart.js +36051 -36995
  2. package/index.html +2 -1
  3. package/package.json +22 -27
  4. package/src/CdcChartComponent.tsx +10 -10
  5. package/src/_stories/Chart.CI.stories.tsx +10 -0
  6. package/src/_stories/Chart.DynamicSeries.stories.tsx +68 -49
  7. package/src/_stories/Chart.stories.tsx +7 -0
  8. package/{examples/private/line-issue.json → src/_stories/_mock/barchart_labels.mock.json} +150 -35
  9. package/src/_stories/_mock/dynamic_series_bar_config.json +1 -1
  10. package/src/_stories/_mock/dynamic_series_suppression_mock.json +610 -0
  11. package/src/components/Annotations/components/AnnotationDropdown.tsx +2 -2
  12. package/src/components/AreaChart/components/AreaChart.jsx +33 -5
  13. package/src/components/Axis/Categorical.Axis.tsx +2 -2
  14. package/src/components/BarChart/components/BarChart.Horizontal.tsx +50 -40
  15. package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +18 -8
  16. package/src/components/BarChart/components/BarChart.StackedVertical.tsx +19 -8
  17. package/src/components/BarChart/components/BarChart.Vertical.tsx +47 -30
  18. package/src/components/BarChart/components/{BarChart.jsx → BarChart.tsx} +23 -5
  19. package/src/components/BarChart/components/context.tsx +20 -2
  20. package/src/components/BarChart/helpers/getBarHeights.ts +47 -0
  21. package/src/components/BarChart/helpers/index.ts +5 -2
  22. package/src/components/BarChart/helpers/tests/getBarHeights.test.ts +83 -0
  23. package/src/{hooks → components/BarChart/helpers}/useBarChart.ts +9 -46
  24. package/src/components/BoxPlot/BoxPlot.tsx +2 -1
  25. package/src/components/DeviationBar.jsx +2 -1
  26. package/src/components/EditorPanel/components/Panels/Panel.General.tsx +34 -34
  27. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +51 -25
  28. package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +10 -3
  29. package/src/components/EditorPanel/useEditorPermissions.ts +1 -4
  30. package/src/components/ForestPlot/ForestPlot.tsx +2 -2
  31. package/src/components/Legend/Legend.Component.tsx +1 -1
  32. package/src/components/Legend/Legend.Suppression.tsx +12 -22
  33. package/src/components/Legend/helpers/createFormatLabels.tsx +28 -0
  34. package/src/components/LineChart/LineChartProps.ts +3 -1
  35. package/src/components/LineChart/components/LineChart.Circle.tsx +72 -119
  36. package/src/components/LineChart/helpers.ts +133 -56
  37. package/src/components/LineChart/index.tsx +107 -53
  38. package/src/components/LinearChart.tsx +40 -89
  39. package/src/components/PairedBarChart.jsx +3 -2
  40. package/src/components/PieChart/PieChart.tsx +71 -91
  41. package/src/components/ScatterPlot/ScatterPlot.jsx +5 -0
  42. package/src/components/Sparkline/components/SparkLine.tsx +80 -18
  43. package/src/components/ZoomBrush.tsx +4 -4
  44. package/src/data/initial-state.js +3 -1
  45. package/src/helpers/countNumOfTicks.ts +1 -1
  46. package/src/helpers/dataHelpers.ts +23 -2
  47. package/src/helpers/sizeHelpers.ts +1 -1
  48. package/src/hooks/useMinMax.ts +21 -28
  49. package/src/hooks/useRightAxis.ts +4 -2
  50. package/src/hooks/useScales.ts +10 -6
  51. package/src/hooks/useTooltip.tsx +204 -203
  52. package/src/index.jsx +2 -2
  53. package/src/scss/main.scss +13 -6
  54. package/src/types/ChartConfig.ts +5 -0
  55. package/LICENSE +0 -201
  56. package/examples/private/DEV-8850-2.json +0 -493
  57. package/examples/private/DEV-9822.json +0 -574
  58. package/examples/private/DEV-9840.json +0 -553
  59. package/examples/private/DEV-9850-3.json +0 -461
  60. package/examples/private/chart.json +0 -1084
  61. package/examples/private/ci_formatted.json +0 -202
  62. package/examples/private/ci_issue.json +0 -3016
  63. package/examples/private/completed.json +0 -634
  64. package/examples/private/dem-data-long.csv +0 -20
  65. package/examples/private/dem-data-long.json +0 -36
  66. package/examples/private/demographic_data.csv +0 -157
  67. package/examples/private/demographic_data.json +0 -2654
  68. package/examples/private/demographic_dynamic.json +0 -443
  69. package/examples/private/demographic_standard.json +0 -560
  70. package/examples/private/ehdi.json +0 -29939
  71. package/examples/private/not-loading.json +0 -360
  72. package/examples/private/test.json +0 -493
package/index.html CHANGED
@@ -45,7 +45,8 @@
45
45
  -->
46
46
 
47
47
  <!-- GENERIC CHART TYPES -->
48
- <div class="react-container" data-config="/examples/private/ari-other-conditions-1.json"></div>
48
+ <!-- <div class="react-container" data-config="/examples/private/ari-other-conditions-1.json"></div> -->
49
+ <!-- <div class="react-container" data-config="/examples/private/Viral-Respiratory-Deaths-Age.json"></div> -->
49
50
  <!-- <div class="react-container" data-config="/examples/cases-year.json"></div>-->
50
51
  <!-- <div class="react-container" data-config="/examples/test.json"></div> -->
51
52
  <!-- <div class="react-container" data-config="/examples/feature/line/line-chart.json"></div> -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdc/chart",
3
- "version": "4.25.3",
3
+ "version": "4.25.5-1",
4
4
  "description": "React component for visualizing tabular data in various types of charts",
5
5
  "moduleName": "CdcChart",
6
6
  "main": "dist/cdcchart",
@@ -27,43 +27,38 @@
27
27
  "license": "Apache-2.0",
28
28
  "dependencies": {
29
29
  "@hello-pangea/dnd": "^16.2.0",
30
- "@visx/axis": "^3.0.0",
31
- "@visx/curve": "^3.0.0",
32
- "@visx/event": "^3.0.1",
33
- "@visx/glyph": "^3.3.0",
34
- "@visx/gradient": "^3.0.0",
35
- "@visx/group": "^3.0.0",
36
- "@visx/legend": "^3.0.0",
37
- "@visx/marker": "^3.0.0",
38
- "@visx/mock-data": "^3.0.0",
39
- "@visx/scale": "^3.0.0",
40
- "@visx/shape": "^3.3.0",
41
- "@visx/stats": "^3.0.0",
42
- "@visx/text": "^3.0.0",
43
- "@visx/tooltip": "^3.0.0",
44
- "chroma-js": "^2.1.2",
45
- "d3-array": "^2.8.0",
30
+ "@react-spring/web": "^9.7.5",
31
+ "@visx/axis": "3.12.0",
32
+ "@visx/curve": "3.12.0",
33
+ "@visx/event": "3.12.0",
34
+ "@visx/glyph": "3.12.0",
35
+ "@visx/gradient": "3.12.0",
36
+ "@visx/marker": "3.12.0",
37
+ "@visx/mock-data": "3.12.0",
38
+ "@visx/scale": "3.12.0",
39
+ "@visx/shape": "3.12.0",
40
+ "@visx/stats": "3.12.0",
41
+ "@visx/text": "3.12.0",
42
+ "@visx/tooltip": "3.12.0",
43
+ "d3-array": "3.2.4",
46
44
  "d3-format": "^3.1.0",
47
45
  "d3-sankey": "^0.12.3",
48
- "d3-time-format": "^3.0.0",
49
- "html-react-parser": "^3.0.8",
46
+ "d3-time-format": "4.1.0",
50
47
  "js-base64": "^2.5.2",
51
- "papaparse": "^5.3.0",
52
48
  "react-accessible-accordion": "^3.3.4",
53
- "react-icons": "^4.11.0",
54
- "react-spring": "^8.0.27",
55
- "react-table": "^7.5.0",
56
- "react-tooltip": "5.8.2-beta.3",
57
- "use-debounce": "^6.0.1",
58
- "whatwg-fetch": "^3.6.2"
49
+ "react-icons": "5.5.0",
50
+ "use-debounce": "^6.0.1"
59
51
  },
60
52
  "peerDependencies": {
61
53
  "react": "^18.2.0",
62
54
  "react-dom": "^18.2.0"
63
55
  },
64
- "gitHead": "b09566f5a7d57c8d0109e5f407257729d6b36846",
56
+ "gitHead": "1d0a6e716bc113e6bea3636fcae90ebf2d19bb5c",
65
57
  "devDependencies": {
58
+ "@types/d3-array": "^3.2.1",
59
+ "@types/d3-format": "^3.0.4",
66
60
  "@types/d3-sankey": "^0.12.4",
61
+ "@types/d3-time-format": "^4.0.3",
67
62
  "resize-observer-polyfill": "^1.5.1"
68
63
  }
69
64
  }
@@ -64,6 +64,7 @@ import getViewport from '@cdc/core/helpers/getViewport'
64
64
  import isNumber from '@cdc/core/helpers/isNumber'
65
65
  import coveUpdateWorker from '@cdc/core/helpers/coveUpdateWorker'
66
66
  import EditorContext from '../../editor/src/ConfigContext'
67
+ import { EDITOR_WIDTH } from '@cdc/core/helpers/constants'
67
68
  // Local helpers
68
69
  import { isConvertLineToBarGraph } from './helpers/isConvertLineToBarGraph'
69
70
  import { getBoxPlotConfig } from './helpers/getBoxPlotConfig'
@@ -74,8 +75,6 @@ import { getColorScale } from './helpers/getColorScale'
74
75
  import './scss/main.scss'
75
76
  import { getInitialState, reducer } from './store/chart.reducer'
76
77
 
77
- export const EDITOR_WIDTH = 350
78
-
79
78
  interface CdcChartProps {
80
79
  config?: ChartConfig
81
80
  isEditor?: boolean
@@ -142,8 +141,6 @@ const CdcChart: React.FC<CdcChartProps> = ({
142
141
  dispatch({ type: 'SET_DRAG_ANNOTATIONS', payload: isDragging })
143
142
  }
144
143
 
145
- if (isDebug) console.log('Chart config, isEditor', config, isEditor)
146
-
147
144
  // Destructure items from config for more readable JSX
148
145
  let { legend, title } = config
149
146
 
@@ -280,14 +277,15 @@ const CdcChart: React.FC<CdcChartProps> = ({
280
277
  newConfig.series.forEach(series => {
281
278
  newConfig.runtime.areaSeriesKeys.push({ ...series, type: 'Area Chart' })
282
279
  })
280
+ newConfig.visualizationSubType = 'stacked'
283
281
  }
284
282
 
285
283
  if (
286
284
  (newConfig.visualizationType === 'Bar' && newConfig.orientation === 'horizontal') ||
287
285
  ['Deviation Bar', 'Paired Bar', 'Forest Plot'].includes(newConfig.visualizationType)
288
286
  ) {
289
- newConfig.runtime.xAxis = newConfig.yAxis['yAxis'] ? newConfig.yAxis['yAxis'] : newConfig.yAxis
290
- newConfig.runtime.yAxis = newConfig.xAxis['xAxis'] ? newConfig.xAxis['xAxis'] : newConfig.xAxis
287
+ newConfig.runtime.xAxis = _.cloneDeep(newConfig.yAxis.yAxis || newConfig.yAxis)
288
+ newConfig.runtime.yAxis = _.cloneDeep(newConfig.xAxis.xAxis || newConfig.xAxis)
291
289
  newConfig.runtime.yAxis.labelOffset *= -1
292
290
 
293
291
  newConfig.runtime.horizontal = false
@@ -397,17 +395,16 @@ const CdcChart: React.FC<CdcChartProps> = ({
397
395
  newConfig.data = transform.developerStandardize(newConfig.data, newConfig.dataDescription)
398
396
  }
399
397
  } catch (err) {
400
- console.log('Error on prepareData function ', err)
398
+ console.error('Error on prepareData function ', err)
401
399
  }
402
400
  return newConfig
403
401
  }
404
-
405
402
  useEffect(() => {
406
403
  const load = async () => {
407
404
  try {
408
405
  if (configObj) {
409
406
  const preparedConfig = await prepareConfig(configObj)
410
- let preppedData = await prepareData(preparedConfig)
407
+ const preppedData = await prepareData(preparedConfig)
411
408
  dispatch({ type: 'SET_STATE_DATA', payload: preppedData.data })
412
409
  dispatch({ type: 'SET_EXCLUDED_DATA', payload: preppedData.data })
413
410
  updateConfig(preparedConfig, preppedData.data)
@@ -883,7 +880,10 @@ const CdcChart: React.FC<CdcChartProps> = ({
883
880
  className={
884
881
  legend.hide || isLegendWrapViewport(currentViewport)
885
882
  ? 'w-100'
886
- : legend.position === 'bottom' || legend.position === 'top' || visualizationType === 'Sankey'
883
+ : legend.position === 'bottom' ||
884
+ legend.position === 'top' ||
885
+ visualizationType === 'Sankey' ||
886
+ visualizationType === 'Spark Line'
887
887
  ? 'w-100'
888
888
  : 'w-75'
889
889
  }
@@ -16,6 +16,16 @@ export const bar_chart_with_labels: Story = {
16
16
  isEditor: false
17
17
  }
18
18
  }
19
+ export const bar_chart_horizontal_labels: Story = {
20
+ args: {
21
+ config: {
22
+ ...barChartCiLabels,
23
+ orientation: 'horizontal',
24
+ yAxis: { ...barChartCiLabels.yAxis, displayNumbersOnBar: true }
25
+ },
26
+ isEditor: false
27
+ }
28
+ }
19
29
 
20
30
  export const line_Chart_Dynamic_Confidence_Intervals: Story = {
21
31
  args: {
@@ -1,49 +1,68 @@
1
- import DynamicSeriesConfig from './_mock/dynamic_series_config.json'
2
- import DynamicSeriesBarConfig from './_mock/dynamic_series_bar_config.json'
3
- import { Meta, StoryObj } from '@storybook/react'
4
- import Chart from '../CdcChartComponent'
5
-
6
- const meta: Meta<typeof Chart> = {
7
- title: 'Components/Templates/Chart/Dynamic Series',
8
- component: Chart
9
- }
10
-
11
- type Story = StoryObj<typeof Chart>
12
-
13
- // data with a line break
14
- const data = DynamicSeriesConfig.data.map((d, i) => (i === 4 ? { ...d, Data_Value: null } : d))
15
- export const LineShowPoints: Story = {
16
- args: {
17
- config: {
18
- ...DynamicSeriesConfig,
19
- data,
20
- originalFormattedData: data,
21
- formattedData: data,
22
- lineDatapointStyle: 'always show'
23
- },
24
- isEditor: false
25
- }
26
- }
27
-
28
- export const LineHoverPoints: Story = {
29
- args: {
30
- config: DynamicSeriesConfig,
31
- isEditor: false
32
- }
33
- }
34
-
35
- export const Bar_Vertical: Story = {
36
- args: {
37
- config: DynamicSeriesBarConfig,
38
- isEditor: false
39
- }
40
- }
41
-
42
- export const Bar_Horizontal: Story = {
43
- args: {
44
- config: { ...DynamicSeriesBarConfig, orientation: 'horizontal' },
45
- isEditor: false
46
- }
47
- }
48
-
49
- export default meta
1
+ import DynamicSeriesConfig from './_mock/dynamic_series_config.json'
2
+ import DynamicSeriesBarConfig from './_mock/dynamic_series_bar_config.json'
3
+ import DynamicSeriesSuppression from './_mock/dynamic_series_suppression_mock.json'
4
+ import { Meta, StoryObj } from '@storybook/react'
5
+ import Chart from '../CdcChartComponent'
6
+
7
+ const meta: Meta<typeof Chart> = {
8
+ title: 'Components/Templates/Chart/Dynamic Series',
9
+ component: Chart
10
+ }
11
+
12
+ type Story = StoryObj<typeof Chart>
13
+
14
+ // data with a line break
15
+ const data = DynamicSeriesConfig.data.map((d, i) => (i === 4 ? { ...d, Data_Value: null } : d))
16
+ export const LineShowPoints: Story = {
17
+ args: {
18
+ config: {
19
+ ...DynamicSeriesConfig,
20
+ data,
21
+ originalFormattedData: data,
22
+ formattedData: data,
23
+ lineDatapointStyle: 'always show'
24
+ },
25
+ isEditor: false
26
+ }
27
+ }
28
+
29
+ export const LineSuppression: Story = {
30
+ args: {
31
+ config: DynamicSeriesSuppression,
32
+ isEditor: false
33
+ }
34
+ }
35
+
36
+ export const LineHoverPoints: Story = {
37
+ args: {
38
+ config: DynamicSeriesConfig,
39
+ isEditor: false
40
+ }
41
+ }
42
+
43
+ export const Bar_Vertical: Story = {
44
+ args: {
45
+ config: DynamicSeriesBarConfig,
46
+ isEditor: false
47
+ }
48
+ }
49
+
50
+ export const Bar_Horizontal: Story = {
51
+ args: {
52
+ config: { ...DynamicSeriesBarConfig, orientation: 'horizontal' },
53
+ isEditor: false
54
+ }
55
+ }
56
+
57
+ export const Legend_Order: Story = {
58
+ args: {
59
+ config: {
60
+ ...DynamicSeriesBarConfig,
61
+ orientation: 'vertical',
62
+ legend: { ...DynamicSeriesBarConfig, order: 'desc' }
63
+ },
64
+ isEditor: false
65
+ }
66
+ }
67
+
68
+ export default meta
@@ -7,6 +7,7 @@ import lollipop from './_mock/lollipop.json'
7
7
  import forestPlot from '../../examples/feature/forest-plot/forest-plot.json'
8
8
  import pairedBar from './_mock/paired-bar.json'
9
9
  import horizontalBarConfig from './_mock/horizontal_bar.json'
10
+ import barChartLabels from './_mock/barchart_labels.mock.json'
10
11
  import pieConfig from './_mock/pie_with_data.json'
11
12
  import boxPlotConfig from './_mock/boxplot_multiseries.json'
12
13
  import areaChartStacked from './_mock/area_chart_stacked.json'
@@ -58,6 +59,12 @@ export const Horizontal_Bar: Story = {
58
59
  }
59
60
  }
60
61
 
62
+ export const BarChart_Labels: Story = {
63
+ args: {
64
+ config: barChartLabels
65
+ }
66
+ }
67
+
61
68
  export const Pie: Story = {
62
69
  args: {
63
70
  config: pieConfig
@@ -24,11 +24,11 @@
24
24
  "isResponsiveTicks": true,
25
25
  "general": {
26
26
  "annotationDropdownText": "Annotations",
27
- "showDownloadButton": false,
28
27
  "showMissingDataLabel": false,
29
28
  "showSuppressedSymbol": true,
30
29
  "showZeroValueData": false,
31
- "hideNullValue": true
30
+ "hideNullValue": true,
31
+ "showDownloadButton": false
32
32
  },
33
33
  "padding": {
34
34
  "left": 5,
@@ -127,8 +127,8 @@
127
127
  "dataKey": "Year",
128
128
  "label": "Year",
129
129
  "manual": true,
130
- "axisBBox": 52.939998626708984,
131
- "tickWidthMax": 41
130
+ "axisBBox": 62.779998779296875,
131
+ "tickWidthMax": 39
132
132
  },
133
133
  "table": {
134
134
  "label": "Data Table",
@@ -172,6 +172,8 @@
172
172
  "seriesHighlight": [],
173
173
  "style": "boxes",
174
174
  "subStyle": "linear blocks",
175
+ "groupBy": "",
176
+ "shape": "circle",
175
177
  "tickRotation": "",
176
178
  "hideBorder": {
177
179
  "side": false,
@@ -193,7 +195,7 @@
193
195
  "palette": "monochrome-1",
194
196
  "isPaletteReversed": false
195
197
  },
196
- "labels": false,
198
+ "labels": true,
197
199
  "dataFormat": {
198
200
  "commas": false,
199
201
  "prefix": "",
@@ -210,36 +212,14 @@
210
212
  "accent": true,
211
213
  "background": true,
212
214
  "verticalHoverLine": false,
213
- "horizontalHoverLine": false
215
+ "horizontalHoverLine": false,
216
+ "lineDatapointSymbol": "none",
217
+ "maximumShapeAmount": 7
214
218
  },
215
219
  "useLogScale": false,
216
220
  "filterBehavior": "Filter Change",
217
221
  "highlightedBarValues": [],
218
222
  "series": [
219
- {
220
- "dataKey": "American Indian/Alaska Native",
221
- "type": "Line",
222
- "axis": "Left",
223
- "tooltip": true
224
- },
225
- {
226
- "dataKey": "Asian/Pacific Islander",
227
- "type": "Line",
228
- "axis": "Left",
229
- "tooltip": true
230
- },
231
- {
232
- "dataKey": "Black, non-Hispanic",
233
- "type": "Line",
234
- "axis": "Left",
235
- "tooltip": true
236
- },
237
- {
238
- "dataKey": "White, non-Hispanic",
239
- "type": "Line",
240
- "axis": "Left",
241
- "tooltip": true
242
- },
243
223
  {
244
224
  "dataKey": "Hispanic",
245
225
  "type": "Line",
@@ -354,7 +334,7 @@
354
334
  "_owner": null
355
335
  },
356
336
  "content": "Present one or more data trends over time.",
357
- "visualizationType": "Line",
337
+ "visualizationType": "Bar",
358
338
  "datasets": {},
359
339
  "activeVizButtonID": 4,
360
340
  "data": [
@@ -490,8 +470,143 @@
490
470
  "dataFileName": "chart_data 2-6.csv",
491
471
  "dataFileSourceType": "file",
492
472
  "dataDescription": {
493
- "horizontal": true
473
+ "horizontal": false,
474
+ "series": false
494
475
  },
495
- "version": "4.24.10",
496
- "dynamicMarginTop": 0
497
- }
476
+ "version": "4.25.1",
477
+ "dynamicMarginTop": 0,
478
+ "formattedData": [
479
+ {
480
+ "Year": "2007",
481
+ "American Indian/Alaska Native": "1.4",
482
+ "Asian/Pacific Islander": "0.9",
483
+ "Black, non-Hispanic": "2.3",
484
+ "White, non-Hispanic": "1",
485
+ "Hispanic": "1"
486
+ },
487
+ {
488
+ "Year": "2008",
489
+ "American Indian/Alaska Native": "1.8",
490
+ "Asian/Pacific Islander": "0.8",
491
+ "Black, non-Hispanic": "2.2",
492
+ "White, non-Hispanic": "0.9",
493
+ "Hispanic": "0.8"
494
+ },
495
+ {
496
+ "Year": "2009",
497
+ "American Indian/Alaska Native": "1",
498
+ "Asian/Pacific Islander": "0.7",
499
+ "Black, non-Hispanic": "1.7",
500
+ "White, non-Hispanic": "0.8",
501
+ "Hispanic": "0.7"
502
+ },
503
+ {
504
+ "Year": "2010",
505
+ "American Indian/Alaska Native": "1.1",
506
+ "Asian/Pacific Islander": "0.6",
507
+ "Black, non-Hispanic": "1.7",
508
+ "White, non-Hispanic": "0.8",
509
+ "Hispanic": "0.6"
510
+ },
511
+ {
512
+ "Year": "2011",
513
+ "American Indian/Alaska Native": "0.5",
514
+ "Asian/Pacific Islander": "0.4",
515
+ "Black, non-Hispanic": "1.4",
516
+ "White, non-Hispanic": "0.8",
517
+ "Hispanic": "0.4"
518
+ },
519
+ {
520
+ "Year": "2012",
521
+ "American Indian/Alaska Native": "0.7",
522
+ "Asian/Pacific Islander": "0.4",
523
+ "Black, non-Hispanic": "1.1",
524
+ "White, non-Hispanic": "0.8",
525
+ "Hispanic": "0.4"
526
+ },
527
+ {
528
+ "Year": "2013",
529
+ "American Indian/Alaska Native": "0.7",
530
+ "Asian/Pacific Islander": "0.3",
531
+ "Black, non-Hispanic": "0.9",
532
+ "White, non-Hispanic": "0.9",
533
+ "Hispanic": "0.4"
534
+ },
535
+ {
536
+ "Year": "2014",
537
+ "American Indian/Alaska Native": "0.8",
538
+ "Asian/Pacific Islander": "0.3",
539
+ "Black, non-Hispanic": "0.8",
540
+ "White, non-Hispanic": "0.9",
541
+ "Hispanic": "0.3"
542
+ },
543
+ {
544
+ "Year": "2015",
545
+ "American Indian/Alaska Native": "0.7",
546
+ "Asian/Pacific Islander": "0.4",
547
+ "Black, non-Hispanic": "1",
548
+ "White, non-Hispanic": "1.1",
549
+ "Hispanic": "0.3"
550
+ },
551
+ {
552
+ "Year": "2016",
553
+ "American Indian/Alaska Native": "0.5",
554
+ "Asian/Pacific Islander": "0.3",
555
+ "Black, non-Hispanic": "0.9",
556
+ "White, non-Hispanic": "1",
557
+ "Hispanic": "0.3"
558
+ },
559
+ {
560
+ "Year": "2017",
561
+ "American Indian/Alaska Native": "0.7",
562
+ "Asian/Pacific Islander": "0.3",
563
+ "Black, non-Hispanic": "1",
564
+ "White, non-Hispanic": "1.1",
565
+ "Hispanic": "0.3"
566
+ },
567
+ {
568
+ "Year": "2018",
569
+ "American Indian/Alaska Native": "0.9",
570
+ "Asian/Pacific Islander": "0.3",
571
+ "Black, non-Hispanic": "1",
572
+ "White, non-Hispanic": "1",
573
+ "Hispanic": "0.4"
574
+ },
575
+ {
576
+ "Year": "2019",
577
+ "American Indian/Alaska Native": "0.6",
578
+ "Asian/Pacific Islander": "0.3",
579
+ "Black, non-Hispanic": "0.9",
580
+ "White, non-Hispanic": "1",
581
+ "Hispanic": "0.4"
582
+ },
583
+ {
584
+ "Year": "2020",
585
+ "American Indian/Alaska Native": "0.4",
586
+ "Asian/Pacific Islander": "0.2",
587
+ "Black, non-Hispanic": "0.7",
588
+ "White, non-Hispanic": "0.7",
589
+ "Hispanic": "0.3"
590
+ },
591
+ {
592
+ "Year": "2021",
593
+ "American Indian/Alaska Native": "0.4",
594
+ "Asian/Pacific Islander": "0.2",
595
+ "Black, non-Hispanic": "0.9",
596
+ "White, non-Hispanic": "0.6",
597
+ "Hispanic": "0.4"
598
+ },
599
+ {
600
+ "Year": "2022",
601
+ "American Indian/Alaska Native": "0.4",
602
+ "Asian/Pacific Islander": "0.3",
603
+ "Black, non-Hispanic": "1",
604
+ "White, non-Hispanic": "0.6",
605
+ "Hispanic": "0.4"
606
+ }
607
+ ],
608
+ "filters": [],
609
+ "migrations": {
610
+ "addColorMigration": true
611
+ }
612
+ }
@@ -196,7 +196,7 @@
196
196
  ],
197
197
  "tooltips": {
198
198
  "opacity": 90,
199
- "singleSeries": false,
199
+ "singleSeries": true,
200
200
  "dateDisplayFormat": ""
201
201
  },
202
202
  "area": {