画带有标准差阴影的折线图
# 导入库函数
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 平滑处理,类似tensorboard的smoothing函数。
def smooth(read_path, save_path, file_name, x='timestep', y='reward', weight=0.75):
data = pd.read_csv(read_path + file_name)
scalar = data[y].values
last = scalar[0]
smoothed = []
for point in scalar:
smoothed_val = last * weight + (1 - weight) * point
smoothed.append(smoothed_val)
last = smoothed_val
save = pd.DataFrame({x: data[x].values, y: smoothed})
save.to_csv(save_path + 'smooth_'+ file_name)
# 平滑预处理原始reward数据
smooth(read_path='./BipedalWalker-v3/', save_path='./BipedalWalker-v3/', file_name='PPO_BipedalWalker-v3_log_210.csv')
smooth(read_path='./BipedalWalker-v3/', save_path='./BipedalWalker-v3/', file_name='PPO_BipedalWalker-v3_log_310.csv')
smooth(read_path='./BipedalWalker-v3/', save_path='./BipedalWalker-v3/', file_name='PPO_BipedalWalker-v3_log_410.csv')
# 设置图片大小
plt.figure(figsize=(15, 10))
# 画图
sns.lineplot(data=df, x="timestep", y="reward")
标准差就是采用几个CSV文件的数据,append到一起,就可以用sns.lineplot画带有标准差的图了。
如何将两个不同的csv文件画在同一张图中:首先利用给csv文件数据添加列的操作,分别在两个csv文件的最后一列添加该文件的算法名称(用作后面分为不同折线的依据)。然后将两个csv文件的数据append到一个csv文件中,在画图的命令中添加hue参数:
plt.figure(figsize=(15, 10))
sns.lineplot(data=df, x="timestep", y="reward", hue="算法名称")
利用hue参数就可以把数据分为一张图中的两条折线。