使用matplotlib库实现图形局部数据放大显示的实践
作者:枭志 发布时间:2021-01-13 18:47:13
标签:matplotlib,图形,局部,放大
一、绘制总体图形
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.patches import ConnectionPatch
import pandas as pd
MAX_EPISODES = 300
x_axis_data = []
for l in range(MAX_EPISODES):
x_axis_data.append(l)
fig, ax = plt.subplots(1, 1)
data1 = pd.read_csv('./result/test_reward.csv')['test_reward'].values.tolist()[:MAX_EPISODES]
data2 = pd.read_csv('./result/test_reward_att.csv')['test_reward_att'].values.tolist()[:MAX_EPISODES]
ax.plot(data1,label="no att")
ax.plot(data2,label = "att")
ax.legend()
二、插入局部子坐标系
#插入子坐标系
axins = inset_axes(ax, width="40%", height="20%", loc=3,
bbox_to_anchor=(0.3, 0.1, 2, 2),
bbox_transform=ax.transAxes)
#在子坐标系中放入数据
axins.plot(data1)
axins.plot(data2)
三、限制局部子坐标系数据范围
#设置放大区间
zone_left = 150
zone_right = 170
# 坐标轴的扩展比例(根据实际数据调整)
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((data1[zone_left:zone_right], data2[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)
(-198439.93763, -134649.56637000002)
四、加上方框和连接线
# 原图中画方框
tx0 = xlim0
tx1 = xlim1
ty0 = ylim0
ty1 = ylim1
sx = [tx0,tx1,tx1,tx0,tx0]
sy = [ty0,ty0,ty1,ty1,ty0]
ax.plot(sx,sy,"blue")
# 画两条线
#第一条线
xy = (xlim0,ylim0)
xy2 = (xlim0,ylim1)
"""
xy为主图上坐标,xy2为子坐标系上坐标,axins为子坐标系,ax为主坐标系。
"""
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)
五、总体实现代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.patches import ConnectionPatch
import pandas as pd
MAX_EPISODES = 300
x_axis_data = []
for l in range(MAX_EPISODES):
x_axis_data.append(l)
fig, ax = plt.subplots(1, 1)
data1 = pd.read_csv('./result/test_reward.csv')['test_reward'].values.tolist()[:MAX_EPISODES]
data2 = pd.read_csv('./result/test_reward_att.csv')['test_reward_att'].values.tolist()[:MAX_EPISODES]
ax.plot(data1,label="no att")
ax.plot(data2,label = "att")
ax.legend()
#插入子坐标系
axins = inset_axes(ax, width="20%", height="20%", loc=3,
bbox_to_anchor=(0.3, 0.1, 2, 2),
bbox_transform=ax.transAxes)
#在子坐标系中放入数据
axins.plot(data1)
axins.plot(data2)
#设置放大区间
zone_left = 150
zone_right = 170
# 坐标轴的扩展比例(根据实际数据调整)
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((data1[zone_left:zone_right], data2[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)
# 原图中画方框
tx0 = xlim0
tx1 = xlim1
ty0 = ylim0
ty1 = ylim1
sx = [tx0,tx1,tx1,tx0,tx0]
sy = [ty0,ty0,ty1,ty1,ty0]
ax.plot(sx,sy,"blue")
# 画两条线
# 第一条线
xy = (xlim0,ylim0)
xy2 = (xlim0,ylim1)
"""
xy为主图上坐标,xy2为子坐标系上坐标,axins为子坐标系,ax为主坐标系。
"""
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)
来源:https://blog.csdn.net/qq_43790749/article/details/122969620
0
投稿
猜你喜欢
- 在 Python 中,if 语句用于根据条件执行不同的代码块。它的基本格式如下:if condition: # 如
- 客户的一台服务器出现Raid故障,经过我们的努力,数据基本恢复成功,但是其中的一个SQL Server日志文件(扩展名LDF)损坏严重,基本
- # -*- coding: utf-8 -*- import httplibfrom urllib import urlencodeimpo
- 利用这个小游戏可以学习一下ython3.3中tkinter的使用方法# -*- coding: utf-8 -*-import tkinte
- 概述用爬虫时,大部分网站都有一定的反爬措施,有些网站会限制每个 IP 的访问速度或访问次数,超出了它的限制你的 IP 就会被封掉。对于访问速
- 背景说明:10 * time.Second //正常数字相乘没错但是package mainimport "time"f
- php从5.2.x升级到5.3.2.出来问题了。有些原来能用的程序报错了。报错内容是Deprecated: Function session
- date("yyyyMMdd",time()) date() 函数功能:用于格式化时间,返回一个字符串。&nb
- assert断言声明,遇到错误则立即返回在使用python语言开发深度学习模型时,经常会遇到模型运行结束时才会发现的崩溃状态,或者得到的结果
- 除了在 Error 对象和 Errors 集合中说明的提供者错误之外,ADO 本身也将错误返回到运行时环境的异常处理机制之中。使用
- Django结合ajax进行页面实时更新踩过的坑简单记录一下在使用Django、echarts和ajax实现数据动态更新时遇到的一些坑: 1
- 随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。操作系统的稳定对数据库来说是十分紧要的,在数据库可操作
- numpy库概述numpy库处理的最基础数据类型是由同种元素构成的多维数组,简称为“数组”数组的特点:数组中所有元素的类型必须相同数组中元素
- 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本
- 10月15日,Adobe公司正式面向全球公布了第10个版本的Flash播放器,这一版本播放器的昵称是大家已经所熟知的“宇宙”。这是一款增加了
- 我们要开始学习如何做等级划分啦。要实现这一功能,还得学习 5 个新的知识点,分别是os.path.exists()、os.mkdir()、算
- 啥也不说了,还是看代码吧! [root@yyjk DATABASE]# cat DBI.py# -*- coding: utf-8 -*-
- 测试环境Python 3.6.2Win 10 内存 8G,CPU I5 1.6 GHz背景描述这个作品来源于一个日志解析工具的开发,这个开发
- 修改my.ini或my.conf,将sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_US
- 本文实例为大家分享了python实现转圈打印矩阵的具体代码,供大家参考,具体内容如下#! conding:utf-8__author__ =