visualifyjs 2.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. package/.github/workflows/static.yml.bak +51 -0
  2. package/LICENSE +674 -0
  3. package/README.md +59 -0
  4. package/config-overrides.js +31 -0
  5. package/dist/visualify.js +188 -0
  6. package/docs/.nojekyll +0 -0
  7. package/docs/docs/CLI.md +34 -0
  8. package/docs/docs/README.md +65 -0
  9. package/docs/docs/Rechart/bar.md +190 -0
  10. package/docs/docs/Rechart/funnel.md +193 -0
  11. package/docs/docs/Rechart/geo.md +0 -0
  12. package/docs/docs/Rechart/line.md +355 -0
  13. package/docs/docs/Rechart/liquidfill.md +0 -0
  14. package/docs/docs/Rechart/pie.md +225 -0
  15. package/docs/docs/Rechart/polar.md +0 -0
  16. package/docs/docs/Rechart/radar.md +253 -0
  17. package/docs/docs/Rechart/sankey.md +0 -0
  18. package/docs/docs/Rechart/scatter.md +0 -0
  19. package/docs/docs/Rechart/sunburst.md +0 -0
  20. package/docs/docs/Rechart/tree.md +0 -0
  21. package/docs/docs/Rechart/wordcloud.md +0 -0
  22. package/docs/docs/_404.md +52 -0
  23. package/docs/docs/_coverpage.md +11 -0
  24. package/docs/docs/_sidebar.md +43 -0
  25. package/docs/docs/components/dotBio.md +34 -0
  26. package/docs/docs/components/echart.md +82 -0
  27. package/docs/docs/components/html.md +34 -0
  28. package/docs/docs/components/macaron.md +145 -0
  29. package/docs/docs/components/markdown.md +0 -0
  30. package/docs/docs/components/more.md +142 -0
  31. package/docs/docs/components/plotly.md +62 -0
  32. package/docs/docs/components/scatterL.md +70 -0
  33. package/docs/docs/components/visium.md +57 -0
  34. package/docs/docs/configuration.md +123 -0
  35. package/docs/docs/deploy.md +31 -0
  36. package/docs/docs/log.md +1 -0
  37. package/docs/docs/more-pages.md +23 -0
  38. package/docs/docs/quickstart.md +119 -0
  39. package/docs/docs/rechart-attributes.md +74 -0
  40. package/docs/docs/rechart-basic-usage.md +162 -0
  41. package/docs/docs/static/_images/deploy-github-pages.png +0 -0
  42. package/docs/docs/static/logo/favicon.ico +0 -0
  43. package/docs/docs/static/logo/logo_128x128.png +0 -0
  44. package/docs/docs/static/logo/logo_192x192.png +0 -0
  45. package/docs/docs/static/logo/logo_256x256.png +0 -0
  46. package/docs/docs/static/logo/logo_512x512.png +0 -0
  47. package/docs/docs/static/logo/logo_64x64.png +0 -0
  48. package/docs/docs/theme.md +5 -0
  49. package/docs/index.html +71 -0
  50. package/docs/manifest.json +24 -0
  51. package/docs/static/css/fluff-stuff.css +170 -0
  52. package/docs/static/css/font-awesome.min.css +4 -0
  53. package/docs/static/css/visualify.css +25 -0
  54. package/docs/static/fonts/fontawesome-webfont.woff2 +0 -0
  55. package/docs/static/images/star.png +0 -0
  56. package/docs/static/js/configuration.js +448 -0
  57. package/docs/static/js/fluff.js +1 -0
  58. package/docs/static/js/visualify.js +188 -0
  59. package/docs/static/logo/favicon.ico +0 -0
  60. package/docs/static/logo/logo_128x128.png +0 -0
  61. package/docs/static/logo/logo_192x192.png +0 -0
  62. package/docs/static/logo/logo_256x256.png +0 -0
  63. package/docs/static/logo/logo_512x512.png +0 -0
  64. package/docs/static/logo/logo_64x64.png +0 -0
  65. package/package.json +84 -0
  66. package/rollup.config.mjs +76 -0
  67. package/src/_css/404.css +116 -0
  68. package/src/_css/App.css +38 -0
  69. package/src/_css/autoSuggestion.css +27 -0
  70. package/src/_css/circular-progress.css +33 -0
  71. package/src/_css/index.css +37 -0
  72. package/src/_css/modern.css +25 -0
  73. package/src/_media/404.png +0 -0
  74. package/src/_media/corner.svg +8 -0
  75. package/src/_media/download.svg +3 -0
  76. package/src/_media/icon.svg +1 -0
  77. package/src/_media/logo.svg +14 -0
  78. package/src/_test/App.test.js +15 -0
  79. package/src/_utils/reportWebVitals.js +13 -0
  80. package/src/core/appContext.js +27 -0
  81. package/src/core/components/Scatter.js +188 -0
  82. package/src/core/components/ScatterBio.js +572 -0
  83. package/src/core/components/VisiumPlot.js +165 -0
  84. package/src/core/components/browser.js +42 -0
  85. package/src/core/components/dotplot.js +413 -0
  86. package/src/core/components/html.js +29 -0
  87. package/src/core/components/list.js +178 -0
  88. package/src/core/components/macaron.js +201 -0
  89. package/src/core/components/markdown.js +56 -0
  90. package/src/core/components/parser.scatterBio.js +579 -0
  91. package/src/core/components/ratio.js +80 -0
  92. package/src/core/components/scatterL.js +173 -0
  93. package/src/core/components/searchbar.js +131 -0
  94. package/src/core/components/selection.js +193 -0
  95. package/src/core/components/timeline.js +281 -0
  96. package/src/core/components/visium.js +97 -0
  97. package/src/core/fetch/condfetch.js +82 -0
  98. package/src/core/fetch/fetch.js +92 -0
  99. package/src/core/fetch/json.js +29 -0
  100. package/src/core/fetch/vfetch.js +42 -0
  101. package/src/core/liveEditor.js +44 -0
  102. package/src/core/modules/codeEditorWithPreview.js +104 -0
  103. package/src/core/modules/echarts/common.js +20 -0
  104. package/src/core/modules/echarts/presetHandler.js +41 -0
  105. package/src/core/modules/echarts/presets/esodev.chromium.js +172 -0
  106. package/src/core/modules/echarts/presets/esodev.codex.js +130 -0
  107. package/src/core/modules/echarts/presets/esodev.visium.js +123 -0
  108. package/src/core/modules/echarts/presets/mmtrbc.js +186 -0
  109. package/src/core/modules/echarts.js +71 -0
  110. package/src/core/modules/echartsUtils.js +43 -0
  111. package/src/core/modules/echartswitcher.js +152 -0
  112. package/src/core/modules/replotly/presetHandler.js +24 -0
  113. package/src/core/modules/replotly/presets/minimum.js +18 -0
  114. package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -0
  115. package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -0
  116. package/src/core/modules/replotly.js +71 -0
  117. package/src/core/pages/404.js +50 -0
  118. package/src/core/pages/error.js +27 -0
  119. package/src/core/pages/jsonPage.js +62 -0
  120. package/src/core/pages/loading.js +44 -0
  121. package/src/core/parser/echart.data.js +183 -0
  122. package/src/core/parser/echart.features.js +125 -0
  123. package/src/core/parser/echart.general.js +143 -0
  124. package/src/core/parser/echart.hilbert.js +57 -0
  125. package/src/core/parser/echart.parser.js +210 -0
  126. package/src/core/parser/echart.series.js +67 -0
  127. package/src/core/parser/echart.types.js +76 -0
  128. package/src/core/parser/plotly.config.js +10 -0
  129. package/src/core/parser/plotly.data.js +132 -0
  130. package/src/core/parser/plotly.layout.js +10 -0
  131. package/src/core/parser/plotly.violin.js +18 -0
  132. package/src/core/recharts.js +62 -0
  133. package/src/core/router/alias.js +49 -0
  134. package/src/core/router/jsonRouter.js +31 -0
  135. package/src/core/themes/modern.js +32 -0
  136. package/src/core/themes/themeSelector.js +33 -0
  137. package/src/core/visualify.js +47 -0
  138. package/src/core/widgets/circularProgress.js +24 -0
  139. package/src/core/widgets/controller.js +83 -0
  140. package/src/core/widgets/errorBoundary.js +36 -0
  141. package/src/core/widgets/footer.js +177 -0
  142. package/src/core/widgets/header.js +234 -0
  143. package/src/core/widgets/layout/Grid.js +31 -0
  144. package/src/core/widgets/layout.js +36 -0
  145. package/src/core/widgets/mapping.js +42 -0
  146. package/src/index.js +62 -0
  147. package/src/setupTests.js +5 -0
