1.读取txt,准备数据
这里主要用到列表list的split()函数,先简单举个例子:
# 要从line字符串中提取1.598912和2.104217两个数据
line = 'step 0: dis loss 1.598912, gan loss 2.104217'
temp = line.split('loss ')
print(temp)
t = temp[1].split(',')
print(t[0])
print(temp[2])
很简单,看下运行结果就能懂。
好了,我们正式开始从文件中读取数据:
training_log.txt文件中数据格式如下,注意每行数据后多了一空行,准备数据时,新建.txt文件,将下面这部分直接复制到文件中,注意.txt文件要放在.py文件同一目录下
step 0: dis loss 1.598912, gan loss 2.104217
step 1: dis loss 0.732674, gan loss 3.946449
step 2: dis loss 0.573478, gan loss 3.388427
step 3: dis loss 0.680266, gan loss 5.132270
step 4: dis loss 0.663417, gan loss 2.586611
step 5: dis loss 0.958724, gan loss 7.208553
step 6: dis loss 0.736339, gan loss 7.141296
step 7: dis loss 0.502748, gan loss 2.121268
step 8: dis loss 1.547100, gan loss 9.549424
法1:因为数据中有空行,这里用了i来控制
filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
# 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。
# 然后将每个元素中的不同信息提取出来
lines = f.readlines()
# i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要
# j用于判断读了多少条,step为画图的X轴
i = 0
j = 0
for line in lines:
if i % 2 == 0:
temp = line.split('loss ')
t = temp[1].split(',')
step.append(j)
j = j + 1
dis.append(float(t[0]))
gan.append(float(temp[2]))
i = i + 1
else:
i = i + 1
PS:如果你的程序总是出错,那可能是你的.txt中数据的格式有问题,很可能是中间或者最后多了空行,导致出错,可以试着在上面程序的分割字符串部分加上try except语句,像这样:
try:
temp = line.split('loss ')
t = temp[1].split(',')
except:
continue
法2:如果这样做,那就不需要变量i来控制读入的行数,程序可以直接这么写(这样写容错率更高,推荐这样写)
filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
# 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。
# 然后将每个元素中的不同信息提取出来
lines = f.readlines()
# j用于判断读了多少条,step为画图的X轴
j = 0
for line in lines:
try:
temp = line.split('loss ')
t = temp[1].split(',')
except:
continue
step.append(j)
j = j + 1
dis.append(float(t[0]))
gan.append(float(temp[2]))
数据准备完成,此时step, dis, gan三个list中存储了X,Y1,Y2的值,接下来画图
2.使用matplotlib画图
1.如果分别画两张图:
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(10, 10)) # 创建绘图窗口,并设置窗口大小
# 画第一张图
ax1 = fig.add_subplot(211) # 将画面分割为2行1列选第一个
ax1.plot(step, dis, 'red', label='dis') # 画dis-loss的值,颜色红
ax1.legend(loc='upper right') # 绘制图例,plot()中的label值
ax1.set_xlabel('step') # 设置X轴名称
ax1.set_ylabel('Discriminator-loss') # 设置Y轴名称
# 画第二张图
ax2 = fig.add_subplot(212) # 将画面分割为2行1列选第二个
ax2.plot(step, gan, 'blue', label='gan') # 画gan-loss的值,颜色蓝
ax2.legend(loc='upper right') # loc为图例位置,设置在右上方,(右下方为lower right)
ax2.set_xlabel('step')
ax2.set_ylabel('Generator-loss')
plt.show() # 显示绘制的图
绘制效果:
2.画在一张图中
from matplotlib import pyplot as plt
plt.figure()
plt.plot(step, dis, 'red', label='dis')
plt.plot(step, gan, 'blue', label='gan')
plt.legend()
plt.show()
绘制效果:
下面放完整代码:
from matplotlib import pyplot as plt
filename = 'training_log.txt'
step, dis, gan = [], [], []
# 相比open(),with open()不用手动调用close()方法
with open(filename, 'r') as f:
# 将txt中的数据逐行存到列表lines里 lines的每一个元素对应于txt中的一行。然后将每个元素中的不同信息提取出来
lines = f.readlines()
# i变量,由于这个txt存储时有空行,所以增只读偶数行,主要看txt文件的格式,一般不需要
# j用于判断读了多少条,step为画图的X轴
i = 0
j = 0
for line in lines:
if i % 2 == 0:
temp = line.split('loss ')
t = temp[1].split(',')
step.append(j)
j = j + 1
dis.append(float(t[0]))
gan.append(float(temp[2]))
i = i + 1
else:
i = i + 1
fig = plt.figure(figsize=(10, 5)) # 创建绘图窗口,并设置窗口大小
# 画第一张图
ax1 = fig.add_subplot(211) # 将画面分割为2行1列选第一个
ax1.plot(step, dis, 'red', label='dis') # 画dis-loss的值,颜色红
ax1.legend(loc='upper right') # 绘制图例,plot()中的label值
ax1.set_xlabel('step') # 设置X轴名称
ax1.set_ylabel('Discriminator-loss') # 设置Y轴名称
# 画第二张图
ax2 = fig.add_subplot(212) # 将画面分割为2行1列选第二个
ax2.plot(step, gan, 'blue', label='gan') # 画gan-loss的值,颜色蓝
ax2.legend(loc='upper right') # loc为图例位置,设置在右上方,(右下方为lower right)
ax2.set_xlabel('step')
ax2.set_ylabel('Generator-loss')
plt.show() # 显示绘制的图
plt.figure()
plt.plot(step, dis, 'red', label='dis')
plt.plot(step, gan, 'blue', label='gan')
plt.legend()
plt.show()
参考博文: