matplotlib:通过变换精确插入图位置和大小

问题描述 投票:0回答:1

我在 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()

结果如下所示: illustration

您可能会看到,小高斯上显示的 67% 置信区间与我在图的主要部分中绘制的 +/-1 误差带并不完全一致。

这是为什么呢?有没有更好、更优雅的方法来正确进行转换?这是一个错误吗?我是否只是在需要禁用的地方缺少一些隐藏的填充?

任何建议都非常感谢!

python matplotlib statistics
1个回答
0
投票

我能够使用此行解决问题:

inset_ax.margins(x=0,y=0)
© www.soinside.com 2019 - 2024. All rights reserved.