@@ -0,0 +1,186 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-22 22:37:23
4
+ * @FilePath : /visualifyjs/src/core/modules/echarts/presets/mmtrbc.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ const mmtrbc = {
9
+ title: {
10
+ text: 'MmTrBC Preset',
11
+ textStyle: {
12
+ fontFamily: 'Arial, sans-serif',
13
+ fontSize: 24,
14
+ color: 'black',
15
+ margin: '0 0 20px 0',
16
+ },
17
+ left: 'center',
18
+ top: 0,
19
+ },
20
+ tooltip: {
21
+ trigger: 'item',
22
+ axisPointer: {
23
+ type: 'cross',
24
+ },
25
+ formatter: (params) => {
26
+ let express = params.data.value[2];
27
+ let round_epxress = express
28
+ ? Math.round(express * 10000) / 10000
29
+ : 0;
30
+
31
+ let round = (num, n = 2) =>
32
+ Math.round(num * Math.pow(10, n)) / Math.pow(10, n);
33
+
34
+ return ` ${params.data.Cell_ID} <br/>
35
+ Type: ${params.seriesName} <br/>
36
+ UMI: ${params.data.UMI ?? 'not found'} <br/>
37
+ FMT: ${round(params.data.Frac_MT, 5) ?? 'not found'} <br/>
38
+ ${express !== undefined ? 'Expression: ' + round_epxress : ''} `;
39
+ },
40
+ },
41
+ legend: {
42
+ top: 30,
43
+ textStyle: {
44
+ fontFamily: 'Arial, sans-serif',
45
+ fontSize: 18,
46
+ },
47
+ type: 'scroll',
48
+ orient: 'horizontal',
49
+ right: 'center',
50
+ width: '80%',
51
+ },
52
+ xAxis: {
53
+ name: 'TSNE-2',
54
+ type: 'value',
55
+ axisLabel: false,
56
+ nameGap: 10,
57
+ nameLocation: 'middle',
58
+ axisTick: false,
59
+ splitLine: false,
60
+ nameTextStyle: {
61
+ fontSize: '18',
62
+ fontWeight: 'bold',
63
+ },
64
+ },
65
+ yAxis: {
66
+ name: 'TSNE-1',
67
+ type: 'value',
68
+ axisLabel: false,
69
+ nameGap: 10,
70
+ nameLocation: 'middle',
71
+ axisTick: false,
72
+ splitLine: false,
73
+ nameTextStyle: {
74
+ fontSize: '18',
75
+ fontWeight: 'bold',
76
+ },
77
+ },
78
+ series: [],
79
+ grid: {
80
+ containLabel: true,
81
+ left: '5%',
82
+ right: '13%',
83
+ top: '13%',
84
+ bottom: '13%',
85
+ },
86
+ // ... other default settings for charts
87
+ toolbox: {
88
+ feature: {
89
+ saveAsImage: {
90
+ show: true,
91
+ icon: `path://M30 20.75c-0.69 0.001-1.249 0.56-1.25 1.25v6.75h-25.5v-6.75c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 8c0 0.69 0.56 1.25 1.25 1.25h28c0.69-0.001 1.249-0.56 1.25-1.25v-8c-0.001-0.69-0.56-1.249-1.25-1.25h-0zM15.116 24.885c0.012 0.012 0.029 0.016 0.041 0.027 0.103 0.099 0.223 0.18 0.356 0.239l0.008 0.003 0.001 0c0.141 0.060 0.306 0.095 0.478 0.095 0.345 0 0.657-0.139 0.883-0.365l5.001-5c0.226-0.226 0.366-0.539 0.366-0.884 0-0.691-0.56-1.251-1.251-1.251-0.345 0-0.658 0.14-0.884 0.366l-2.865 2.867v-18.982c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 18.981l-2.866-2.866c-0.226-0.226-0.539-0.366-0.884-0.366-0.691 0-1.251 0.56-1.251 1.251 0 0.346 0.14 0.658 0.367 0.885v0z`,
92
+ },
93
+ },
94
+ },
95
+ dataZoom: [
96
+ { type: 'inside', xAxisIndex: 0 },
97
+ { type: 'inside', yAxisIndex: 0 },
98
+ {
99
+ type: 'slider',
100
+ xAxisIndex: 0,
101
+ },
102
+ { type: 'slider', yAxisIndex: 0, orient: 'vertical' },
103
+ ],
104
+ visualMap: {
105
+ min: 0,
106
+ max: 8,
107
+ dimension: 2,
108
+ orient: 'vertical',
109
+ top: 'center',
110
+ right: 35,
111
+ text: ['log2\n(tpm+1)', ''],
112
+ textGap: 10,
113
+ calculable: true,
114
+ inRange: {
115
+ color: [
116
+ 'rgb(43, 120, 182)',
117
+ 'rgb(247, 126, 11)',
118
+ 'rgb(59, 160, 30)',
119
+ 'rgb(206, 37, 41)',
120
+ 'rgb(143, 103, 191)',
121
+ 'rgb(134, 86, 74)',
122
+ ],
123
+ },
124
+ textStyle: {
125
+ writingMode: 'vertical-lr',
126
+ },
127
+ },
128
+ visualify: {
129
+ colors_for_celltype: [
130
+ {
131
+ name: 'BC-1',
132
+ color: 'rgb(43, 120, 182)',
133
+ symbol: 'circle',
134
+ },
135
+ {
136
+ name: 'BC-2',
137
+ color: 'rgb(247, 126, 11)',
138
+ symbol: 'circle',
139
+ },
140
+ {
141
+ name: 'BC-Sec',
142
+ color: 'rgb(59, 160, 30)',
143
+ symbol: 'circle',
144
+ },
145
+ {
146
+ name: 'BC-Sq',
147
+ color: 'rgb(206, 37, 41)',
148
+ symbol: 'circle',
149
+ },
150
+ {
151
+ name: 'BC-Mes',
152
+ color: 'rgb(143, 103, 191)',
153
+ symbol: 'circle',
154
+ },
155
+ {
156
+ name: 'BC-Pro',
157
+ color: 'rgb(134, 86, 74)',
158
+ symbol: 'circle',
159
+ },
160
+ ],
161
+ mapping: {
162
+ extra: {
163
+ UMI: 'N_UMI',
164
+ N_gene: 'N_gene',
165
+ Frac_MT: 'Frac_MT',
166
+ Cell_ID: 'Cell_ID',
167
+ },
168
+ },
169
+ exclude: ['BC-Mes', 'BC-NE', 'BC-Im'],
170
+ seriesBy: 'Cell_Type',
171
+ symbolSize: 5,
172
+ symbol: 'circle',
173
+ merger: {
174
+ gene: {
175
+ item: 'Cell_ID',
176
+ label: 'Expression',
177
+ visualMap: true,
178
+ },
179
+ },
180
+ filter: {
181
+ Expression: '>-1',
182
+ },
183
+ },
184
+ };
185
+
186
+ export default mmtrbc;
@@ -0,0 +1,71 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-01 14:18:43
4
+ * @FilePath : /visualifyjs/src/core/libs/echarts.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ import React, { useEffect, useRef, forwardRef } from 'react';
9
+ import ReactEcharts from 'echarts-for-react';
10
+
11
+ const ReCharts = forwardRef(({ options, style, onEvents = {} }, ref) => {
12
+ const internalRef = useRef(null);
13
+
14
+ // Use the provided ref or the internalRef
15
+ const chartRef = ref || internalRef;
16
+
17
+ useEffect(() => {
18
+ // Ensure the chart instance is available
19
+ if (chartRef.current) {
20
+ const chart = chartRef.current.getEchartsInstance();
21
+
22
+ // Set the 'silent' option to suppress warnings
23
+ chart.setOption({
24
+ ...options,
25
+ silent: true,
26
+ });
27
+
28
+ // Efficiently update options
29
+ if (JSON.stringify(options) !== JSON.stringify(chart.getOption())) {
30
+ chart.clear();
31
+ chart.setOption(options);
32
+ }
33
+
34
+ // Handle events
35
+ Object.keys(onEvents).forEach((eventName) => {
36
+ chart.off(eventName); // Remove old listener
37
+ chart.on(eventName, onEvents[eventName]); // Attach new listener
38
+ });
39
+
40
+ // Resize observer for responsive charts
41
+ const resizeObserver = new ResizeObserver(() => {
42
+ chart.resize();
43
+ });
44
+ const parent = chart.getDom().parentElement;
45
+ if (parent) {
46
+ resizeObserver.observe(parent);
47
+ }
48
+
49
+ // Cleanup
50
+ return () => {
51
+ resizeObserver.disconnect();
52
+
53
+ if (!chart.isDisposed()) {
54
+ chart.off();
55
+ chart.dispose();
56
+ }
57
+ };
58
+ }
59
+ }, [options, chartRef, onEvents]); // Include onEvents in the dependency array
60
+
61
+ return (
62
+ <ReactEcharts
63
+ ref={chartRef}
64
+ option={options}
65
+ style={style}
66
+ onEvents={onEvents}
67
+ />
68
+ );
69
+ });
70
+
71
+ export default ReCharts;
@@ -0,0 +1,43 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-11-11 23:09:44
4
+ * @FilePath : /visualifyjs/src/core/lib/echartsUtils
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ // echartsUtils.js
9
+ import * as echarts from 'echarts';
10
+
11
+ export const initChart = (chartRef, chartOption) => {
12
+ if (!chartRef.current) {
13
+ throw new Error('Chart container DOM element not available.');
14
+ }
15
+
16
+ let chartInstance = echarts.getInstanceByDom(chartRef.current);
17
+ if (!chartInstance) {
18
+ chartInstance = echarts.init(chartRef.current);
19
+ }
20
+ chartInstance.setOption(chartOption);
21
+ return chartInstance;
22
+ };
23
+
24
+ export const disposeChart = (chartInstance) => {
25
+ chartInstance && chartInstance.dispose();
26
+ };
27
+
28
+ export const handleChartForSharedDataChange = (
29
+ chartRef,
30
+ sharedData,
31
+ previousSharedDataRef,
32
+ extra_Excute_Func = null,
33
+ ) => {
34
+ if (sharedData !== previousSharedDataRef.current) {
35
+ const chartInstance = echarts.getInstanceByDom(chartRef.current);
36
+ disposeChart(chartInstance);
37
+ previousSharedDataRef.current = sharedData;
38
+ if (extra_Excute_Func) {
39
+ //console.log('excute func: ', extra_Excute_Func);
40
+ extra_Excute_Func();
41
+ }
42
+ }
43
+ };
@@ -0,0 +1,152 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2023-12-01 14:21:40
4
+ * @FilePath : /visualifyjs/src/core/modules/echartswitcher.js
5
+ * @Description :
6
+ * Copyright (c) 2023 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ import React, { useState, useEffect, useRef } from 'react';
9
+ import ReCharts from './echarts';
10
+ import Loading from '../pages/loading';
11
+ import _ from 'lodash';
12
+ import _parser_gereral from '../parser/echart.general';
13
+ import _parser_data from '../parser/echart.data';
14
+ import _fetch_data, { _process_fetched_data } from '../parser/echart.parser';
15
+
16
+ import {
17
+ fetchPresetFromURL,
18
+ getEmbeddedPreset,
19
+ } from '../modules/echarts/presetHandler';
20
+ import minimumPreset from './echarts/common';
21
+
22
+ import ErrorBoundary from '../widgets/errorBoundary';
23
+ import { useAppContext } from '../appContext';
24
+
25
+ import downsampleSeries from '../parser/echart.hilbert';
26
+
27
+ const EChartSwitcher = ({ props, style }) => {
28
+ const { config = {}, parser, advanced, style: _style } = props;
29
+
30
+ const [loading, setLoading] = useState({
31
+ active: true,
32
+ message: null,
33
+ style: advanced?.loadingStlye ?? {},
34
+ });
35
+ // Store the previous sharedData value using a ref
36
+ const previousSharedDataRef = useRef(null);
37
+ const chartRef = useRef(null);
38
+ const [presetData, setPresetData] = useState(null);
39
+ const [Options, setOptions] = useState({});
40
+ const [onEvents] = useState({});
41
+ const { width, height = '400px' } = config;
42
+ const { sharedData } = useAppContext();
43
+
44
+ useEffect(() => {
45
+ let fetched_data, combinedOptions;
46
+ const parsedGeneral = _parser_gereral(config, presetData);
47
+ const parsedData = _parser_data(config, parsedGeneral);
48
+
49
+ const loadPreset = async () => {
50
+ try {
51
+ if (typeof config.preset === 'string') {
52
+ if (
53
+ config.preset.startsWith('http://') ||
54
+ config.preset.startsWith('https://')
55
+ ) {
56
+ const presetData = await fetchPresetFromURL(
57
+ config.preset,
58
+ );
59
+ setPresetData(presetData);
60
+ } else {
61
+ const embeddedPreset = getEmbeddedPreset(config.preset);
62
+ setPresetData(embeddedPreset);
63
+ }
64
+ } else {
65
+ setPresetData(minimumPreset);
66
+ }
67
+ } catch (error) {
68
+ console.error('Error loading preset:', error);
69
+ // Handle error or set to a default value
70
+ setPresetData(minimumPreset);
71
+ }
72
+ };
73
+
74
+ const updatePlot = async () => {
75
+ try {
76
+ let parsedAPI = parsedData;
77
+
78
+ if (parser) {
79
+ // fetch data from api
80
+ fetched_data = await _fetch_data(
81
+ parser,
82
+ parsedData,
83
+ sharedData,
84
+ );
85
+ parsedAPI = _process_fetched_data(
86
+ fetched_data,
87
+ parser,
88
+ parsedData,
89
+ );
90
+ }
91
+
92
+ combinedOptions = _.merge(parsedAPI, config.overrides);
93
+
94
+ if (advanced?.hilbert)
95
+ combinedOptions.series = downsampleSeries(
96
+ combinedOptions.series,
97
+ advanced.hilbert,
98
+ );
99
+
100
+ console.log('Final Options:', combinedOptions);
101
+ setOptions(combinedOptions);
102
+
103
+ setLoading((prev) => ({
104
+ ...prev,
105
+ active: false,
106
+ message: null,
107
+ }));
108
+ } catch (error) {
109
+ setLoading((prev) => ({
110
+ ...prev,
111
+ active: true,
112
+ message: error.message,
113
+ }));
114
+ }
115
+ };
116
+
117
+ loadPreset();
118
+
119
+ updatePlot();
120
+
121
+ if (!_.isEqual(sharedData, previousSharedDataRef.current))
122
+ previousSharedDataRef.current = sharedData;
123
+ }, [config, parser, advanced, presetData, sharedData]);
124
+
125
+ return (
126
+ <div
127
+ id={props.id}
128
+ style={{ ...style, position: 'relative' }}>
129
+ {loading.active && (
130
+ <Loading
131
+ message={loading.message}
132
+ style={loading.style}
133
+ />
134
+ )}
135
+ <ErrorBoundary>
136
+ <ReCharts
137
+ options={Options}
138
+ style={{
139
+ opacity: loading.active ? 0 : 1,
140
+ width,
141
+ height,
142
+ ..._style,
143
+ }}
144
+ onEvents={onEvents}
145
+ ref={chartRef}
146
+ />
147
+ </ErrorBoundary>
148
+ </div>
149
+ );
150
+ };
151
+
152
+ export default EChartSwitcher;
@@ -0,0 +1,24 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2024-01-14 14:54:27
4
+ * @FilePath : /visualifyjs/src/core/modules/replotly/presetHandler.js
5
+ * @Description :
6
+ * Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+
9
+ import minimumPreset from './presets/minimum';
10
+ import mmtrbc_violin from './presets/mmtrbc.violin';
11
+ import mmtrbc_dot from './presets/mmtrbc.dot';
12
+
13
+ // Example embedded presets
14
+ const embeddedPresets = {
15
+ mmtrbc_violin,
16
+ mmtrbc_dot,
17
+ // 'presetName': { ...preset data... }
18
+ // Define embedded presets here
19
+ };
20
+
21
+ export const getPreset = (presetKey) => {
22
+ // Return minimumPreset if preset not found
23
+ return embeddedPresets[presetKey] || minimumPreset;
24
+ };
@@ -0,0 +1,18 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2024-01-14 14:55:51
4
+ * @FilePath : /visualifyjs/src/core/modules/replotly/presets/minimum.js
5
+ * @Description :
6
+ * Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+ const minimumPreset = {
9
+ data: [],
10
+ config: {},
11
+ layout: {
12
+ title: 'Minimum Preset of RePlotly',
13
+ chartWidth: 800,
14
+ chartHeight: 400,
15
+ },
16
+ };
17
+
18
+ export default minimumPreset;
@@ -0,0 +1,114 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2024-01-14 15:25:40
4
+ * @FilePath : /visualifyjs/src/core/modules/replotly/presets/mmtrbc.dot.js
5
+ * @Description :
6
+ * Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+
9
+ import Plotly from 'react-plotly.js';
10
+
11
+ const DownloadIcon = {
12
+ width: 32,
13
+ height: 40,
14
+ path: `M30 20.75c-0.69 0.001-1.249 0.56-1.25 1.25v6.75h-25.5v-6.75c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 8c0 0.69 0.56 1.25 1.25 1.25h28c0.69-0.001 1.249-0.56 1.25-1.25v-8c-0.001-0.69-0.56-1.249-1.25-1.25h-0zM15.116 24.885c0.012 0.012 0.029 0.016 0.041 0.027 0.103 0.099 0.223 0.18 0.356 0.239l0.008 0.003 0.001 0c0.141 0.060 0.306 0.095 0.478 0.095 0.345 0 0.657-0.139 0.883-0.365l5.001-5c0.226-0.226 0.366-0.539 0.366-0.884 0-0.691-0.56-1.251-1.251-1.251-0.345 0-0.658 0.14-0.884 0.366l-2.865 2.867v-18.982c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 18.981l-2.866-2.866c-0.226-0.226-0.539-0.366-0.884-0.366-0.691 0-1.251 0.56-1.251 1.251 0 0.346 0.14 0.658 0.367 0.885v0z`,
15
+ };
16
+
17
+ const mmtrbc_dot = {
18
+ data: [],
19
+ config: {
20
+ displaylogo: false,
21
+ modeBarButtonsToRemove: [
22
+ 'toImage',
23
+ 'zoom2d',
24
+ 'pan2d',
25
+ 'zoomIn2d',
26
+ 'zoomOut2d',
27
+ 'boxSelect',
28
+ 'select2d',
29
+ 'lasso2d',
30
+ 'resetScale2d',
31
+ 'hoverClosestCartesian',
32
+ 'hoverCompareCartesian',
33
+ 'toggleSpikelines',
34
+ ],
35
+ modeBarButtonsToAdd: [
36
+ {
37
+ name: 'Save As Image',
38
+ icon: DownloadIcon, // Your custom SVG or base64 encoded image
39
+ click: function (gd) {
40
+ Plotly.downloadImage(gd, { format: 'png' });
41
+ },
42
+ },
43
+ ],
44
+ },
45
+ layout: {
46
+ title: {
47
+ text: 'Add genes to update Dot Plot',
48
+ font: {
49
+ family: 'Arial, sans-serif',
50
+ size: 24,
51
+ color: 'black',
52
+ },
53
+ },
54
+ margin: {
55
+ l: 110,
56
+ r: 40,
57
+ b: 30,
58
+ t: 80,
59
+ },
60
+ legend: {
61
+ //hide the legend
62
+ x: 0.5, // left align
63
+ y: -0.5, // top align
64
+ xanchor: 'center', // anchor the legend to the left
65
+ yanchor: 'bottom', // anchor the legend to the top
66
+ orientation: 'h', // horizontal legend
67
+ font: {
68
+ size: 16,
69
+ family: 'Arial, sans-serif',
70
+ color: '#6699CC',
71
+ },
72
+ },
73
+ xaxis: {
74
+ showgrid: false,
75
+ showline: false,
76
+ showticklabels: true,
77
+ linecolor: 'rgb(102, 102, 102)',
78
+ tickcolor: 'rgb(102, 102, 102)',
79
+ },
80
+ yaxis: {
81
+ showgrid: true,
82
+ showline: false,
83
+ showticklabels: true,
84
+ gridcolor: '#E5ECF6',
85
+ tickfont: {
86
+ size: 16,
87
+ family: 'Arial',
88
+ color: '#037e8c',
89
+ },
90
+ },
91
+ width: 500,
92
+ height: 300,
93
+ hovermode: 'closest',
94
+ },
95
+ visualify: {
96
+ mapping: {
97
+ extra: {
98
+ UMI: 'N_UMI',
99
+ N_gene: 'N_gene',
100
+ Frac_MT: 'Frac_MT',
101
+ Cell_ID: 'Cell_ID',
102
+ },
103
+ },
104
+ merger: {
105
+ gene: {
106
+ item: 'Cell_ID',
107
+ label: 'Expression',
108
+ visualMap: true,
109
+ },
110
+ },
111
+ },
112
+ };
113
+
114
+ export default mmtrbc_dot;
@@ -0,0 +1,100 @@
1
+ /*
2
+ * @Author : Lihao leolihao@arizona.edu
3
+ * @Date : 2024-01-14 15:25:40
4
+ * @FilePath : /visualifyjs/src/core/modules/replotly/presets/mmtrbc.violin.js
5
+ * @Description :
6
+ * Copyright (c) 2024 by Lihao (leolihao@arizona.edu), All Rights Reserved.
7
+ */
8
+
9
+ import Plotly from 'react-plotly.js';
10
+
11
+ const DownloadIcon = {
12
+ width: 32,
13
+ height: 40,
14
+ path: `M30 20.75c-0.69 0.001-1.249 0.56-1.25 1.25v6.75h-25.5v-6.75c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 8c0 0.69 0.56 1.25 1.25 1.25h28c0.69-0.001 1.249-0.56 1.25-1.25v-8c-0.001-0.69-0.56-1.249-1.25-1.25h-0zM15.116 24.885c0.012 0.012 0.029 0.016 0.041 0.027 0.103 0.099 0.223 0.18 0.356 0.239l0.008 0.003 0.001 0c0.141 0.060 0.306 0.095 0.478 0.095 0.345 0 0.657-0.139 0.883-0.365l5.001-5c0.226-0.226 0.366-0.539 0.366-0.884 0-0.691-0.56-1.251-1.251-1.251-0.345 0-0.658 0.14-0.884 0.366l-2.865 2.867v-18.982c0-0.69-0.56-1.25-1.25-1.25s-1.25 0.56-1.25 1.25v0 18.981l-2.866-2.866c-0.226-0.226-0.539-0.366-0.884-0.366-0.691 0-1.251 0.56-1.251 1.251 0 0.346 0.14 0.658 0.367 0.885v0z`,
15
+ };
16
+
17
+ const mmtrbc_violin = {
18
+ data: [],
19
+ config: {
20
+ displaylogo: false,
21
+ modeBarButtonsToRemove: [
22
+ 'toImage',
23
+ 'zoom2d',
24
+ 'pan2d',
25
+ 'zoomIn2d',
26
+ 'zoomOut2d',
27
+ 'autoScale2d',
28
+ //"resetScale2d",
29
+ 'hoverClosestCartesian',
30
+ 'hoverCompareCartesian',
31
+ 'toggleSpikelines',
32
+ ],
33
+ modeBarButtonsToAdd: [
34
+ {
35
+ name: 'Save As Image',
36
+ icon: DownloadIcon, // Your custom SVG or base64 encoded image
37
+ click: function (gd) {
38
+ Plotly.downloadImage(gd, { format: 'png' });
39
+ },
40
+ },
41
+ ],
42
+ },
43
+ layout: {
44
+ title: {
45
+ text: 'Search a gene to update Violin Plot',
46
+ font: {
47
+ family: 'Arial, sans-serif',
48
+ size: 24,
49
+ color: 'black',
50
+ },
51
+ },
52
+ margin: {
53
+ l: 10,
54
+ r: 10,
55
+ b: 20,
56
+ t: 60,
57
+ },
58
+ legend: {
59
+ font: {
60
+ size: 13,
61
+ family: 'Arial, sans-serif',
62
+ color: '#6699CC',
63
+ },
64
+ x: 0.5, // left align
65
+ y: -0.3, // top align
66
+ xanchor: 'center', // anchor the legend to the left
67
+ yanchor: 'bottom', // anchor the legend to the top
68
+ orientation: 'h', // horizontal legend
69
+ },
70
+ xaxis: {
71
+ tickvals: [],
72
+ showgrid: false,
73
+ showline: true,
74
+ linecolor: 'rgb(102, 102, 102)',
75
+ tickcolor: 'rgb(102, 102, 102)',
76
+ type: 'category',
77
+ },
78
+ width: 500,
79
+ height: 300,
80
+ },
81
+ visualify: {
82
+ mapping: {
83
+ extra: {
84
+ UMI: 'N_UMI',
85
+ N_gene: 'N_gene',
86
+ Frac_MT: 'Frac_MT',
87
+ Cell_ID: 'Cell_ID',
88
+ },
89
+ },
90
+ merger: {
91
+ gene: {
92
+ item: 'Cell_ID',
93
+ label: 'Expression',
94
+ visualMap: true,
95
+ },
96
+ },
97
+ },
98
+ };
99
+
100
+ export default mmtrbc_violin;