【问题标题】:Maintain pixel-size and aspect ratio of elements in matplotlib保持 matplotlib 中元素的像素大小和纵横比
【发布时间】:2019-04-02 12:11:42
【问题描述】:

在为我在这个网站上的所有编码问题找到解决方案几年后,这是我第一篇(据我所知)一个新问题的帖子!

我想从一个数据集创建多个条形图并将它们保存为单独的图像。我希望图像大小自动缩放,以便任何给定对象(例如 1x1 正方形)在每张图像上都显示相同大小。

以下代码生成两个这样的图像,其中每个 1x1 元素大约为 60x60 像素,到目前为止一切正常:

import matplotlib.pyplot as plt

def barchart(bars,size,title):
    hspace,vspace = (max(size)+1,len(size))

    fig = plt.figure(figsize=(hspace,vspace+1))
    fig.add_axes([0.2,0.2,0.6,0.6])
    plt.title(title)
    plt.axis('scaled')

    x_pos = xrange(vspace)
    plt.xlim(0,hspace)
    plt.ylim(-1,vspace)

    plt.barh(x_pos, size, height=1, align='center', alpha=0.5)
    plt.yticks(x_pos, bars)

    plt.savefig(title+'.png',bbox_inches='tight')
    plt.clf()

barchart(["1x1","A","B","C"],[1,3,5,2],"many short bars")

barchart(["1x1","A"],[1,17],"few long bars")

但我想用不同的纵横比来做到这一点,例如每个 1x1 元素在图像上显示为 60x30 像素。 .axis('scaled') 有替代品吗?我尝试在figsizexlim 和两者以及.add_axes().axis() 中的几个关键字中缩放宽度。它们似乎都以不同的方式影响图像的最终比例和纵横比。

确切的像素大小无关紧要,无论是 60x30 还是 66x33 或其他,只要它在所有图像中保持一致即可。

【问题讨论】:

  • 将图形大小与条数成比例缩放是非常不精确的,因为没有考虑边距。
  • 但是add_axes() 的结果应该与图形大小成正比(在这种情况下,两个轴上都是 0.6)。怎么可能是别的?
  • 你说得对,这适用于真正的比例。但在这里你有一个+1
  • 我已经从那里弄明白了,谢谢!在此特定示例中,一些 +/- 1 具有可控的边距(条形图,条形以刻度为中心)。这是否过于具体而不能被视为“有帮助”?

标签: python matplotlib figure aspect-ratio


【解决方案1】:

终于通过上面评论中的提示和更多的反复试验找到了答案:

import matplotlib.pyplot as plt

def barchart(bars,size,title):
    hspace,vspace = (max(size)+1,len(size))

    AR = 0.5 # x-axis will be scaled to 50%
    fig = plt.figure(figsize=(AR*hspace,vspace+1)) 
    fig.add_axes([0.2,0.2,0.6,0.6])
    plt.xlim(0,hspace)
    plt.ylim(-1,vspace)

    plt.title(title)

    x_pos = xrange(vspace)

    plt.barh(x_pos, size, height=1, align='center', alpha=0.5)
    plt.yticks(x_pos, bars)

    plt.savefig(title+'.png',bbox_inches='tight')
    plt.clf()

barchart(["1x1","A","B","C"],[1,3,5,2],"many short bars")

barchart(["1x1","A"],[1,17],"few long bars")

解决方案是将图形大小和轴限制固定为相同的比例,并简单地省略.axis('scaled')。然后仅按所需因子缩放 fig-width。

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 2013-06-26
    • 2012-04-15
    • 1970-01-01
    • 2012-05-01
    • 2012-11-15
    相关资源
    最近更新 更多