Неправильная ширина и высота при использовании inset_axes и transData - PullRequest
0 голосов
/ 18 октября 2018

Я хочу построить врезку, указав ширину и высоту в ссылочной рамке данных.Однако при преобразовании этих значений в дюймы (как требуется inset_axes) с использованием transData.transform встроенный топор не учитывает заданную ширину и высоту.Есть идеи почему?Вот мой код:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.projections import get_projection_class,get_projection_names

fig,ax_main=plt.subplots()
width=0.5
height=0.5
x_center=0
y_center=0

new_width,_=(ax_main.transData.transform([width,0])-ax_main.transData.transform([0,0]))/72
_,new_height=(ax_main.transData.transform([0,height])-ax_main.transData.transform([0,0]))/72
print(new_width,new_height)

### Process
ax_val= inset_axes(ax_main, width=new_width, height=new_height, loc=3, 
                   bbox_to_anchor=(x_center,y_center),
                   bbox_transform=ax_main.transData, 
                   borderpad=0.0)

1 Ответ

0 голосов
/ 18 октября 2018

Хотя я не знаю, насколько результат неожиданный, проблема может быть из-за неправильного преобразования.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...