網站首頁 編程語言 正文
seaborn繪制強化學習中的圖片
seaborn可以說是matplotlib的升級版,使用seaborn繪制折線圖時參數數據可以傳遞ndarray或者pandas,方便又好看!
本篇用繪制強化學習中的rewards舉例,實際上也可以用來機器學習中的loss曲線,原理類似。
從一個簡單示例開始
import matplotlib.pyplot as plt import numpy as np import seaborn as sns # 導入模塊 sns.set() # 設置美化參數,一般默認就好 rewards = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) plt.plot(rewards) plt.show()
如上首先導入seaborn模塊,并設置美化參數(aesthetic parameters)sns.set()
,使用matplotlib.pyplot as plt
就可以繪制一個基本的圖像:
使用sns.lineplot或者sns.relplot
實際上relplot包含lineplot和scatterplot,并通過kind
傳參可以轉換為lineplot,
relplot(kind="line")等價于lineplot relplot(kind="scatter")等價于scatterplot
然后再進行適當的調整并加上x,y軸的label,如下:
import matplotlib.pyplot as plt import numpy as np import seaborn as sns; sns.set() # 因為sns.set()一般不用改,可以在導入模塊時順便設置好 rewards = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) sns.lineplot(x=range(len(rewards)),y=rewards) # sns.relplot(x=range(len(rewards)),y=rewards,kind="line") # 與上面一行等價 plt.xlabel("episode") plt.ylabel("reward") plt.show()
最后呈現效果如下:
繪制rewards聚合圖
當我們對同一實驗作出多次得到一組rewards時,如下:
rewards1 = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) rewards2 = np.array([0, 0,0.1,0.4,0.5,0.5,0.55,0.8,0.9,1]) rewards=np.vstack((rewards1,rewards2)) # 合并成二維數組
我們希望繪制出聚合圖,但是sns.lineplot
無法輸入一維以上的數據,我們可以將它們全部轉為一維,雖然有些難看:
import matplotlib.pyplot as plt import numpy as np import seaborn as sns; sns.set() # 因為sns.set()一般不用改,可以在導入模塊時順便設置好 rewards1 = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) rewards2 = np.array([0, 0,0.1,0.4,0.5,0.5,0.55,0.8,0.9,1]) rewards=np.concatenate((rewards1,rewards2)) # 合并數組 episode1=range(len(rewards1)) episode2=range(len(rewards2)) episode=np.concatenate((episode1,episode2)) sns.lineplot(x=episode,y=rewards) plt.xlabel("episode") plt.ylabel("reward") plt.show()
結果如圖:
繪制出了帶聚合陰影的圖,實際上實際部分是seaborn默認對同一x軸的多個y值即rewards做了均值,陰影部分表示多組rewards的范圍,可以使用sns.lineplot(x=episode,y=rewards,ci=None)
去掉。
使用pandas傳參
上面都是用ndarray傳參,這樣一方面免不了與matplotlib.pyplot
混雜的成分比如plt.xlabel,另外繪制rewards聚合圖,也比較麻煩。
既然使用pandas傳參,就需要先把array轉成DataFrame形式,如下:
import numpy as np import pandas as pd rewards1 = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) rewards2 = np.array([0, 0,0.1,0.4,0.5,0.5,0.55,0.8,0.9,1]) rewards=np.vstack((rewards1,rewards2)) # 合并數組 df = pd.DataFrame(rewards).melt(var_name='episode',value_name='reward') # 推薦這種轉換方法 print(df)
推薦上述轉化方法,這樣無論rewards
多少維都不影響最終的繪圖方式,其中melt
方法將所有維合并成一列,var_name='episode',value_name='reward'
則更改對應的列名,轉化結果如下:
? ?episode ?reward
0 ? ? ? ?0 ? ? 0.0
1 ? ? ? ?0 ? ? 0.1
2 ? ? ? ?0 ? ? 0.0
3 ? ? ? ?0 ? ? 0.2
4 ? ? ? ?0 ? ? 0.4
5 ? ? ? ?0 ? ? 0.5
6 ? ? ? ?0 ? ? 0.6
7 ? ? ? ?0 ? ? 0.9
8 ? ? ? ?0 ? ? 0.9
9 ? ? ? ?0 ? ? 0.9
下面完整繪圖:
import seaborn as sns;sns.set() import matplotlib.pyplot as plt import numpy as np import pandas as pd import pandas as pd rewards1 = np.array([0, 0.1,0,0.2,0.4,0.5,0.6,0.9,0.9,0.9]) rewards2 = np.array([0, 0,0.1,0.4,0.5,0.5,0.55,0.8,0.9,1]) rewards=np.vstack((rewards1,rewards2)) # 合并數組 df = pd.DataFrame(rewards).melt(var_name='episode',value_name='reward') sns.lineplot(x="episode", y="reward", data=df) plt.show()
注意這里的x,y不再傳入數組,而是傳入DataFrame中對應的列名,類似于python字典中的鍵
結果如下:
牛刀小試
最后繪制一個更為復雜的可以用于paper的繪制方法:
import seaborn as sns; sns.set() import matplotlib.pyplot as plt import numpy as np import pandas as pd def get_data(): '''獲取數據 ''' basecond = np.array([[18, 20, 19, 18, 13, 4, 1],[20, 17, 12, 9, 3, 0, 0],[20, 20, 20, 12, 5, 3, 0]]) cond1 = np.array([[18, 19, 18, 19, 20, 15, 14],[19, 20, 18, 16, 20, 15, 9],[19, 20, 20, 20, 17, 10, 0]]) cond2 = np.array([[20, 20, 20, 20, 19, 17, 4],[20, 20, 20, 20, 20, 19, 7],[19, 20, 20, 19, 19, 15, 2]]) cond3 = np.array([[20, 20, 20, 20, 19, 17, 12],[18, 20, 19, 18, 13, 4, 1], [20, 19, 18, 17, 13, 2, 0]]) return basecond, cond1, cond2, cond3 data = get_data() label = ['algo1', 'algo2', 'algo3', 'algo4'] df=[] for i in range(len(data)): df.append(pd.DataFrame(data[i]).melt(var_name='episode',value_name='loss')) df[i]['algo']= label[i] df=pd.concat(df) # 合并 sns.lineplot(x="episode", y="loss", hue="algo", style="algo",data=df) plt.title("some loss") plt.show()
結果如下:
總結
原文鏈接:https://johnjim0816.blog.csdn.net/article/details/106715402
相關推薦
- 2022-10-02 Python?Ruby?等語言棄用自增運算符原因剖析_python
- 2022-05-24 Golang?錯誤捕獲Panic與Recover的使用_Golang
- 2022-09-20 redis的string類型及bitmap介紹_Redis
- 2023-01-09 pip升級pip3的快速方法指南_python
- 2022-04-16 Android中RecyclerView實現簡單購物車功能_Android
- 2022-06-15 C++模擬實現List迭代器詳解_C 語言
- 2022-10-09 玩轉Go命令行工具Cobra_Golang
- 2022-09-04 C++實現ETW進行進程變動監控詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支