如何解决如何获得以英寸为单位的matplotlib绘图区域的大小?
我正在为纸做图,我想在距图的左上角一定距离处贴上标签。 ax.text(x,y,label,transform=ax.transAxes)
几乎可以做到这一点,但是将位置指定为绘图大小的一部分。如果我可以获得绘图区域的绝对大小,可以使用它进行转换。例如,在下面的脚本中,如何获取高度和宽度?
编辑:我只希望绘图的高度和宽度(而不是整个图形)的高度和宽度,并且不包括标签,刻度线等。
from matplotlib import pyplot as plt
import numpy as np
data = np.random.rand(10,10)
fig,ax = plt.subplots()
ax.pcolormesh(data)
ax.set_aspect("equal")
# get width and height of plot here?
plt.show()
解决方法
您上面的回答不错,但也许更好:
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
fig,ax = plt.subplots()
trans = (fig.dpi_scale_trans +
mtransforms.ScaledTranslation(0,1,ax.transAxes))
ax.set_aspect(1)
ax.text(0.1,-0.2,'Boo',transform=trans)
plt.show()
您可以在以下网址阅读更多信息:https://matplotlib.org/tutorials/advanced/transforms_tutorial.html#plotting-in-physical-coordinates
,我确实设法找到了一种方法。因为我使用set_aspect()
-set_aspect()
修改了ax
的边界框,所以它变得更加复杂,但是默认情况下,直到绘制ax
时才应用修改(例如通过plt.show()
),弄乱了获取边界框大小的尝试。
解决方案是:
-
为避免
set_aspect()
出现问题,请在尝试获取边界框大小之前调用apply_aspect()
。这样一来,更新后的宽高比实际上就会更改边界框的大小,以便我们找出它的大小。 -
使用
ax.get_window_extent()
获取绘图区域的大小-这仅获取绘图区域的大小,不包括轴标签,刻度等。 -
ax.get_window_extent()
的结果以“显示单位”为单位,我们可以使用fig.dpi
将其转换为英寸。
因此添加我想要作为示例的标签类型:
from matplotlib import pyplot as plt
import numpy as np
data = np.random.rand(10,10)
fig,ax = plt.subplots()
ax.pcolormesh(data)
ax.set_aspect("equal")
ax.apply_aspect()
bbox = ax.get_window_extent()
# dpi used to convert from display units to inches
dpi = fig.dpi
height = bbox.height / dpi # in inches
width = bbox.width / dpi # in inches
x = 0.2 # in inches
y = 0.1 # in inches
ax.text(x / width,1.0 - y / height,"(a)",verticalalignment="top",color="w",transform=ax.transAxes)
plt.show()
给出:
编辑:我使用matplotlib-3.3.2测试了该解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。