분산형

분산형 스파크라인은 과학적, 통계적 및 공학적 데이터와 같은 숫자 값을 비교하는 데 사용할 수 있습니다.

설명
app.jsx
app-func.jsx
app-class.jsx
index.html
styles.css

수식에서 다음과 같이 ScatterSparkline 함수를 사용하여 분산형 스파크라인을 만들 수 있습니다. =SCATTERSPARKLINE(points1, points2?, minX?, maxX?, minY?, maxY?, hLine?, vLine?, xMinZone?, xMaxZone?, yMinZone?, yMaxZone?, tags?, drawSymbol?, drawLines?, color1?, color2?, dash?).

이 함수에는 다음과 같은 매개 변수가 있습니다.

points1: 첫 번째 x,y 데이터 계열입니다. 이는 "H1:I3"과 같은 범위입니다. 행 수가 열 수보다 크거나 같으면 처음 두 열에서 데이터를 가져옵니다. 첫 번째 열은 x 값을 포함하고 두 번째 열은 y 값을 포함합니다. 그렇지 않으면 처음 두 행에서 데이터를 가져옵니다. 첫 번째 행은 x 값을 포함하고 두 번째 행은 y 값을 포함합니다.

points2\: (선택 사항) 두 번째 x,y 데이터 계열입니다. 이는 "H4:I6"과 같은 범위입니다. 행 수가 열 수보다 크거나 같으면 처음 두 열에서 데이터를 가져옵니다. 첫 번째 열은 x 값을 포함하고 두 번째 열은 y 값을 포함합니다. 그렇지 않으면 처음 두 행에서 데이터를 가져옵니다. 첫 번째 행은 x 값을 포함하고 두 번째 행은 y 값을 포함합니다.

minX\: (선택 사항) 두 계열의 최소 x 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다.

maxX\: (선택 사항) 두 계열의 최대 x 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다.

minY\: (선택 사항) 두 계열의 최소 y 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다.

maxY\: (선택 사항) 두 계열의 최대 y 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다.

hLine\: (선택 사항) 가로 축의 위치입니다. 생략하면 선이 없습니다.

vLine\: (선택 사항) 세로 축의 위치입니다. 생략하면 선이 없습니다.

xMinZone\: (선택 사항) 회색 영역의 x 최소값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다.

xMaxZone\: (선택 사항) 회색 영역의 x 최대값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다.

yMinZone\: (선택 사항) 회색 영역의 y 최소값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다.

yMaxZone\: (선택 사항) 회색 영역의 y 최대값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다.

tags\: (선택 사항) true이면, y 값이 첫 번째 계열의 최대값인 위치에 점을 "#0000FF"로 표시하고, y 값이 첫 번째 계열의 최소값인 위치에 점을 "#CB0000"으로 표시합니다. 기본값은 false입니다.

drawSymbol\: (선택 사항) true이면 각 점을 기호로 그립니다. 첫 번째 계열의 기호는 원이고 두 번째 계열의 기호는 정사각형입니다. 기본값은 true입니다.

drawLines\: (선택 사항) true이면 각 점을 순서대로 각 계열의 선과 연결합니다. 기본값은 false입니다.

color1\: (선택 사항) 첫 번째 점 계열의 색 문자열입니다. 기본값은 "#969696"입니다.

color2\: (선택 사항) 두 번째 점 계열의 색 문자열입니다. 기본값은 "#CB0000"입니다.

dash\: (선택 사항) true이면 선은 파선입니다. 그렇지 않으면 선은 실선입니다. 기본값은 false입니다.

