Хотя я не знаю, насколько результат неожиданный, проблема может быть из-за неправильного преобразования.transData
преобразовывает данные в пиксельном пространстве.Вы делите результат на 72. Результат этого может быть или не быть в дюймах, в зависимости от того, является ли значение dpi 72 или нет.По умолчанию для dpi установлено значение из параметров rc "figure.dpi"
, и это 100 для новой установки matplotlib, а также в случае, если вы не изменили параметры rc.
Чтобы быть в безопасности,
- либо установите значение dpi на 72,
plt.subplots(dpi=72)
- или разделите на число dpi,
(ax_main.... ) / fig.dpi
Однако в более общем смысле кажется, что вы хотите установить ширину и высоту inset_axes
в координатах данных.Поэтому лучше не указывать размер в дюймах.Скорее используйте ограничивающий прямоугольник напрямую.
ax_val = inset_axes(ax_main, width="100%", height="100%", loc=3,
bbox_to_anchor=(x_center,y_center,width,height),
bbox_transform=ax_main.transData,
borderpad=0.0)
Пару месяцев назад я обновил inset_axes
документацию , а также пример , так что, надеюсь, этот случай также должен быть хорошо освещен.Тем не менее, не стесняйтесь высказать свое мнение в случае, если некоторая информация все еще отсутствует.
Еще более интересным здесь может быть новый параметр в matplotlib 3.0, не использующий mpl_toolkits.axes_grid1.inset_locator
, но Axes.inset_axes
метод.Он по-прежнему считается «экспериментальным», но должен работать нормально.
ax_val = ax_main.inset_axes((x_center,y_center,width,height), transform=ax_main.transData)