[]
히스토그램은 데이터 집합의 도수 분포를 나타내는 데 사용됩니다. SpreadJS에서는 히스토그램 스파크라인 함수를 사용하여 히스토그램 스파크라인을 생성할 수 있습니다.
위 이미지는 히스토그램 스파크라인과 그 구성 요소를 보여줍니다:
Bin: 지정된 값 범위의 데이터를 포함하는 데이터 컨테이너입니다.
Bar: UI를 구성하는 그리기 블록입니다. paintLabel
옵션이 true일 경우 막대의 높이는 다음 식으로 결정됩니다:
(cellRowHeight - labelFontSize - 6px)
그렇지 않으면 다음 식으로 결정됩니다:
(cellRowHeight - 6px)
Edge: 막대의 테두리입니다.
폰트 크기가 해당 식보다 클 경우, 식보다 작거나 같은 최대 정수가 폰트 크기로 사용됩니다.
셀 높이가 cellRowHeight보다 작을 경우, 폰트 크기는 12px입니다.
Data Label: 스파크라인에 표시되는 데이터 범위입니다. 데이터 레이블의 폰트 크기는 다음 식으로 결정됩니다:
Math.floor(cellRowHeight/3)
폰트 크기가 해당 식보다 클 경우, 식보다 작거나 같은 최대 정수가 사용됩니다.
셀 높이가 cellRowHeight보다 작을 경우, 폰트 크기는 12px입니다.
히스토그램 스파크라인은 이산형(Discrete) 또는 연속형(Continuous)으로 표시할 수 있습니다:
이산형 히스토그램은 연속적인 구간 없이 기존 값을 기준으로 데이터를 표시합니다. 예: 20, 34, 38. 값은 오름차순으로 그려집니다.
연속형 히스토그램은 연속적인 값 범위를 사용하여 데이터를 표시합니다. 첫 번째 bin은 왼쪽-닫힘, 오른쪽-닫힘 구간이며, 나머지 bin은 왼쪽-열림, 오른쪽-닫힘 구간입니다.
하한값은 다음 식으로 계산됩니다:
Math.floor(minValue/scale)*scale
상한값은 다음 식으로 계산됩니다:
Math.ceil(maxValue/scale)*scale
기본적으로 bin의 너비는 1입니다.
scale 값이 0보다 작을 경우, 스파크라인은 1로 설정됩니다.
히스토그램 유형은 HistogramSparkline
수식의 continuous
옵션으로 지정할 수 있습니다. 히스토그램 스파크라인 수식에는 다음과 같은 옵션이 있으며, dataRange
만 필수입니다:
옵션 | 설명 |
---|---|
dataRange | 데이터 소스 범위를 지정합니다. 범위, 계산 배열, 계산 참조를 지원합니다. |
continuous |
기본값은 |
paintLabel |
기본값은 |
scale | bin 너비를 지정합니다. 이 값은 연속형 히스토그램에서 유용합니다. 기본값은 |
barWidth | 막대 너비를 지정합니다. 기본값은 1입니다. 막대 너비 = 자동 계산된 너비 × barWidth 값 범위는 |
barColor | 막대의 색상을 지정합니다. 기본값은 CSS color 속성을 지원합니다. |
labelFontStyle | 데이터 레이블 폰트 스타일을 지정합니다. 기본값은 CSS font 속성을 지원하며, |
labelColor | 데이터 레이블 폰트의 색상을 지정합니다. 기본값은 CSS color 문자열을 지원합니다. |
edgeColor | 테두리 색상을 지정합니다. 기본값은 CSS color 속성을 지원합니다. |
히스토그램 스파크라인 수식의 구문은 다음과 같습니다:
=HISTOGRAMSPARKLINE(dataRange,continuous?,paintLabel?,scale?,barWidth?,barColor?,labelFontStyle?,labelColor,edgeColor?)
참고 사항
스파크라인의 기본 padding은 3px입니다.
paintLabel
옵션이 true이더라도, 사용자 지정 폰트 크기가 셀 행 높이의 1/3보다 크면 레이블은 표시되지 않습니다.
데이터 레이블의 너비가 막대의 평균 너비보다 클 경우 해당 레이블은 표시되지 않습니다. 평균 막대 너비는 다음 식으로 계산됩니다(셀 너비 / 막대 개수)
예: 셀 너비가 100px이고 막대가 5개이면, 평균 막대 너비는 20px입니다. 이 경우, 데이터 레이블 중 너비가 20px보다 큰 항목은 표시되지 않습니다.
데이터 범위에서 숫자가 아닌 값은 무시됩니다.
다음은 한 조직이 사용자의 주간 소셜 미디어 소비량을 조사한 시나리오입니다.
히스토그램 스파크라인은 이러한 통계를 시각화하고, 사용자가 다양한 소셜 미디어 플랫폼에서 소비한 시간을 분석하는 데 활용할 수 있습니다.
// Spread 초기화
var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), { sheetCount: 1 });
spread.suspendPaint();
// 시트 가져오기
var sheet1 = spread.sheets[0];
// sheetAreaOffset 옵션 설정
sheet1.options.sheetAreaOffset = { left: 1, top: 1 };
// gridlines 숨김
sheet1.options.gridline = { showVerticalGridline: false, showHorizontalGridline: false };
// 열/행 헤더 숨김
sheet1.options.colHeaderVisible = false;
sheet1.options.rowHeaderVisible = false;
// 열 너비 설정
for (var i = 1; i < 5; i++)
sheet1.setColumnWidth(i, 265);
sheet1.setColumnWidth(0, 140);
// 행 높이 설정
sheet1.setRowHeight(0, 35, GC.Spread.Sheets.SheetArea.dataArea)
sheet1.setRowHeight(1, 35, GC.Spread.Sheets.SheetArea.dataArea)
sheet1.setRowHeight(2, 200, GC.Spread.Sheets.SheetArea.dataArea)
var dataArray =
[
["Name", "Facebook", "Instagram", "LinkedIn", "Twitter"]
];
var dataArray1 =
[
["John Mathew", 71, 74, 97, 85],
["Jim Parker", 76, 58, 88, 84],
["Sophia Ran", 97, 80, 74, 80],
["Wendi Blake", 55, 97, 84, 60],
["Stephan Lai", 81, 83, 94, 90],
["Fay Van Damme", 71, 78, 72, 82],
["Brevin Dice", 84, 80, 83, 93],
["Regina Oleveria", 86, 76, 56, 92],
["Georgi Facello", 78, 61, 91, 68],
["Bezalel Simmel", 85, 58, 92, 68],
["Sachin Tsukuda", 76, 70, 55, 81],
["Patricia Breugel", 64, 77, 83, 85],
["Zito Baaz", 82, 97, 66, 90],
["Navin Argence", 59, 87, 83, 85],
["Siamak Salverda", 77, 85, 97, 65],
["Khaled Kohling", 87, 67, 77, 97],
["Bangqing Kleiser", 49, 97, 78, 75],
["Rimli Dusink", 25, 61, 91, 91],
["Nathan Ranta", 65, 60, 96, 92],
["Gila Lukaszewicz", 27, 91, 62, 93],
["Kaijung Rodham", 31, 81, 67, 87],
["Mohammed Pleszkun", 20, 98, 67, 82],
["Shuichi Piazza", 67, 56, 81, 82],
["Katsuo Leuchs", 83, 74, 51, 42],
["Masanao Ducloy", 67, 64, 58, 73],
["Mihalis Crabtree", 80, 91, 57, 84],
["Danny Lenart", 92, 38, 99, 86],
["Yongqiao Dalton", 85, 61, 73, 81],
["Gaetan Veldwijk", 64, 52, 76, 72],
["Leszek Pulkowski", 95, 75, 64, 99],
["Weidon Gente", 77, 88, 77, 96],
["Krister Stranks", 72, 38, 89, 55],
["Ziyad Baaz", 89, 81, 83, 48],
["Ymte Perelgut", 67, 70, 97, 94],
["Tonia Butner", 99, 71, 87, 76],
["Shigeaki Narlikar", 78, 80, 80, 97],
["Ayakannu Beerel", 86, 61, 85, 81],
["Moni Bale", 60, 72, 71, 86],
["Manohar Heemskerk", 97, 60, 75, 78],
["Angus Swan", 33, 97, 99, 99],
["Christ Murtagh", 91, 76, 73, 80],
["Hilary Rodiger", 75, 64, 84, 54],
["Maren Baez", 45, 77, 86, 88],
["Greger Jahnichen", 98, 89, 81, 63],
["Ymte Duclos", 95, 83, 72, 72],
["Chenyi Hainaut", 81, 97, 99, 87],
["Kasidit Picel", 87, 80, 88, 80],
["Elrique Walstra", 96, 54, 38, 54],
["Adel Reghbati", 56, 88, 81, 88]
];
// 데이터 설정
sheet1.setArray(1, 0, dataArray);
sheet1.setArray(3, 0, dataArray1);
sheet1.setValue(0, 0, "Social media usage of users (in minutes)", GC.Spread.Sheets.SheetArea.dataArea);
// 정렬 설정
sheet1.getRange(-1, 0, -1, 10).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
sheet1.addSpan(0, 0, 1, 5, GC.Spread.Sheets.SheetArea.dataArea);
// HistogramSparkline 수식 설정
sheet1.setFormula(2, 1, 'HISTOGRAMSPARKLINE(Sheet1!B4: B52, true, true, 20, 1, "#DC4463", "bold normal 10pt Calibri", "black")');
sheet1.setFormula(2, 2, 'HISTOGRAMSPARKLINE(Sheet1!C4: C52, true, true, 20, 1, "#FFAE49", "bold normal 10pt Calibri", "black")');
sheet1.setFormula(2, 3, 'HISTOGRAMSPARKLINE(Sheet1!D4: D52, true, true, 20, 1, "#5AB4BD", "bold normal 10pt Calibri", "black")');
sheet1.setFormula(2, 4, 'HISTOGRAMSPARKLINE(Sheet1!E4: E52, true, true, 20, 1, "#C2EDB2", "bold normal 10pt Calibri", "black")');
// 0번째 행 스타일
var style1 = new GC.Spread.Sheets.Style();
style1.font = "bold 24px Calibri";
style1.foreColor = "black";
style1.backColor = "#9FD5B7";
style1.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
style1.vAlign = GC.Spread.Sheets.VerticalAlign.center;
sheet1.setStyle(0, 0, style1, GC.Spread.Sheets.SheetArea.dataArea);
// 1번째 행 스타일
var style = new GC.Spread.Sheets.Style();
style.font = "bold italic 20px Calibri";
style.foreColor = "black";
style.backColor = "#D3F0E0";
style.hAlign = GC.Spread.Sheets.HorizontalAlign.center;
style.vAlign = GC.Spread.Sheets.VerticalAlign.center;
for (var i = 0; i < 5; i++) {
sheet1.setStyle(1, i, style, GC.Spread.Sheets.SheetArea.dataArea);
}
// 2번째 행 스타일
var style2 = new GC.Spread.Sheets.Style();
style2.backColor = "#EDFDF4";
for (var i = 0; i < 5; i++)
sheet1.setStyle(2, i, style2, GC.Spread.Sheets.SheetArea.dataArea);
// dataArea 셀 테두리 설정
sheet1.getRange("A4:E52").setBorder(
new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thick),
{ top: true, bottom: true, left: true, right: true }, GC.Spread.Sheets.SheetArea.dataArea);
spread.resumePaint();