수식에서 다음과 같이 ScatterSparkline 함수를 사용하여 분산형 스파크라인을 만들 수 있습니다. =SCATTERSPARKLINE(points1, points2?, minX?, maxX?, minY?, maxY?, hLine?, vLine?, xMinZone?, xMaxZone?, yMinZone?, yMaxZone?, tags?, drawSymbol?, drawLines?, color1?, color2?, dash?). 이 함수에는 다음과 같은 매개 변수가 있습니다. points1: 첫 번째 x,y 데이터 계열입니다. 이는 "H1:I3"과 같은 범위입니다. 행 수가 열 수보다 크거나 같으면 처음 두 열에서 데이터를 가져옵니다. 첫 번째 열은 x 값을 포함하고 두 번째 열은 y 값을 포함합니다. 그렇지 않으면 처음 두 행에서 데이터를 가져옵니다. 첫 번째 행은 x 값을 포함하고 두 번째 행은 y 값을 포함합니다. points2\: (선택 사항) 두 번째 x,y 데이터 계열입니다. 이는 "H4:I6"과 같은 범위입니다. 행 수가 열 수보다 크거나 같으면 처음 두 열에서 데이터를 가져옵니다. 첫 번째 열은 x 값을 포함하고 두 번째 열은 y 값을 포함합니다. 그렇지 않으면 처음 두 행에서 데이터를 가져옵니다. 첫 번째 행은 x 값을 포함하고 두 번째 행은 y 값을 포함합니다. minX\: (선택 사항) 두 계열의 최소 x 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다. maxX\: (선택 사항) 두 계열의 최대 x 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다. minY\: (선택 사항) 두 계열의 최소 y 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다. maxY\: (선택 사항) 두 계열의 최대 y 한도입니다. 각 계열은 생략되면 고유한 값을 가집니다. hLine\: (선택 사항) 가로 축의 위치입니다. 생략하면 선이 없습니다. vLine\: (선택 사항) 세로 축의 위치입니다. 생략하면 선이 없습니다. xMinZone\: (선택 사항) 회색 영역의 x 최소값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다. xMaxZone\: (선택 사항) 회색 영역의 x 최대값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다. yMinZone\: (선택 사항) 회색 영역의 y 최소값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다. yMaxZone\: (선택 사항) 회색 영역의 y 최대값입니다. 이 4개의 구역 매개 변수 중 하나라도 생략되면 회색 영역이 없습니다. tags\: (선택 사항) true이면, y 값이 첫 번째 계열의 최대값인 위치에 점을 "#0000FF"로 표시하고, y 값이 첫 번째 계열의 최소값인 위치에 점을 "#CB0000"으로 표시합니다. 기본값은 false입니다. drawSymbol\: (선택 사항) true이면 각 점을 기호로 그립니다. 첫 번째 계열의 기호는 원이고 두 번째 계열의 기호는 정사각형입니다. 기본값은 true입니다. drawLines\: (선택 사항) true이면 각 점을 순서대로 각 계열의 선과 연결합니다. 기본값은 false입니다. color1\: (선택 사항) 첫 번째 점 계열의 색 문자열입니다. 기본값은 "#969696"입니다. color2\: (선택 사항) 두 번째 점 계열의 색 문자열입니다. 기본값은 "#CB0000"입니다. dash\: (선택 사항) true이면 선은 파선입니다. 그렇지 않으면 선은 실선입니다. 기본값은 false입니다.
import * as React from 'react'; import * as ReactDOM from 'react-dom'; import './styles.css'; import { AppFunc } from './app-func'; // import { App } from './app-class'; // 1. Functional Component sample ReactDOM.render(<AppFunc />, document.getElementById('app')); // 2. Class Component sample // ReactDOM.render(<App />, document.getElementById('app'));
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import '@mescius/spread-sheets-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); let spread = null; export function AppFunc() { const [colors, setColors] = React.useState({ color1: "#BBBBBB", color2: "#82BC00" }); React.useEffect(() => { applyChanges(); }, [colors]); const color1Change = (e) => { setColors({ ...colors, color1: e.target.value }); } const color2Change = (e) => { setColors({ ...colors, color2: e.target.value }); } const initSpread = (currSpread) => { spread = currSpread; let spreadNS = GC.Spread.Sheets; let sheet = spread.sheets[0]; sheet.suspendPaint(); sheet.addSpan(0, 0, 1, 5); sheet.getCell(0, 0).value("Rainfall effect on Particulate Levels and Temperature").font("15px Arial") .backColor("#BBBBBB") .vAlign(spreadNS.VerticalAlign.center); sheet.setArray(1, 0, [ ["Daily Rainfall", "Particulate Level", "Daily Rainfall1", "Temperature", "Diagram"], [2.0, 100, 2.0, 15], [2.5, 130, 2.5, 12], [3.0, 120, 3.0, 11], [3.5, 140, 3.5, 9], [4.0, 120, 4.0, 10], [4.5, 110, 4.5, 10], [5.0, 110, 5.0, 9], [5.5, 105, 5.5, 9], [6.0, 100, 6.0, 8] ]); sheet.addSpan(2, 4, 9, 1); sheet.setFormula(2, 4, '=SCATTERSPARKLINE(A3:B11,C3:D11,,,,,AVERAGE(B3:B11),AVERAGE(A3:A11),,,,,' + 'TRUE,TRUE,TRUE,"#000000","#82BC00",TRUE)'); for (var i = 0; i < 11; i++) { sheet.setRowHeight(i, 25); } sheet.getRange(1, 0, 1, 5) .font("bold 13px Arial") .setBorder(new spreadNS.LineBorder("black", spreadNS.LineStyle.thin), { bottom: true }); sheet.getRange(2, 0, 9, 4).hAlign(spreadNS.HorizontalAlign.left); sheet.setColumnWidth(0, 120); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(3, 120); sheet.setColumnWidth(4, 200); //hide 2nd rainfall column data sheet.setColumnVisible(2, false); sheet.resumePaint(); } const applyChanges = () => { let sheet = spread.getActiveSheet(); console.log("applyChanges: ", colors.color1); sheet.setFormula(2, 4, '=SCATTERSPARKLINE(A3:B11,C3:D11,,,,,AVERAGE(B3:B11),AVERAGE(A3:A11),,,,,' + 'TRUE,TRUE,TRUE,"' + colors.color1 + '","' + colors.color2 + '",TRUE)'); } return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <Panel panelInfo={colors} color1Change={(e) => { color1Change(e) }} color2Change={(e) => { color2Change(e) }} /> </div> ); } const Panel = (props) => { const { panelInfo, color1Change, color2Change } = props; return ( <div class="options-container"> <div class="option-row"> <label for="color1">Rainfall - Particulate Level Graph Color</label> </div> <div class="option-row"> <select value={panelInfo.color1 + ""} select={panelInfo.color1} onChange={(e) => { color1Change(e) }}> <option value="#FFFFFF">White</option> <option value="#000000">Black</option> <option value="#F7A711">Orange</option> <option value="#DDDDDD">LightGrey</option> <option value="#BBBBBB">Grey</option> <option value="#999999">DarkGrey</option> <option value="#82BC00">Green</option> </select> </div> <div class="option-row"> <label for="color2">Rainfall - Temperature Graph Color</label> </div> <div class="option-row"> <select value={panelInfo.color2 + ""} select={panelInfo.color2} onChange={(e) => { color2Change(e) }}> <option value="#FFFFFF">White</option> <option value="#000000">Black</option> <option value="#F7A711">Orange</option> <option value="#DDDDDD">LightGrey</option> <option value="#BBBBBB">Grey</option> <option value="#999999">DarkGrey</option> <option value="#82BC00">Green</option> </select> </div> </div> ); }
import * as React from 'react'; import GC from '@mescius/spread-sheets'; import { SpreadSheets, Worksheet } from '@mescius/spread-sheets-react'; import '@mescius/spread-sheets-resources-ko'; GC.Spread.Common.CultureManager.culture("ko-kr"); const Component = React.Component; export class App extends Component { constructor(props) { super(props); this.spread = null; this.state = { color1: "#BBBBBB", color2: "#82BC00" }; } render() { return ( <div class="sample-tutorial"> <div class="sample-spreadsheets"> <SpreadSheets workbookInitialized={spread => this.initSpread(spread)}> <Worksheet> </Worksheet> </SpreadSheets> </div> <Panel panelInfo={this.state} color1Change={(e) => { this.color1Change(e) }} color2Change={(e) => { this.color2Change(e) }} /> </div> ) } color1Change(e) { this.setState({ color1: e.target.value }, () => { this.applyChanges(); }) } color2Change(e) { this.setState({ color2: e.target.value }, () => { this.applyChanges(); }) } initSpread(spread) { this.spread = spread; let spreadNS = GC.Spread.Sheets; let sheet = spread.sheets[0]; sheet.suspendPaint(); sheet.addSpan(0, 0, 1, 5); sheet.getCell(0, 0).value("Rainfall effect on Particulate Levels and Temperature").font("15px Arial") .backColor("#BBBBBB") .vAlign(spreadNS.VerticalAlign.center); sheet.setArray(1, 0, [ ["Daily Rainfall", "Particulate Level", "Daily Rainfall1", "Temperature", "Diagram"], [2.0, 100, 2.0, 15], [2.5, 130, 2.5, 12], [3.0, 120, 3.0, 11], [3.5, 140, 3.5, 9], [4.0, 120, 4.0, 10], [4.5, 110, 4.5, 10], [5.0, 110, 5.0, 9], [5.5, 105, 5.5, 9], [6.0, 100, 6.0, 8] ]); sheet.addSpan(2, 4, 9, 1); sheet.setFormula(2, 4, '=SCATTERSPARKLINE(A3:B11,C3:D11,,,,,AVERAGE(B3:B11),AVERAGE(A3:A11),,,,,' + 'TRUE,TRUE,TRUE,"#000000","#82BC00",TRUE)'); for (var i = 0; i < 11; i++) { sheet.setRowHeight(i, 25); } sheet.getRange(1, 0, 1, 5) .font("bold 13px Arial") .setBorder(new spreadNS.LineBorder("black", spreadNS.LineStyle.thin), { bottom: true }); sheet.getRange(2, 0, 9, 4).hAlign(spreadNS.HorizontalAlign.left); sheet.setColumnWidth(0, 120); sheet.setColumnWidth(1, 120); sheet.setColumnWidth(3, 120); sheet.setColumnWidth(4, 200); //hide 2nd rainfall column data sheet.setColumnVisible(2, false); sheet.resumePaint(); } applyChanges() { let sheet = this.spread.getActiveSheet(); console.log("applyChanges: ", this.state.color1); sheet.setFormula(2, 4, '=SCATTERSPARKLINE(A3:B11,C3:D11,,,,,AVERAGE(B3:B11),AVERAGE(A3:A11),,,,,' + 'TRUE,TRUE,TRUE,"' + this.state.color1 + '","' + this.state.color2 + '",TRUE)'); } } const Panel = (props) => { const { panelInfo, color1Change, color2Change } = props; return ( <div class="options-container"> <div class="option-row"> <label for="color1">Rainfall - Particulate Level Graph Color</label> </div> <div class="option-row"> <select value={panelInfo.color1 + ""} select={panelInfo.color1} onChange={(e) => { color1Change(e) }}> <option value="#FFFFFF">White</option> <option value="#000000">Black</option> <option value="#F7A711">Orange</option> <option value="#DDDDDD">LightGrey</option> <option value="#BBBBBB">Grey</option> <option value="#999999">DarkGrey</option> <option value="#82BC00">Green</option> </select> </div> <div class="option-row"> <label for="color2">Rainfall - Temperature Graph Color</label> </div> <div class="option-row"> <select value={panelInfo.color2 + ""} select={panelInfo.color2} onChange={(e) => { color2Change(e) }}> <option value="#FFFFFF">White</option> <option value="#000000">Black</option> <option value="#F7A711">Orange</option> <option value="#DDDDDD">LightGrey</option> <option value="#BBBBBB">Grey</option> <option value="#999999">DarkGrey</option> <option value="#82BC00">Green</option> </select> </div> </div> ); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/ko/react/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <!-- SystemJS --> <script src="$DEMOROOT$/ko/react/node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('$DEMOROOT$/ko/lib/react/license.js').then(function () { System.import('./src/app'); }); </script> </head> <body> <div id="app" style="height: 100%;"></div> </body> </html>
.sample { position: relative; height: 100%; overflow: auto; } .sample::after { display: block; content: ""; clear: both; } .sample-tutorial { position: relative; height: 100%; overflow: hidden; } .sample-spreadsheets { width: calc(100% - 280px); height: 100%; overflow: hidden; float: left; } .options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; } .option-row { font-size: 14px; padding: 5px; margin-top: 10px; } .option-group { margin-bottom: 6px; } label { display: inline-block; min-width: 90px; margin-bottom: 6px; } select { padding: 4px 6px; box-sizing: border-box; } body { position: absolute; top: 0; bottom: 0; left: 0; right: 0; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true, react: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { '@mescius/spread-sheets': 'npm:@mescius/spread-sheets/index.js', '@mescius/spread-sheets-resources-ko': 'npm:@mescius/spread-sheets-resources-ko/index.js', '@mescius/spread-sheets-react': 'npm:@mescius/spread-sheets-react/index.js', '@grapecity/jsob-test-dependency-package/react-components': 'npm:@grapecity/jsob-test-dependency-package/react-components/index.js', 'react': 'npm:react/umd/react.production.min.js', 'react-dom': 'npm:react-dom/umd/react-dom.production.min.js', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'jsx' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);