夕蛙のなく頃に

データアナリストとして学んだことや趣味で勉強し始めたIoTをアウトプットする

PlotlyのSankeyDiagramでLinkの色をSourceに合わせる

なにこれ

前回こんな記事を書きました。

ユーザー行動フローをPlotlyのSankeyDiagramで可視化する - 夕蛙のなく頃に

デフォルトだとリンクの色は全て灰色なので、青色のノードから伸びるリンクは青色に、という具合にリンクの色をSourceに合わせるよう修正を入れます。

Collaboratoryはこちら: https://drive.google.com/open?id=1TjBAaAYUTBE-dY8cxwlaiA_WmV4s5nuQ

Colormapリストの準備

まず'#1f77b4' のような色を指定するHEX値が詰まったリストを準備します。
以下の記事を参考にさせていただきました。

matplotlibでcolor cycleのN番目の色を指定するいくつかの方法 - Qiita

import matplotlib.pyplot as plt
import numpy as np

colormap = []
for color in np.array(plt.get_cmap("tab10").colors) * 255:
  rgb = color.astype(int)
  rgb = '#{:02x}{:02x}{:02x}'.format(*tuple(rgb))
  colormap.append(rgb)

--> colormap = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', ...]

Plotlyに渡すcolorリストを作成

あとは、sourceリストを作成するときに使ったindex番号に対応するcolormapをリストにするだけです。
(前回のsourceやtargetを準備する部分に追記します)

labels = list(edges.keys())
sources = []
targets = []
values = []
colors = []

for src in edges:
  for tgt, v in edges[src].items():
    sources.append(labels.index(src))
    targets.append(labels.index(tgt))
    values.append(v)
    # srcに相当するindex番号をlabelsから探して、そのindex番号でcolormapにアクセスする
    # これをsrcではなく、tgtにすれば、リンク先の色と合わせることができる
    colors.append(colormap[labels.index(src)])

PlotlyのSankeyDiagramで可視化

data = dict(
    type='sankey',
    node = dict(
      label = labels,
      color = colormap[:len(labels)]
    ),
    link = dict(
      source = sources,
      target = targets,
      value = values,
      color = colors
  ))

layout =  dict(
    title = "行動フロー",
    font = dict(
      size = 20
    )
)

fig = dict(data=[data], layout=layout)
plotly.offline.plot(fig, validate=False)
HTML('temp-plot.html')

前回の成果物 f:id:frogdusk:20191226151451p:plain

今回の成果物 f:id:frogdusk:20191226170706p:plain

ノード・リンクの数が増えても見やすくなりそうですね!