我在 matplotlib 中创建了一个带有多个“插入”轴的绘图,目的是可视化误差线的含义。请考虑以下示例:
import matplotlib.pyplot as plt
from numpy import linspace, random
from scipy.stats import norm
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
num_experiments = 10
data_points = random.randn(num_experiments)
x_values = range(num_experiments)
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_ylim(-5,5)
ax.set_xticks(x_values, ["Experiment {:d}".format(i+1) for i in range(num_experiments)], rotation='vertical')
ax.errorbar(x_values, data_points, yerr=1, fmt='o', capsize=5)
ax.axhline(y=0, color='gray', linestyle='--')
ax.set_ylabel('Measured Value')
inset_width = 2.5
for i, (x, y) in enumerate(zip(x_values, data_points)):
# Calculate inset position
trans_x, trans_y = fig.transFigure.inverted().transform(ax.transData.transform((x, y)))
trans_h, trans_w = fig.transFigure.inverted().transform(ax.transData.transform((0.5, inset_width))) - fig.transFigure.inverted().transform(ax.transData.transform((0, 0)))
inset_ax = fig.add_axes([trans_x, trans_y - trans_w, trans_h, 2*trans_w])
x_gauss = linspace(-inset_width, inset_width, 100)
y_gauss = norm.pdf(x_gauss)
inset_ax.plot(y_gauss, x_gauss, color='blue')
inset_ax.fill_betweenx(x_gauss, y_gauss, where=(x_gauss >= -1) & (x_gauss <= 1), color='blue', alpha=0.3)
inset_ax.axis('off')
plt.xticks(rotation=45)
plt.show()
您可能会看到,小高斯上显示的 67% 置信区间与我在图的主要部分中绘制的 +/-1 误差带并不完全一致。
这是为什么呢?有没有更好、更优雅的方法来正确进行转换?这是一个错误吗?我是否只是在需要禁用的地方缺少一些隐藏的填充?
任何建议都非常感谢!
我能够使用此行解决问题:
inset_ax.margins(x=0,y=0)