使用inset_axes和transData时宽度和高度错误

时间:2018-10-18 01:01:34

标签: python-3.x matplotlib

我想通过在数据参考框架中指定宽度和高度来绘制插图。但是,当使用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 :(得分:1)

尽管我不知道结果出乎意料的程度,但问题可能是由于使用了错误的转换。 transData从像素空间中的数据进行转换。将结果除以72。其结果可能是英寸,也可能不是英寸,具体取决于数字dpi是否为72。默认情况下,dpi设置为rc参数"figure.dpi"中的值,对于新的matplotlib安装,如果您未更改rc参数,则dpi为100。

为了安全起见,

  • 将数字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 documentationexample,因此希望这种情况也能得到很好的解决。但是,如果仍然缺少一些信息,请随时提供反馈。

在这里甚至更有趣的是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)