Matplotlib嵌入放大子图功能异常,求助解决方法
在Matplotlib中添加指定区域放大子图的问题
我尝试在Matplotlib中为现有图表添加指定区域的放大子图,编写了如下最小可复现代码:
import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) #Loading Data data = pd.read_csv("lol.csv") data.head() import matplotlib.pyplot as plt ypoints = np.array(data['KDA']) xpoints = np.array(data['Win/Lose']) from mpl_toolkits.axes_grid1.inset_locator import mark_inset, inset_axes ax = plt.subplot(1, 1, 1) ax.scatter(xpoints, ypoints) ax.set_xlabel("Win/Loss") ax.set_ylabel("KDA") axins = ax.inset_axes([0.3, 0.3, 0.47, 0.47]) x1, x2, y1, y2 = 0, 0, -0.5, 6.5 axins.set_xlim(x1, x2) axins.set_ylim(y1, y2) ax.indicate_inset_zoom(axins, edgecolor="black")
当前生成的图表效果不符合预期,我希望实现类似示例中的放大嵌入效果,请问该如何解决?
解决方案
你的代码存在几个关键问题,对应修改如下:
错误的放大区域范围
你设置的x1, x2 = 0, 0会让子图的x轴范围为0到0,相当于没有宽度,这会导致子图无法正常显示放大内容。需要根据实际数据设置合理的x轴范围,比如如果Win/Lose是0和1的二元值,想放大0对应的区域,应该设置x1, x2 = -0.2, 0.2(给点缓冲空间)。未在子图中绘制数据
你创建了嵌入子图axins,但没有在这个子图上绘制对应的散点数据,所以子图是空的。需要在axins上重新绘制数据:axins.scatter(xpoints, ypoints)使用正确的标记放大区域的方法
你用了ax.indicate_inset_zoom,但结合mpl_toolkits.axes_grid1.inset_locator的话,更合适的是用mark_inset来标记主图中的放大区域,它能画出连接主图和子图的指示线。
修改后的完整代码:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1.inset_locator import mark_inset, inset_axes # 加载数据 data = pd.read_csv("lol.csv") ypoints = np.array(data['KDA']) xpoints = np.array(data['Win/Lose']) # 创建主图 ax = plt.subplot(1, 1, 1) ax.scatter(xpoints, ypoints) ax.set_xlabel("Win/Loss") ax.set_ylabel("KDA") # 创建嵌入子图 axins = ax.inset_axes([0.3, 0.3, 0.47, 0.47]) # 设置合理的放大区域范围,这里假设放大Win/Lose=0的区域,x轴给缓冲 x1, x2, y1, y2 = -0.2, 0.2, -0.5, 6.5 axins.set_xlim(x1, x2) axins.set_ylim(y1, y2) # 在子图绘制数据 axins.scatter(xpoints, ypoints) # 标记主图中的放大区域,连接子图 mark_inset(ax, axins, loc1=2, loc2=4, fc="none", ec="black") plt.show()
额外说明:
mark_inset的loc1和loc2参数用来设置指示线在子图上的位置,可根据需求调整(比如1=左上,2=右上,3=右下,4=左下)。- 如果
Win/Lose是其他数值类型,需要对应调整x1和x2的范围,确保包含你想放大的目标区域。
内容的提问来源于stack exchange,提问作者Joyanta J. Mondal
相关产品推荐
相关产品推荐

