visualifyjs 2.5.3-2.dev
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/static.yml.bak +51 -0
- package/LICENSE +674 -0
- package/README.md +59 -0
- package/config-overrides.js +31 -0
- package/dist/visualify.js +188 -0
- package/docs/.nojekyll +0 -0
- package/docs/docs/CLI.md +34 -0
- package/docs/docs/README.md +65 -0
- package/docs/docs/Rechart/bar.md +190 -0
- package/docs/docs/Rechart/funnel.md +241 -0
- package/docs/docs/Rechart/geo.md +0 -0
- package/docs/docs/Rechart/line.md +355 -0
- package/docs/docs/Rechart/liquidfill.md +0 -0
- package/docs/docs/Rechart/pie.md +225 -0
- package/docs/docs/Rechart/polar.md +0 -0
- package/docs/docs/Rechart/radar.md +253 -0
- package/docs/docs/Rechart/sankey.md +0 -0
- package/docs/docs/Rechart/scatter.md +298 -0
- package/docs/docs/Rechart/sunburst.md +0 -0
- package/docs/docs/Rechart/tree.md +0 -0
- package/docs/docs/Rechart/wordcloud.md +0 -0
- package/docs/docs/_404.md +52 -0
- package/docs/docs/_coverpage.md +11 -0
- package/docs/docs/_sidebar.md +44 -0
- package/docs/docs/components/dotBio.md +34 -0
- package/docs/docs/components/echart.md +82 -0
- package/docs/docs/components/html.md +34 -0
- package/docs/docs/components/macaron.md +145 -0
- package/docs/docs/components/markdown.md +0 -0
- package/docs/docs/components/more.md +142 -0
- package/docs/docs/components/plotly.md +62 -0
- package/docs/docs/components/scatterL.md +70 -0
- package/docs/docs/components/visium.md +57 -0
- package/docs/docs/configuration.md +121 -0
- package/docs/docs/deploy.md +31 -0
- package/docs/docs/log.md +9 -0
- package/docs/docs/more-pages.md +23 -0
- package/docs/docs/quickstart.md +124 -0
- package/docs/docs/rechart-attributes.md +74 -0
- package/docs/docs/rechart-basic-usage.md +162 -0
- package/docs/docs/static/_images/deploy-github-pages.png +0 -0
- package/docs/docs/static/logo/favicon.ico +0 -0
- package/docs/docs/static/logo/logo_128x128.png +0 -0
- package/docs/docs/static/logo/logo_192x192.png +0 -0
- package/docs/docs/static/logo/logo_256x256.png +0 -0
- package/docs/docs/static/logo/logo_512x512.png +0 -0
- package/docs/docs/static/logo/logo_64x64.png +0 -0
- package/docs/docs/theme.md +5 -0
- package/docs/index.html +71 -0
- package/docs/manifest.json +24 -0
- package/docs/static/css/fluff-stuff.css +170 -0
- package/docs/static/css/font-awesome.min.css +4 -0
- package/docs/static/css/visualify.css +25 -0
- package/docs/static/fonts/fontawesome-webfont.woff2 +0 -0
- package/docs/static/images/star.png +0 -0
- package/docs/static/js/configuration.js +448 -0
- package/docs/static/js/fluff.js +1 -0
- package/docs/static/js/visualify.js +188 -0
- package/docs/static/logo/favicon.ico +0 -0
- package/docs/static/logo/logo_128x128.png +0 -0
- package/docs/static/logo/logo_192x192.png +0 -0
- package/docs/static/logo/logo_256x256.png +0 -0
- package/docs/static/logo/logo_512x512.png +0 -0
- package/docs/static/logo/logo_64x64.png +0 -0
- package/package.json +84 -0
- package/rollup.config.mjs +76 -0
- package/src/_css/404.css +116 -0
- package/src/_css/App.css +38 -0
- package/src/_css/autoSuggestion.css +27 -0
- package/src/_css/circular-progress.css +33 -0
- package/src/_css/index.css +37 -0
- package/src/_css/modern.css +25 -0
- package/src/_media/404.png +0 -0
- package/src/_media/corner.svg +8 -0
- package/src/_media/download.svg +3 -0
- package/src/_media/icon.svg +1 -0
- package/src/_media/logo.svg +14 -0
- package/src/_test/App.test.js +15 -0
- package/src/_utils/reportWebVitals.js +13 -0
- package/src/core/appContext.js +27 -0
- package/src/core/components/Scatter.js +188 -0
- package/src/core/components/ScatterBio.js +572 -0
- package/src/core/components/VisiumPlot.js +165 -0
- package/src/core/components/browser.js +42 -0
- package/src/core/components/dotplot.js +413 -0
- package/src/core/components/html.js +29 -0
- package/src/core/components/list.js +178 -0
- package/src/core/components/macaron.js +201 -0
- package/src/core/components/markdown.js +56 -0
- package/src/core/components/parser.scatterBio.js +587 -0
- package/src/core/components/ratio.js +80 -0
- package/src/core/components/scatterL.js +173 -0
- package/src/core/components/searchbar.js +131 -0
- package/src/core/components/selection.js +193 -0
- package/src/core/components/timeline.js +281 -0
- package/src/core/components/visium.js +97 -0
- package/src/core/fetch/condfetch.js +82 -0
- package/src/core/fetch/fetch.js +92 -0
- package/src/core/fetch/json.js +29 -0
- package/src/core/fetch/vfetch.js +42 -0
- package/src/core/liveEditor.js +44 -0
- package/src/core/modules/codeEditorWithPreview.js +104 -0
- package/src/core/modules/echarts/common.js +20 -0
- package/src/core/modules/echarts/presetHandler.js +41 -0
- package/src/core/modules/echarts/presets/esodev.chromium.js +172 -0
- package/src/core/modules/echarts/presets/esodev.codex.js +130 -0
- package/src/core/modules/echarts/presets/esodev.visium.js +123 -0
- package/src/core/modules/echarts/presets/mmtrbc.js +186 -0
- package/src/core/modules/echarts.js +71 -0
- package/src/core/modules/echartsUtils.js +43 -0
- package/src/core/modules/echartswitcher.js +152 -0
- package/src/core/modules/replotly/presetHandler.js +24 -0
- package/src/core/modules/replotly/presets/minimum.js +18 -0
- package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -0
- package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -0
- package/src/core/modules/replotly.js +71 -0
- package/src/core/pages/404.js +50 -0
- package/src/core/pages/error.js +27 -0
- package/src/core/pages/jsonPage.js +62 -0
- package/src/core/pages/loading.js +44 -0
- package/src/core/parser/echart.data.js +183 -0
- package/src/core/parser/echart.features.js +125 -0
- package/src/core/parser/echart.general.js +147 -0
- package/src/core/parser/echart.hilbert.js +57 -0
- package/src/core/parser/echart.parser.js +210 -0
- package/src/core/parser/echart.series.js +67 -0
- package/src/core/parser/echart.types.js +76 -0
- package/src/core/parser/plotly.config.js +10 -0
- package/src/core/parser/plotly.data.js +132 -0
- package/src/core/parser/plotly.layout.js +10 -0
- package/src/core/parser/plotly.violin.js +18 -0
- package/src/core/recharts.js +62 -0
- package/src/core/router/alias.js +49 -0
- package/src/core/router/jsonRouter.js +31 -0
- package/src/core/themes/modern.js +32 -0
- package/src/core/themes/themeSelector.js +33 -0
- package/src/core/visualify.js +47 -0
- package/src/core/widgets/circularProgress.js +24 -0
- package/src/core/widgets/controller.js +83 -0
- package/src/core/widgets/errorBoundary.js +36 -0
- package/src/core/widgets/footer.js +177 -0
- package/src/core/widgets/header.js +234 -0
- package/src/core/widgets/layout/Grid.js +31 -0
- package/src/core/widgets/layout.js +36 -0
- package/src/core/widgets/mapping.js +42 -0
- package/src/index.js +62 -0
- 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 : /visualify.js/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;
|