데이터 분석 결과를 웹에서 바로 확인하고 싶다면, 가벼운 파이썬 웹 프레임워크인 Flask와 시각화 라이브러리인 Matplotlib을 함께 사용하면 됩니다. Flask 라우트에서 그래프를 PNG 이미지로 변환해 응답으로 반환하면, 별도의 파일 저장 없이 브라우저에서 바로 그래프를 확인할 수 있습니다.
구현 절차
- 간단한 Flask 애플리케이션을 작성합니다.
- 터미널에서 애플리케이션 파일이 있는 디렉터리로 이동한 뒤, 아래 명령으로 실행할 앱을 지정합니다.
$ export FLASK_APP=file.py
(Windows 환경에서는 set FLASK_APP=file.py를 사용합니다.) - $ flask run 명령으로 개발 서버를 실행합니다.
- 브라우저에서 https://127.0.0.1:5000/print-plot/ 주소로 접속합니다.
- numpy의 random 모듈을 이용해 x축과 y축에 사용할 무작위 데이터 포인트를 생성합니다.
- 생성된 축(axis) 위에 x, y 데이터를 플롯합니다.
- 완성된 그림(figure)을 PNG 형식으로 저장합니다.
- BytesIO 버퍼 객체의 전체 내용을 읽어 이미지 응답으로 반환합니다.
예제 코드
import io
import numpy as np
import matplotlib.pyplot as plt
from flask import Flask, Response
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.figure import Figure
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
app = Flask(__name__)
@app.route('/print-plot')
def plot_png():
fig = Figure()
axis = fig.add_subplot(1, 1, 1)
xs = np.random.rand(100)
ys = np.random.rand(100)
axis.plot(xs, ys)
output = io.BytesIO()
FigureCanvas(fig).print_png(output)
return Response(output.getvalue(), mimetype='image/png')코드 설명
- Figure(): 백엔드에 종속되지 않는 빈 그림 객체를 생성합니다.
- add_subplot(1, 1, 1): 그림 안에 하나의 축을 추가합니다.
- np.random.rand(100): 0과 1 사이의 난수 100개씩을 x, y 값으로 생성합니다.
- io.BytesIO(): 메모리상의 바이너리 버퍼를 만들어 PNG 이미지를 임시 저장합니다.
- FigureCanvas(fig).print_png(output): 그림을 PNG 형식으로 버퍼에 기록합니다.
- Response(..., mimetype='image/png'): 버퍼의 내용을 PNG 이미지로 브라우저에 반환합니다.
실행 결과
서버를 실행한 뒤 브라우저에서 /print-plot 경로에 접속하면, 매 요청마다 새로 생성된 난수 산점 그래프가 PNG 이미지로 화면에 표시됩니다.
