python学习——读取txt文件数据并画图

2023-05-16

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()

 

参考博文:

python读取txt天气数据并使用matplotlib模块绘图

Python 绘图,我只用 Matplotlib(二)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python学习——读取txt文件数据并画图 的相关文章

随机推荐