我正在创建包含缩放插入的绘图。数据是多种多样的,我不可能在程序启动之前知道数据的样子。我想使缩放插入尽可能地放大,而不与绘图的任何其他元素重叠。下面是一个示例,我使用的缩放为2。理想情况下,我想自动确定该数字应该是多少:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
fig, ax = plt.subplots()
xin = np.linspace(0, np.random.uniform(.5, 4), 1000)
x_samples = np.random.uniform(0.9, 1.1, (1, 1000)) * np.sqrt(xin[:, np.newaxis])
ax.fill_between(xin, x_samples.min(1), x_samples.max(1))
axins = zoomed_inset_axes(ax, zoom=2, loc='upper left')
axins.fill_between(xin, x_samples.min(1), x_samples.max(1))
axins.set_xlim(.05, .1)
idx = np.logical_and(xin > 0.05, xin < 0.1)
axins.set_ylim(x_samples.min(1)[idx].min(), x_samples.max(1)[idx].max())
axins.set_xticks([])
axins.set_yticks([])
mark_inset(ax, axins, loc1=4, loc2=3, fc="none", ec="0.5")
plt.savefig('hey')
plt.clf()
如您所见,zoom=2
的值太小。我可以手动将缩放参数设置为正确的值。这是一个繁琐的过程。是否有一种方法可以自动找到缩放参数,使插入尺寸最大化,同时避免与绘图的其他部分重叠?
1条答案
按热度按时间hzbexzde1#
我们可以用迭代的方式来面对这个问题:
1.从最大可能的缩放开始(使插图占据图的整个高度)。因此,插图的一部分将与图重叠。
1.检查重叠开始点之前存在多少垂直间隙。
1.根据插图的“当前”高度,将其缩小以避免重叠。
1.在重新缩放之后,插图的宽度也会减小,因此我们可以使用留下的自由垂直间隙再次将其放大。
1.返回到2.,直到达到收敛/最大迭代次数。
在实践中,收敛是快速的,并且对于给定的数据在少于10次迭代中达到。
目视检查:
左上角 * 位置处的插图的代码**。
泛化到4个角位置{* 左上角 、 右上角 、 右下角 、 左下角 *}。例如,对于
loc = 'lower right'
: