Visdom
Visdom
是一个面向科学研究的可视化工具,可以帮助你可视化和理解数据。它是 Facebook Research 开发的一个基于 Python 的可视化库,可以在Web
浏览器中实时显示和更新图表、图像、文本等各种数据。
1 安装Visdom
可以使用以下命令安装Visdom:
pip install visdom
2 启动Visdom服务器
在终端中运行以下命令启动Visdom服务器:
python -m visdom.server
根据显示在浏览器中输入: http://localhost:8097
3 在代码中使用Visdom
import visdom
vis = visdom.Visdom()
# 在创建 Visdom 对象之后,可以使用以下方法来进行可视化
vis.line(X, Y, opts=None, win=None, env=None, update=None, name=None)# 绘制折线图。
vis.image(img, opts=None, win=None, env=None, update=None, name=None) # 绘制图片。
vis.images(imgs, opts=None, win=None, env=None, update=None, name=None) # 批量绘制图片。
vis.heatmap(X, opts=None, win=None, env=None, update=None, name=None)# 绘制热力图。
vis.contour(X, Y=None, Z=None, opts=None, win=None, env=None, update=None, name=None)# 绘制等高线图。
vis.scatter(X, Y=None, opts=None, win=None, env=None, update=None, name=None)# 绘制散点图。
vis.bar(X, opts=None, win=None, env=None, update=None, name=None) # 绘制柱状图。
vis.pie(X, opts=None, win=None, env=None, update=None, name=None) # 绘制饼图。
vis.stem(X, Y=None, opts=None, win=None, env=None, update=None, name=None) # 绘制棒图。
vis.text(text, opts=None, win=None, env=None, update=None, name=None) # 绘制文本。
vis.properties(opts, win=None, env=None, update=None, name=None) # 设置可视化窗口的属性。
vis.updateTrace(X, Y, win, env=None, name=None) # 更新折线图或散点图。
vis.close(win=None, env=None) # 关闭可视化窗口。
vis.clear(win=None, env=None) # 清空可视化窗口。
vis.save(envs=None) # 保存可视化窗口的状态,以便下次使用。
# 其中,参数的含义如下:
# `X`:x轴上的数据,可以是标量、向量、矩阵或张量。
# `Y`:y轴上的数据,可以是标量、向量、矩阵或张量。
# `Z`:等高线图上的高度值,可以是标量、向量、矩阵或张量。
# `opts`:可视化选项,包含各种绘图参数的字典。
# `win`:可视化窗口的名称。
# `env`:可视化窗口所属的环境名称。
# `update`:更新的方式,可以是 "append" 或 "replace"。
# `name`:数据的名称。
# 示例
visdom.line(X=None, Y=None, win=None, update=None, name=None
opts = dict(
title="图表标题",
xlabel="x 轴标签",
ylabel="y 轴标签",
legend="一个包含数据集名称的列表,用于在图例中显示不同的数据集",
width="图表宽度",
height="图表高度",
marginleft="左侧边距",
marginright="右侧边距",
margintop="顶部边距",
marginbottom="底部边距",
xtick="x 轴刻度线 可以是一个包含刻度值的列表,或者是一个形如 (start, end, step) 的元组,用于指定刻度范围和步长 ",
ytick="y 轴刻度线 可以是一个包含刻度值的列表,或者是一个形如 (start, end, step) 的元组,用于指定刻度范围和步长 ",
markers="数据点标记类型 可以是一个包含标记名称的列表,或者是一个标记名称 支持的标记类型包括='dot'、'cross'、'plus'、'square'、'diamond'、'triangle-up'、'triangle-down'、'star'、'hexagon'、'pentagon'、'octagon' 和 'vline' ",
markercolor="数据点标记颜色 可以是一个包含颜色名称或颜色代码的列表,或者是一个颜色名称或颜色代码 如果提供了一个包含多个颜色的列表,则每个数据集将使用该列表中的下一个颜色 ",
linecolor="折线颜色 可以是一个颜色名称或颜色代码 ",
fillarea="是否填充折线下方的区域 可以是一个布尔值,也可以是一个形如 (lower_bound, upper_bound) 的元组,用于指定填充区域的上限和下限 ",
fillcolor="填充颜色 可以是一个颜色名称或颜色代码 如果提供了一个包含多个颜色的列表,则每个数据集将使用该列表中的下一个颜色 ",
))
4 可视化线条
单条线
import visdom
# 创建 Visdom 客户端
vis = visdom.Visdom()
# 定义直线的 x 和 y 坐标
x = [1, 2, 3, 4, 5]
y = [1, 3, 2, 4, 5]
# 绘制直线
line = vis.line(X=x, Y=y, opts=dict(title='Line', xlabel='x', ylabel='y'))
两条线,按点更新
import numpy as np
import visdom
# 创建 Visdom 客户端
vis = visdom.Visdom()
# 绘制多条直线,每次绘制一点
vis.line(X=[1], Y=[[2, 3]], win='1', update='append',
opts=dict(title='Two Lines', xlabel='x', ylabel='y', legend=['Line 1', 'Line 2'])
)
vis.line(X=[2], Y=[[6, 7]], win='1', update='append',
opts=dict(title='Two Lines', xlabel='x', ylabel='y', legend=['Line 1', 'Line 2'])
)
实际应用
import numpy as np import visdom # 创建 Visdom 客户端 vis = visdom.Visdom() for epoch in range(0, 20): trainloss = np.random.randint(1, 50, dtype=np.uint8) valloss = np.random.randint(1, 50, dtype=np.uint8) vis.line(X=[epoch], Y=[[trainloss, valloss]], win='loss', update='append', opts=dict(title='LOSS', legend=['trainloss', 'valloss']))
多条线,按条更新
import numpy as np
import visdom
# 创建 Visdom 客户端
vis = visdom.Visdom()
# 绘制多条直线,每次绘制一条
vis.line(X=[1, 2, 3], Y=[4, 5, 7], win='2', update='append', name='line1',
opts=dict(title='Lines', xlabel='x', ylabel='y', legend=['Line 1', 'Line 2', 'Line 3']) )
vis.line(X=[2, 3, 4], Y=[4, 6, 7], win='2', update='append', name='line2',
opts=dict(title='Lines', xlabel='x', ylabel='y', legend=['Line 1', 'Line 2', 'Line 3']) )
vis.line(X=[3, 4, 5], Y=[4, 6, 7], win='2', update='append', name='line3',
opts=dict(title='Lines', xlabel='x', ylabel='y', legend=['Line 1', 'Line 2', 'Line 3']) )
5 可视化图片
一张图片
import numpy as np
import visdom
# 创建 Visdom 客户端
vis = visdom.Visdom()
image = np.random.randint(0, 255, (3, 40, 40), dtype=np.uint8) # shape=[C,H,W]
vis.image(image, win='image', opts={'title': 'RGB Image'})
多张图片
import numpy as np
import visdom
# 创建 Visdom 客户端
vis = visdom.Visdom()
images = np.random.randint(0, 255, (16, 3, 40, 40)) # shape=[B,C,H,W]
vis.images(images, win='images', nrow=4, opts={'title': 'RGB Image'})
6 可视化文本
一段文本
viz.text('Hello, world!', win='text')