웹 기반 데이터 시각화 기초: Canvas, SVG 및 ECharts 활용

Canvas를 사용한 그래픽 그리기

HTML5의 <canvas> 요소는 자바스크립트를 통해 그래픽을 동적으로 생성할 수 있는 도구입니다. 기본 크기는 300×150픽셀이며, 스타일 속성이 아닌 widthheight 속성으로 크기를 지정해야 합니다. 캔버스 내부에 텍스트나 HTML 요소를 직접 삽입해도 렌더링되지 않으며, 모든 그리기는 JavaScript를 통해 수행되어야 합니다.

<canvas id="myCanvas" width="600" height="400"></canvas>
<script>
  const canvas = document.getElementById('myCanvas');
  const ctx = canvas.getContext('2d');

  // 선 그리기
  ctx.moveTo(50, 50);
  ctx.lineTo(50, 150);
  ctx.lineTo(150, 50);
  ctx.closePath();

  ctx.strokeStyle = '#8a2be2';
  ctx.lineWidth = 4;
  ctx.stroke();

  ctx.fillStyle = '#ff6347';
  ctx.fill();
</script>

사각형과 원 그리기

캔버스에서는 사각형을 쉽게 그릴 수 있습니다. strokeRect()는 외곽선만, fillRect()는 색상으로 채워진 사각형을 생성합니다.

// 외곽선 사각형
ctx.strokeRect(100, 100, 80, 60);

// 채워진 사각형
ctx.fillStyle = '#00ffff';
ctx.fillRect(200, 100, 80, 60);

원은 arc() 메서드로 그립니다. 중심 좌표, 반지름, 시작 및 종료 각도, 그리고 방향(시계/반시계)을 인자로 받습니다.

ctx.beginPath();
ctx.arc(100, 100, 40, 0, Math.PI * 2, false);
ctx.fillStyle = '#dc143c';
ctx.fill();
ctx.strokeStyle = '#000';
ctx.stroke();

텍스트 표시 및 영역 지우기

캔버스에 텍스트를 추가하려면 fillText() 또는 strokeText()를 사용합니다. 폰트 스타일은 font 속성으로 설정합니다. 특정 영역을 지우려면 clearRect()를 사용합니다.

// 텍스트 스타일 설정
ctx.font = '24px "Microsoft YaHei", sans-serif';
ctx.fillStyle = '#000';

// 텍스트 그리기
ctx.fillText('데이터 시각화 입문', 30, 40);

// 특정 영역 지우기
ctx.clearRect(30, 40, 200, 30);

SVG를 이용한 벡터 그래픽 표현

SVG는 XML 기반의 벡터 이미지 형식으로, 직선, 다각형, 원 등을 정의할 수 있습니다. HTML 내에 직접 포함되며, CSS로 스타일링이 가능합니다.

<svg width="500" height="300">
  <line x1="50" y1="50" x2="200" y2="50" stroke="red" stroke-width="2"/>
  <polyline points="60,80 100,60 140,100 180,40" fill="none" stroke="blue"/>
  <rect x="220" y="30" width="100" height="60" fill="pink" />
  <circle cx="100" cy="120" r="30" fill="orange" />
</svg>

SVG는 해상도에 독립적이며 확대/축소 시에도 선명하게 유지됩니다. 다양한 형태를 조합해 복잡한 UI 요소를 만들 수 있습니다.

ECharts를 통한 고급 데이터 시각화

ECharts는 Apache에서 개발한 강력한 JavaScript 시각화 라이브러리로, 다양한 차트 유형을 제공합니다. 사용을 위해 먼저 라이브러리를 로드하고, DOM 컨테이너에 차트 인스턴스를 초기화합니다.

<div id="chartContainer" style="width:700px;height:400px;"></div>
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
<script>
  const container = document.getElementById('chartContainer');
  const chart = echarts.init(container);

  chart.setOption({
    title: {
      text: '매출 분석',
      subtext: '분기별 실적',
      left: 'center',
      textStyle: { color: '#2e8b57' }
    },
    xAxis: {
      type: 'category',
      data: ['Q1', 'Q2', 'Q3', 'Q4']
    },
    yAxis: {
      type: 'value',
      axisLine: { show: true },
      axisTick: { show: true }
    },
    series: [{
      name: '수익',
      type: 'bar',
      data: [120, 180, 150, 200],
      itemStyle: { color: '#ffa500' }
    }]
  });
</script>

데이터셋과 인코딩 매핑

ECharts는 dataset을 사용해 다차원 데이터를 효율적으로 관리할 수 있습니다. 여러 시리즈가 동일한 데이터 소스를 공유하며, encode를 통해 각 축에 어떤 열을 매핑할지 지정할 수 있습니다.

const rawData = [
  ['제품', '판매량', '목표', '카테고리', '점유율'],
  ['A', 120, 100, '디지털', 30],
  ['B', 90, 110, '생활', 25],
  ['C', 150, 140, '패션', 45]
];

chart.setOption({
  dataset: { source: rawData },
  series: [
    { type: 'bar', encode: { x: '제품', y: '판매량' }, color: '#8fbc8f' },
    { type: 'line', encode: { x: '제품', y: '목표' }, color: '#ff6347' },
    {
      type: 'pie',
      encode: { itemName: '카테고리', value: '점유율' },
      radius: '30%',
      center: ['75%', '30%']
    }
  ]
});

차트 구성 요소 활용

ECharts는 다양한 UI 구성 요소를 제공합니다. tooltip은 마우스 오버 시 데이터 정보를 표시하고, legend는 시리즈 전환을 지원합니다. toolbox는 차트 조작 기능(저장, 타입 전환 등)을 제공하며, dataZoom은 대량 데이터의 일부를 확대하여 확인할 수 있게 해줍니다.

chart.setOption({
  tooltip: { trigger: 'axis', textStyle: { fontSize: 14 } },
  legend: { data: ['판매량', '목표'] },
  toolbox: {
    show: true,
    feature: {
      saveAsImage: {},
      magicType: { type: ['line', 'bar'] },
      dataView: { readOnly: false }
    }
  },
  grid: { left: '10%', right: '5%' }
});

태그: canvas svg ECharts data-visualization JavaScript

6월 22일 01:21에 게시됨