保持matplotlib中元素的像素大小和长宽比

时间:2018-10-29 14:24:14

标签: python matplotlib figure aspect-ratio

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

我想从一个数据集中创建多个条形图,并将它们保存为单独的图像。我希望图像尺寸自动缩放,以使任何给定的对象(例如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或其他大小,只要它在所有图像中都一致即可。

1 个答案:

答案 0 :(得分:0)

最后用上面的注释和更多的反复试验找出了答案:

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')。然后仅将无花果的宽度缩放所需的比例。