Python中 Matplotlib局部放大图的画法
在做對比實驗中,除了對整體形狀的對比,在很多情況下都需要對某一局部的數(shù)據(jù)進(jìn)行放大,來觀察更加精細(xì)的對比效果。
工具
Python的Matplotlib庫函數(shù)
步驟
1、導(dǎo)入依賴庫
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import inset_axes from matplotlib.patches import ConnectionPatch2、準(zhǔn)備數(shù)據(jù)
reward_demaddpg[]儲存的是執(zhí)行demaddpg算法后所獲得的300個reward結(jié)果。
因此橫坐標(biāo)設(shè)置為:
MAX_EPISODES = 300 x_axis_data = [] for l in range(MAX_EPISODES):x_axis_data.append(l)5個對比實驗結(jié)果存在5個數(shù)組中,分別表示demaddpg算法中設(shè)置的不同的學(xué)習(xí)率:
3、繪主圖
fig, ax = plt.subplots(1, 1) ax.plot(x_axis_data, reward_demaddpg5, color='#4169E1', alpha=0.8, label='$1*10^{-5}$') ax.plot(x_axis_data, reward_demaddpg10, color='#848484', alpha=0.8, label='$5*10^{-6}$') ax.plot(x_axis_data, reward_demaddpg15, color='#FF774A', alpha=0.8, label='$1*10^{-6}$') ax.plot(x_axis_data, reward_demaddpg20, color='#575B20', alpha=0.8, label='$5*10^{-7}$') ax.plot(x_axis_data, reward_demaddpg25, color='#B84D37', alpha=0.8, label='$1*10^{-7}$') ax.legend(loc="lower right") ax.set_xlabel('Episodes') ax.set_ylabel('Total reward')其中fig, ax = plt.subplots(a,b)用來控制子圖個數(shù):a為行數(shù),b為列數(shù)。
效果圖如下:
4、嵌入局部放大圖的坐標(biāo)系
axins = inset_axes(ax, width="40%", height="30%", loc='lower left',bbox_to_anchor=(0.3, 0.1, 1, 1), bbox_transform=ax.transAxes)參數(shù)解釋如下:
- ax:父坐標(biāo)系
- width, height:子坐標(biāo)系的寬度和高度(百分比形式或者浮點數(shù)個數(shù))
- loc:子坐標(biāo)系的位置
- bbox_to_anchor:邊界框,四元數(shù)組(x0, y0, width, height)
- bbox_transform:從父坐標(biāo)系到子坐標(biāo)系的幾何映射
- axins:子坐標(biāo)系
固定坐標(biāo)系的寬度和高度以及邊界框,分別設(shè)置loc為左上、左下、右上(默認(rèn))、右下和中間,效果圖如下:
效果圖如下:
另外有一種更加簡潔的子坐標(biāo)系嵌入方法:
axins = ax.inset_axes((0.2, 0.2, 0.4, 0.3))ax為父坐標(biāo)系,后面四個參數(shù)同樣是(x0, y0, width, height),上述代碼的含義是:以父坐標(biāo)系中的x0=0.2*x,y0=0.2*y為左下角起點,嵌入一個寬度為0.2x,高度為0.3y的子坐標(biāo)系,其中x和y分別為父坐標(biāo)系的坐標(biāo)軸范圍。效果如下圖所示:
5、在子坐標(biāo)系中繪制原始數(shù)據(jù)
axins.plot(x_axis_data, reward_demaddpg5, color='#4169E1', alpha=0.8, label='$1*10^{-5}$') axins.plot(x_axis_data, reward_demaddpg10, color='#848484', alpha=0.8, label='$5*10^{-6}$') axins.plot(x_axis_data, reward_demaddpg15, color='#FF774A', alpha=0.8, label='$1*10^{-6}$') axins.plot(x_axis_data, reward_demaddpg20, color='#575B20', alpha=0.8, label='$5*10^{-7}$') axins.plot(x_axis_data, reward_demaddpg25, color='#B84D37', alpha=0.8, label='$1*10^{-7}$')效果如下:
6、設(shè)置放大區(qū)間,調(diào)整子坐標(biāo)系的顯示范圍
# 設(shè)置放大區(qū)間 zone_left = 100 zone_right = 150# 坐標(biāo)軸的擴(kuò)展比例(根據(jù)實際數(shù)據(jù)調(diào)整) x_ratio = 0 # x軸顯示范圍的擴(kuò)展比例 y_ratio = 0.05 # y軸顯示范圍的擴(kuò)展比例# X軸的顯示范圍 xlim0 = x_axis_data[zone_left]-(x_axis_data[zone_right]-x_axis_data[zone_left])*x_ratio xlim1 = x_axis_data[zone_right]+(x_axis_data[zone_right]-x_axis_data[zone_left])*x_ratio# Y軸的顯示范圍 y = np.hstack((reward_demaddpg5[zone_left:zone_right], reward_demaddpg10[zone_left:zone_right],reward_demaddpg15[zone_left:zone_right],reward_demaddpg20[zone_left:zone_right],reward_demaddpg25[zone_left:zone_right])) ylim0 = np.min(y)-(np.max(y)-np.min(y))*y_ratio ylim1 = np.max(y)+(np.max(y)-np.min(y))*y_ratio# 調(diào)整子坐標(biāo)系的顯示范圍 axins.set_xlim(xlim0, xlim1) axins.set_ylim(ylim0, ylim1)效果如下:
7、建立父坐標(biāo)系與子坐標(biāo)系的連接線
# 原圖中畫方框 tx0 = xlim0 tx1 = xlim1 ty0 = ylim0 ty1 = ylim1 sx = [tx0,tx1,tx1,tx0,tx0] sy = [ty0,ty0,ty1,ty1,ty0] ax.plot(sx,sy,"black")# 畫兩條線 xy = (xlim0,ylim0) xy2 = (xlim0,ylim1) con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data",axesA=axins,axesB=ax) axins.add_artist(con)xy = (xlim1,ylim0) xy2 = (xlim1,ylim1) con = ConnectionPatch(xyA=xy2,xyB=xy,coordsA="data",coordsB="data",axesA=axins,axesB=ax) axins.add_artist(con)畫方框
使用了畫連接方框四個頂點的四條線段就可以了,從某個點繞個圈再回到起點,就畫出了方框,使用pyplot(x,y),還可以方便地指定顏色,線寬等。
畫跨子圖的線
這里使用連接線,在matplotlib.patches有一個ConnectionPatch類型,就是用的這個,它可以用在一個或多個子圖之間畫線。
con = ConnectionPatch(xyA,xyB,coordsA,coordsB, axesA,axesB)這里xyA是子圖里面的點,xyB是主圖里面的點,coordsA和coordsB默認(rèn)值"data",也不用改,然后就是axesA要添加子圖,axesB為要連接的主圖。
axins.add_artist(con)最后將連接線添加進(jìn)子圖。注意是子圖不是主圖。
效果圖如下:
以上就是局部放大圖的畫法,最后的方框和線的畫法不止一種,這里只是找了比較簡單直接的一種。
 希望對你有幫助。
原文鏈接:
 https://juejin.im/post/5eddf7a96fb9a047923a483b
文源網(wǎng)絡(luò),僅供學(xué)習(xí)之用,如有侵權(quán)請聯(lián)系刪除。
在學(xué)習(xí)Python的道路上肯定會遇見困難,別慌,我這里有一套學(xué)習(xí)資料,包含40+本電子書,800+個教學(xué)視頻,涉及Python基礎(chǔ)、爬蟲、框架、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等,不怕你學(xué)不會!
 https://shimo.im/docs/JWCghr8prjCVCxxK/ 《Python學(xué)習(xí)資料》
關(guān)注公眾號【Python圈子】,優(yōu)質(zhì)文章每日送達(dá)。
總結(jié)
以上是生活随笔為你收集整理的Python中 Matplotlib局部放大图的画法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: css3实现一个闪电效果
- 下一篇: 批量创建100个文件夹,只需10秒~
