我想通过在数据参考框架中指定宽度和高度来绘制插图。但是,当使用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)
答案 0 :(得分:1)
尽管我不知道结果出乎意料的程度,但问题可能是由于使用了错误的转换。 transData
从像素空间中的数据进行转换。将结果除以72。其结果可能是英寸,也可能不是英寸,具体取决于数字dpi是否为72。默认情况下,dpi设置为rc参数"figure.dpi"
中的值,对于新的matplotlib安装,如果您未更改rc参数,则dpi为100。
为了安全起见,
plt.subplots(dpi=72)
(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
documentation和example,因此希望这种情况也能得到很好的解决。但是,如果仍然缺少一些信息,请随时提供反馈。
在这里甚至更有趣的是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)