Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何获得matplotlib绘图区域的大小(以英寸为单位)?_Python_Matplotlib_Size - Fatal编程技术网

Python 如何获得matplotlib绘图区域的大小(以英寸为单位)?

Python 如何获得matplotlib绘图区域的大小(以英寸为单位)?,python,matplotlib,size,Python,Matplotlib,Size,我正在为一张纸做数字,我想在离绘图左上角一定距离的地方贴上标签ax.text(x,y,label,transform=ax.transAxes)几乎可以做到这一点,但将位置指定为绘图大小的一小部分。如果我能得到绘图区域的绝对大小,我可以用它来转换。例如,在下面的脚本中,如何获得高度和宽度 编辑:我只需要绘图的高度和宽度(而不是整个图形),不包括标签、记号等 from matplotlib import pyplot as plt import numpy as np data = np.ran

我正在为一张纸做数字,我想在离绘图左上角一定距离的地方贴上标签
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()

我确实找到了一种方法来做到这一点。它变得更加复杂,因为我使用了
set\u aspect()
-
set\u aspect()
修改
ax
的边界框,但默认情况下,直到绘制
ax
时才应用修改(例如,通过
plt.show()
),这会使获取边界框大小的尝试出错

解决办法是:

  • 要避免由于
    set_aspect()
    而出现问题,请在尝试获取边界框大小之前调用
    apply_aspect()
    。这使得更新后的纵横比实际上修改了边界框的大小,以便我们可以找到它是什么

  • 使用ax.Get\u window\u extent()获取打印区域的大小-这仅获取打印区域的大小,不包括轴标签、记号等

    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()
    
  • ax.get\u window\u 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测试了此解决方案。

    您的上述回答很好,但可能更好:

    导入matplotlib.pyplot作为plt
    将matplotlib.transforms作为MTTransforms导入
    图,ax=plt.子批次()
    变速器=(图dpi\u刻度\u变速器+
    M转换.规模转换(0,1,最大转换)
    ax.set_方面(1)
    ax.text(0.1,-0.2,'Boo',transform=trans)
    plt.show()
    

    您可以在以下位置阅读更多内容:

    fig.get\u size\u inches()
    ?对不起,我需要让问题更清楚。我指的是轴的绘图区域(不是整个图形)的大小,不包括标签、记号等。