在做对比实验中,除了对整体形状的对比,在很多情况下都需要对某一局部的数据进行放大,来观察更加精细的对比效果。

工具

Python的Matplotlib库函数

步骤

1、导入依赖库

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

2、准备数据

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算法中设置的不同的学习率:

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)用来控制子图个数:a为行数,b为列数。

效果图如下:

4、嵌入局部放大图的坐标系

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为左上、左下、右上(默认)、右下和中间,效果图如下:

效果图如下:

另外有一种更加简洁的子坐标系嵌入方法:

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分别为父坐标系的坐标轴范围。效果如下图所示:

5、在子坐标系中绘制原始数据

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、设置放大区间,调整子坐标系的显示范围

# 设置放大区间
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)

效果如下:

7、建立父坐标系与子坐标系的连接线

# 原图中画方框
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)

最后将连接线添加进子图。注意是子图不是主图。

效果图如下:

以上就是局部放大图的画法,最后的方框和线的画法不止一种,这里只是找了比较简单直接的一种。
希望对你有帮助。

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

文源网络,仅供学习之用,如有侵权请联系删除。

在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,800+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会!
https://shimo.im/docs/JWCghr8prjCVCxxK/ 《Python学习资料》

关注公众号【Python圈子】,优质文章每日送达。

Python中 Matplotlib局部放大图的画法相关推荐

  1. 【Python】Matplotlib局部放大图画法

    [Python]Matplotlib局部放大图画法 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_ ...

  2. python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体、自定义设置图像标题使用的字体类型

    python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体.自定义设置图像标题使用的字体类型 目录

  3. Python中matplotlib默认绘制的条形图比较胖?如何设置成体型匀称的条形图,达到最佳的可视化效果。

    Python中matplotlib默认绘制的条形图比较胖?如何设置成体型匀称的条形图,达到最佳的可视化效果. #默认情形下的条形图 n_bars = len(x_labels)xval = np.ar ...

  4. python绘制三维曲面图-python中Matplotlib实现绘制3D图的示例代码

    Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现.但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三 ...

  5. python 颜色_如何使用python中matplotlib库分析图像颜色

    用代码分析图像可能很困难.你如何使代码"理解"图像的上下文? 通常,使用AI分析图像的第一步 是找到主要颜色.在如何使用python中matplotlib库分析图像颜色中,我们将使 ...

  6. (原)python中matplotlib的颜色及线条控制

    (原)python中matplotlib的颜色及线条控制https://www.cnblogs.com/darkknightzh/p/6117528.html 转载于: (原)python中matpl ...

  7. python中matplotlib是什么意思_python中Matplotlib面向对象是什么?

    之前讲过Matplotlib以及作图的一些小技巧.那么,小编问大家Matplotlib面向对象是什么?有的人就答不上来了.接下来我们一起探究. Matplotlib中常⽤对象的包含关系为Figure ...

  8. python中matplotlib条形图数值大的在最底层显示_如何使用python的matplotlib模块绘制水平条形图...

    python是一个很有趣的语言,可以在命令行窗口运行.python中有很多功能强大的模块,这篇经验告诉你,如何利用python的matplotlib模块,绘制水平条形图. 工具/原料 windows系 ...

  9. python中matplotlib绘图中文显示问题

    由于毕业设计中用到了python的matplotlib绘图,期间老师一直要让图中的title和label中文显示,matplotlib默认不支持中文, 经过了一上午的折腾,终于成功解决这个问题,这里分 ...

最新文章

  1. 从源码分析DEARGUI之菜单
  2. 2010年暑假送给大学生30句话
  3. UA MATH523A 实分析3 积分理论16 截口与单调类、特征函数的Fubini定理
  4. 议rman的crosscheck和obsolete
  5. 海康威视主机升级固件_海康威视网络广播主机DSKAM6HG1S
  6. LOADRUNNER连接ORACLE数据库的方法
  7. “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
  8. 从Client应用场景介绍IdentityServer4(二)
  9. jedis 连接池使用流程图
  10. hdu3394--Railway(点的双连通分量)
  11. 把一个SVN项目的目录结构 导入到另外一个空白的SVN项目里
  12. Byte学堂:出租车数据竟然可以这么玩!
  13. 如何使用虚拟串口软件进行串口调试
  14. php 时间戳转换日期格式用法
  15. ArcGis-学习笔记1-地图矢量化
  16. 谷歌浏览器提示因应用程序的并行配置不正确无法启动
  17. asp.net发邮件
  18. Ubuntu交叉编译工具链安装
  19. 揭开宏的神秘面纱:什么是宏,为什么使用宏?
  20. html在字体两边加直线,CSS文字两边添加横线的几种方法

热门文章

  1. 浅谈为什么大电容滤低频小电容滤高频
  2. 经纬度转geohash函数
  3. 中国大数据公司市场价值排行榜发布
  4. headroom.js使用
  5. 51单片机auxr寄存器_MCS-51单片机特殊功能寄存器详解
  6. 《系统虚拟化与云计算》(三)云计算中的存储技术
  7. WMS 智能分拣系统的种类及发展趋势
  8. 软件测试生命周期及流程
  9. linux基础管道命令参数用法
  10. 图形化开放式生信分析系统开发 - 7 分析报告的模板定制与自动生成