Post

(python) plotly

Plotly? Python, JS, R을 지원하는 오픈소스 차트 라이브러리.

Plotly-python,

Dash, Plotly-js

  • Plotly-python은 파이썬에서 그래프를 구성하고 파일 기반으로 그래프를 생성해준다.
    • 그래서 그래프 이외에 select box를 붙인 다던가, 이 select box의 동작이 그래프에 영향을 미친다던가 하는 작업이 불가능하다.
  • Dash는 이러한 단점을 보완하여 웹 기반으로 그래프를 띄운다.
    • input box를 붙인 다던가 이런 요소의 입력이 그래프를 변화시키는 등의 동적인 작업이 가능하다.
    • Flask를 wrapping해서 만든 웹 프레임워크고, 내부적으로 Plotly.js, React.js를 사용한다.
    • 코딩은 pure python으로 하게 되는데, 그래서 DOM이나 뷰를 모두 파이썬 코드에서 관리해야 한다. 장점이자 단점.
    • 그래프 위주의 간단한 웹사이트를 만들 때 빠르게 만들 수 있을 듯.
    • dash example gallery
    • dash example 소스코드 모음 Github
  • Plotly-js는 d3.js, stack.gl을 기반으로 만들어진 js 차트 라이브러리다.
    • Dash는 앞서 얘기한 단점도 있고, Dash만 사용해서 제대로된 웹사이트를 만들기에는 무리가 있다. 확장성도 떨어진다.
    • Plotly-js를 사용해면 서버에서 직접 json으로 던지고 Plotly-js가 받도록 하는 방식으로 구성하는게 가능하다. 다른 차트 라이브러리 처럼.

Scatter()

막대 그래프 등 다른 형식의 그래프는 Scatter()가 아니라 Bar()를 사용하는 식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from plotly.graph\_objs import Scatter, Figure
from plotly.offline import plot

def make\_data():
trace0 = Scatter(
x=[1, 2, 3, 4],
y=[10, 15, 13, 17]
)
trace1 = Scatter(
x=[1, 2, 3, 4],
y=[16, 5, 11, 9]
)
return [trace0, trace1]
plot(Figure(data=make\_data()), filename = 'basic-line.html')

마지막에 dataFigure()에 넣지 않고 그냥 넘겨도 되는데 Figure()를 사용하면 annotation 등 여러 추가적인 속성을 지정할 수 있다.

그래프가 어떤 모양인지는 Scatter(mode=?)가 결정하는데, default는 lines+markers 이기 때문에 기본적으로 각각의 점들을 잇는 직선 그래프가 그려진다. mode='markers'로 지정하면 점(노드)로 나타낼 수 있기 때문에, 하나는 markers, 하나는 lines로 지정해 노드와 엣지를 표현할 수 있다.

layout

plotly가 자체적으로 지원하는 layout은 없다. 그냥 (x, y) 값 입력하면 그걸 그래프에 찍어주는 기능만 있다. 따라서 Graphviz, matplotlib같은 다른 모듈의 layout 함수로부터 pos 값을 얻고, 이를 plotly에 입력해주어야 layout을 사용할 수 있다.

NetworkX도 마찬가지다. 자체적으로 layout을 지원하는게 아니라 matplotlib, graphviz, pydot 등의 레이아웃을 가져온다.
https://networkx.github.io/documentation/stable/reference/drawing.html#module-networkx.drawing.layout
따라서 plotly를 사용하는 경우, NetworkX말고 igraph같은 다른 모듈과 함께 사용하는 것을 추천한다.
matplotlib을 사용하는 경우 그냥 NetworkX에 노드, 엣지 추가하고 draw, show하면 바로 그려주지만,
plotly는 NetworkX의 객체를 받아오는 인터페이스가 있는게 아니라 단순히 pos를 (x, y)값으로 받아와 그 좌표를 그려줄 뿐이다.
게다가 NetworkX가 지원하는 레이아웃이 몇 없어서 Graphviz에서 레이아웃을 가져와 사용하는 경우가 많은데, 이 때는 굳이 NetworkX를 거칠 필요 없이 바로 Graphviz를 사용하는게 낫다.
이런 경우 NetworkX는 그냥 노드와 링크를 사용할 수 있는 추상화 계층으로서의 의미 정도밖에 없는 듯.
해서 plotly를 사용할거라면 Graphviz, pygraphviz, pydot, pydotplus, igraph를 직접 사용하는게 낫다.

graphviz twopi layout

정식 명칭은 radial layout이다. root를 지정하는 경우, BFS같이 동작한다. 중심 노드에 연결되어 있으면 모두 동일한 동심원에, depth 1에 연결되어 있으면 또 다른 동일한 동심원에 위치하는 방식이며 여러 depth의 노드에 연결되어 있는 경우 그 중 가장 낮은 depth에 연결되어 있는 노드들의 동심원에 위치하게 된다.

This post is licensed under CC BY 4.0 by the author.