Python中 Matplotlib局部放大圖的畫法

在作對比實驗中,除了對總體形狀的對比,在不少狀況下都須要對某一局部的數據進行放大,來觀察更加精細的對比效果。算法

工具數組

Python的Matplotlib庫函數網絡

步驟

一、導入依賴庫app

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.patches import ConnectionPatch

二、準備數據框架

reward_demaddpg[] 儲存的是執行demaddpg算法後所得到的300個reward結果。機器學習

所以橫座標設置爲:函數

MAX_EPISODES = 300
x_axis_data = []
for l in range(MAX_EPISODES):
    x_axis_data.append(l)

5個對比實驗結果存在5個數組中,分別表示demaddpg算法中設置的不一樣的學習率:工具

file

三、繪主圖post

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)用來控制子圖個數:a爲行數,b爲列數。學習

效果圖以下:

file

四、嵌入局部放大圖的座標系

axins = inset_axes(ax, width="40%", height="30%", loc='lower left',
                   bbox_to_anchor=(0.3, 0.1, 1, 1), 
                   bbox_transform=ax.transAxes)

參數解釋以下:

  • ax:父座標系
  • width, height:子座標系的寬度和高度(百分比形式或者浮點數個數)
  • loc:子座標系的位置
  • bbox_to_anchor:邊界框,四元數組(x0, y0, width, height)
  • bbox_transform:從父座標系到子座標系的幾何映射
  • axins:子座標系

固定座標系的寬度和高度以及邊界框,分別設置loc爲左上、左下、右上(默認)、右下和中間,效果圖以下:

file

效果圖以下:

file

另外有一種更加簡潔的子座標系嵌入方法:

axins = ax.inset_axes((0.2, 0.2, 0.4, 0.3))

ax爲父座標系,後面四個參數一樣是(x0, y0, width, height) ,上述代碼的含義是:以父座標系中的x0=0.2*x,y0=0.2*y 爲左下角起點,嵌入一個寬度爲0.2x,高度爲0.3y的子座標系,其中x和y分別爲父座標系的座標軸範圍。效果以下圖所示:

file

五、在子座標系中繪製原始數據

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}$')

效果以下:

file

六、設置放大區間,調整子座標系的顯示範圍

# 設置放大區間
zone_left = 100
zone_right = 150

# 座標軸的擴展比例(根據實際數據調整)
x_ratio = 0  # x軸顯示範圍的擴展比例
y_ratio = 0.05  # y軸顯示範圍的擴展比例

# 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

# 調整子座標系的顯示範圍
axins.set_xlim(xlim0, xlim1)
axins.set_ylim(ylim0, ylim1)

效果以下:

file

七、創建父座標系與子座標系的鏈接線

# 原圖中畫方框
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默認值"data",也不用改,而後就是axesA要添加子圖,axesB爲要鏈接的主圖。

axins.add_artist(con)

最後將鏈接線添加進子圖。注意是子圖不是主圖。

效果圖以下:

file

以上就是局部放大圖的畫法,最後的方框和線的畫法不止一種,這裏只是找了比較簡單直接的一種。 但願對你有幫助。

原文連接: https://juejin.im/post/5eddf7a96fb9a047923a483b

文源網絡,僅供學習之用,若有侵權請聯繫刪除。

在學習Python的道路上確定會碰見困難,別慌,我這裏有一套學習資料,包含40+本電子書,800+個教學視頻,涉及Python基礎、爬蟲、框架、數據分析、機器學習等,不怕你學不會! https://shimo.im/docs/JWCghr8prjCVCxxK/ 《Python學習資料》

關注公衆號【Python圈子】,優質文章每日送達。

file

相關文章
相關標籤/搜索