本篇内容介绍了“如何使用matplotlib库实现图形局部数据放大显示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、绘制总体图形
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.axes_grid1.inset_locator import inset_axesfrom matplotlib.patches import ConnectionPatchimport pandas as pdMAX_EPISODES = 300x_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 = 150zone_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_ratioxlim1 = 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_ratioylim1 = 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 = xlim0tx1 = xlim1ty0 = ylim0ty1 = ylim1sx = [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 npimport matplotlib.pyplot as pltfrom mpl_toolkits.axes_grid1.inset_locator import inset_axesfrom matplotlib.patches import ConnectionPatchimport pandas as pdMAX_EPISODES = 300x_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 = 150zone_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_ratioxlim1 = 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_ratioylim1 = np.max(y)+(np.max(y)-np.min(y))*y_ratio# 调整子坐标系的显示范围axins.set_xlim(xlim0, xlim1)axins.set_ylim(ylim0, ylim1)# 原图中画方框tx0 = xlim0tx1 = xlim1ty0 = ylim0ty1 = ylim1sx = [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)
“如何使用matplotlib库实现图形局部数据放大显示”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!