Facebookの可視化ツールVisdomを色々試す

visdomはFacebook AI Researchが公開しているオープンソースの可視化ライブラリ,Torchとnumpyに対応している.

f:id:noconocolib:20190107082418p:plain

Visdom aims to facilitate visualization of (remote) data with an emphasis on supporting scientific experimentation.

Install

pip install visdom

使い方

$ visdom

プロット

  • 以下のようにコンストラクタを呼んだ後,プロットをしていく
vis = visdom.Visdom()

vis.text

  • 文字列を表示
# text
vis.text('Hello, world!')

f:id:noconocolib:20190107075205p:plain

vis.image

  • 画像を表示
# image
img = cv2.imread("../images/cavy.jpg", 0)
vis.image(img)

f:id:noconocolib:20190107075414p:plain

vis.matplot

  • matplotlibの出力結果を表示
# matplotlib
plt.plot([1, 23, 2, 4])
plt.ylabel('some numbers')
vis.matplot(plt)

f:id:noconocolib:20190107075601p:plain

vis.video

  • 動画を表示
# video
video = np.empty([256, 250, 250, 3], dtype=np.uint8)
for n in range(256):
    video[n, :, :, :].fill(n)
vis.video(tensor=video)

f:id:noconocolib:20190107075701p:plain

vis.scatter

  • 散布図を表示
  • 指定できるオプションは以下のようなものがある
    • legend: 凡例
    • xtickmin, xtickmax: x軸の範囲
    • ytickmin, ytickmax: y軸の範囲
    • xtickstep: x軸のメモリの間隔
    • markersymbol: マーカーに用いる記号
# scatter
Y = np.random.rand(100)
old_scatter = vis.scatter(
    X=np.random.rand(100, 2),
    Y=(Y[Y > 0] + 1.5).astype(int),
    opts=dict(
        legend=['Didnt', 'Update'],
        xtickmin=-1,
        xtickmax=1,
        xtickstep=0.5,
        ytickmin=-1,
        ytickmax=1,
        ytickstep=0.5,
        markersymbol='cross-thin-open',
    ),
)
  • z軸についての指定をすることで3次元プロットも可能
# 3D scatter
vis.scatter(
X=np.random.rand(100, 3),
Y=(Y + 1.5).astype(int),
opts=dict(
    legend=['Men', 'Women'],
    markersize=5,
    xtickmin=0,
    xtickmax=2,
    xlabel='Arbitrary',
    xtickvals=[0, 0.75, 1.6, 2],
    ytickmin=0,
    ytickmax=2,
    ytickstep=0.5,
    ztickmin=0,
    ztickmax=1,
    ztickstep=0.5,
)
)

f:id:noconocolib:20190107080237p:plain

vis.bar

  • bar plotを表示
  • 指定できるオプションは以下のようなものがある
    • legend: 凡例
    • stacked: 棒グラフを積み上げる
    • rownames: x軸の名前
# bar
vis.bar(
    X=np.abs(np.random.rand(5, 3)),
    opts=dict(
        stacked=True,
        legend=['Facebook', 'Google', 'Twitter'],
        rownames=['2012', '2013', '2014', '2015', '2016']
    )
)

f:id:noconocolib:20190107080440p:plain

vis.histogram

vis.histogram(X=np.random.rand(10000), opts=dict(numbins=20))

f:id:noconocolib:20190107080548p:plain

vis.heatmap

  • ヒートマップの表示
vis.heatmap(
    X=np.outer(np.arange(1, 6), np.arange(1, 11)),
    opts=dict(
        columnnames=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
        rownames=['y1', 'y2', 'y3', 'y4', 'y5'],
        colormap='Electric',
    )
)

f:id:noconocolib:20190107080636p:plain

vis.contour

  • 等高線の表示
vis.heatmap(
    X=np.outer(np.arange(1, 6), np.arange(1, 11)),
    opts=dict(
        columnnames=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'],
        rownames=['y1', 'y2', 'y3', 'y4', 'y5'],
        colormap='Electric',
    )
)

vis.surf

vis.surf(X=X, opts=dict(colormap='Hot'))

f:id:noconocolib:20190107080836p:plain

vis.line

  • 折れ線グラフの表示
vis.line(Y=np.random.rand(10), opts=dict(showlegend=True))

f:id:noconocolib:20190107080921p:plain

全部表示

  • 今回試したものを全部表示させると以下のようになる
  • 各カードごとに,レイアウト変更やリサイズなどのインタラクティブな操作ができる

f:id:noconocolib:20190107081026p:plain