【发布时间】: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') 有替代品吗?我尝试在figsize、xlim 和两者以及.add_axes() 和.axis() 中的几个关键字中缩放宽度。它们似乎都以不同的方式影响图像的最终比例和纵横比。
确切的像素大小无关紧要,无论是 60x30 还是 66x33 或其他,只要它在所有图像中保持一致即可。
【问题讨论】:
-
将图形大小与条数成比例缩放是非常不精确的,因为没有考虑边距。
-
但是
add_axes()的结果应该与图形大小成正比(在这种情况下,两个轴上都是 0.6)。怎么可能是别的? -
你说得对,这适用于真正的比例。但在这里你有一个
+1。 -
我已经从那里弄明白了,谢谢!在此特定示例中,一些 +/- 1 具有可控的边距(条形图,条形以刻度为中心)。这是否过于具体而不能被视为“有帮助”?
标签: python matplotlib figure aspect-ratio