几年后,我在此站点上找到了所有编码问题的解决方案,这是我的第一篇帖子,据我所知,这是一个新问题!
我想从一个数据集中创建多个条形图,并将它们保存为单独的图像。我希望图像尺寸自动缩放,以使任何给定的对象(例如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或其他大小,只要它在所有图像中都一致即可。
答案 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')
。然后仅将无花果的宽度缩放所需的比例。