【问题标题】:How do you get the size of a matplotlib plot area in inches?如何以英寸为单位获得 matplotlib 绘图区域的大小?
【发布时间】:2023-04-08 06:09:01
【问题描述】:

我正在为一篇论文制作图形,我想在距绘图左上角一定距离的地方放置一个标签。 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()

【问题讨论】:

  • fig.get_size_inches()?
  • 对不起,我需要让问题更清楚。我的意思是轴的绘图区域的大小(不是整个图),不包括标签、刻度等。

标签: python matplotlib size


【解决方案1】:

你上面的回答很好,但也许更好:

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

【讨论】:

    【解决方案2】:

    我确实设法找到了一种方法来做到这一点。它变得更加复杂,因为我使用set_aspect() - set_aspect() 修改了ax 的边界框,但默认情况下直到ax 被绘制(例如plt.show())才应用修改,这搞砸了尝试获取边界框大小。

    解决办法是:

    1. 为避免来自set_aspect() 的问题,请在尝试获取边界框大小之前调用apply_aspect()。这使得更新后的纵横比实际上修改了边界框大小,因此我们可以找出它是什么。

    2. 使用ax.get_window_extent() 获取绘图区域的大小 - 这仅获取绘图区域的大小,不包括轴标签、刻度等。

    3. 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 测试了这个解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 2023-03-28
      • 2016-06-18
      相关资源
      最近更新 更多