【问题标题】:How do I position the axis frame inside a figure without changing the size of the figure? [Python, matplotlib]如何在不改变图形大小的情况下将轴框定位在图形内? [Python,matplotlib]
【发布时间】:2020-03-21 02:21:17
【问题描述】:

我正在尝试创建包含许多人物的视频,因此我需要轴在多个独立人物中保持稳定。但是,y 轴会改变比例,因此轴的框架会随着刻度标签的变化而不断移动。我正在尝试手动告诉 matplotlib 整个图形的确切大小,并准确告诉它图形中轴的位置,但它无法正常工作。

这是一个基本图形的样子:

import matplotlib.pyplot as plt

fig=plt.figure(figsize=(8,4),facecolor=(0.5,0.5,0.5))
ax=fig.add_subplot()
ax.plot([5,10],[800,900])
plt.show()

如果我希望轴框架从 left=0.5、bottom=0.5、width=0.2 和 height=0.2 开始,这是我尝试更改它的一种方法。我尝试了许多不同的方法,但都失败了,所以这说明了我正在尝试做的事情:

fig=plt.figure(figsize=(8,4),facecolor=(0.5,0.5,0.5))
ax=fig.add_axes((0.5,0.5,0.2,0.2))
ax.plot([5,10],[800,900])
plt.show()

现在,我希望它看起来更像这样,以便轴框的黑框对于每个图形都处于完全相同的位置,并且每个图形的大小都完全相同。这样,当我把它做成动画时,黑框就不会晃动了。 (很明显,我不会在真实视频中使缓冲区变得那么大。)

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您需要使用ax.set_position

    如果你的斧头盒一开始占据了整个图形,你可以相对于旧的创建一个新的尺寸,例如:

    import matplotlib.pyplot as plt 
    
    fig = plt.figure(figsize=(8, 4), facecolor=(0.5, 0.5, 0.5))
    ax = fig.add_subplot(111)
    bbox = ax.get_position()
    new_bbox = (bbox.x0+0.40, bbox.y0+0.40, bbox.width*0.5, bbox.height*0.5)
    ax.set_position(new_bbox)
    ax.plot([5, 10], [800, 900])
    plt.show()
    

    【讨论】:

    • 呃,是的,这行得通。我试过这个,但显然,Jupyter Notebook 的内联 plt.show() 不尊重这一点,只提供紧凑的布局。但是,当我从您的代码中保存该图形时,它的工作原理就像您展示的那样。当我尝试我的实际视频代码时,Jupyter Notebook 正在做同样的事情并且不尊重 set_position,但是当我保存该图时,我显然用 bbox_inches='tight' 覆盖了该位置,使其看起来与 Jupyter 的内联节目。两个独立的问题,两者的作用方式完全相同,让我认为这是一个更大的问题。呃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多