【问题标题】:Matplotlib set subplot axis size iterativelyMatplotlib 迭代设置子图轴大小
【发布时间】:2019-04-30 11:57:56
【问题描述】:

有几个相关问题(hereherehere),但建议的解决方案不适用于我的情况。

我正在迭代地创建子图,所以我不提前知道每个子图的宽度(在调用 plt.subplots() 之后计算),这意味着我无法设置每个子图的大小当我最初创建它们时。 我想在创建子图 x 轴后设置它的大小。

想象一下:

items = [A,B,C]  #this could have any number of items in it
f,ax = plt.subplots(len(items),1, figsize=(10,10)) #figsize is arbitrary and could be anything

for i in range(len(items)):
    #calculate x and y data for current item
    #calculate width of x axis for current item
    plt.sca(ax[i])
    cax = plt.gca()
    cax.plot(x,y)
    #here is where I would like to set the x axis size
    #something like cax.set_xlim(), but for the size, not the limit

注意 1:单位无关紧要,但相对大小很重要,因此它可以是像素大小或厘米,甚至是基于相对宽度计算的比率。

注意 2:在这种情况下,x 轴的宽度与 x 限制无关,所以我不能只设置 x 限制并期望轴正确缩放。

另外,我试图保持这段代码简短,因为它是与不熟悉 Python 的人共享的,所以如果唯一的解决方案涉及添加一堆行,那是不值得的,我会忍受不正确的缩放轴。这是一种审美偏好,但不是要求。 谢谢!

编辑:这就是我的目标

【问题讨论】:

  • 你说的是子图的相对大小还是绝对大小?
  • 没关系 - 我想要的是让它们相对于彼此适当缩放(它们是地质横截面,所以 x 轴大小基于点 A 和地图上横截面的 B 点),但如果最简单的方法是为每个人固定一个绝对大小,那也可以。
  • 相对尺寸很简单,如@Felix 的回答所示。
  • 你看到我的回复了吗?这种方法似乎需要提前知道每个子图的相对大小。我的问题是,直到我已经进入循环之后,我才知道尺寸应该是多少。我是否误解了答案中的某些内容?
  • 答案设置height_ratios 绘图之后。所以到那时你就会知道他们需要什么。

标签: python matplotlib scaling subplot axes


【解决方案1】:

您可以创建一个新的GridSpec,指定height_ratios,然后更新每个axs 的位置:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# create figure
f, ax = plt.subplots(3, 1, figsize=(10,10))

# plot some data
ax[0].plot([1, 2, 3])
ax[1].plot([1, 0, 1])
ax[2].plot([1, 2, 20])

# adjust subplot sizes
gs = GridSpec(3, 1, height_ratios=[5, 2, 1])
for i in range(3):
    ax[i].set_position(gs[i].get_position(f))

plt.show()

我在here 之前问过类似的问题。用例略有不同,但它可能仍然有用。

【讨论】:

  • 这种方法的问题(如果我理解正确的话)是你在循环之前设置了 gridspec 比率,而在我进入循环之前我不知道比率,所以我需要可以在创建轴后对其进行修改。
  • 这正是您可以使用上面的代码执行的操作。您的循环将位于“绘制一些数据”块下方。一旦完成并且您知道比率,创建Gridspec 并更新现有轴的位置/大小(请参阅“调整子图​​大小”块)。
  • 啊抱歉——我认为在绘图之前需要设置 gridspec。所以有两个循环,一个用于绘制每个子图,一个用于事后更新它们。效果很好!谢谢!
  • 是的,我也花了一段时间才明白这一点。不客气;-)
  • 啊实际上 - 一个问题。如果你有一列,GridSpec 可以很好地改变高度比,但是如果子图都在同一列中,它不能改变宽度比 - 我认为它只能在每个子图都在它的情况下改变宽度比自己的专栏。 :(
【解决方案2】:

现在你肯定得到了答案,或者这个问题已被弃用,但如果其他人正在搜索,我使用“Bbox”解决了这个问题。这个想法是这样的:

from matplotlib.transforms import Bbox

fig, ax = plt.subplots(3,1, figsize = (11,15))
ax[0].set_position(Bbox([[0.125, 0.6579411764705883], [0.745, 0.88]]))
ax[2].set_position(Bbox([[0.125, 0.125], [0.745, 0.34705882352941175]]))

欲了解更多信息,请查看https://matplotlib.org/api/transformations.html#matplotlib.transforms.Bbox

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2017-05-22
    • 2022-10-13
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2013-08-01
    相关资源
    最近更新 更多