【问题标题】:increasing width of figure in matplotlib according to number of x values根据 x 值的数量增加 matplotlib 中图形的宽度
【发布时间】:2011-08-18 23:04:37
【问题描述】:

我试图使用matplotlib 绘制barchart。要绘制的项目数可能会有所不同。我无法使用常量(如 6.,8. 或 8.,12. 等)设置 figure.set_size_inches(w,h)set_figwidth(w),因为我无法提前知道 w 或 h 的值应该是什么。我想要 @987654327 @.有人能告诉我怎么做吗?

import pylab

def create_barchart(map):
    xvaluenames = map.keys()
    xvaluenames.sort()
    yvalues = map.values()
    max_yvalue = get_max_yvalue(yvalues)
    xdata = range(len(xvaluenames))
    ydata = [map[x] for x in xvaluenames]
    splitxdata = [x.split('-',1) for x in xvaluenames]
    xlabels = [x[0] for x in splitxdata]
    figure = pylab.figure()
    ax = figure.add_subplot(1,1,1)
    figsize = figure.get_size_inches()
    print 'figure size1=',figsize,'width=',figsize[0],'height=',figsize[1]
    barwidth = .25
    ystep =  max_yvalue/5
    pylab.grid(True)
    if xdata and ydata:
        ax.bar(xdata, ydata, width=barwidth,align='center',color='orange')
        ax.set_xlabel('xvalues',color='green')
        ax.set_ylabel('yvalues',color='green')
        ax.set_xticks(xdata)
        ax.set_xlim([min(xdata) - 0.5, max(xdata) + 0.5])
        ax.set_xticklabels(xlabels)
        ax.set_yticks(range(0,max_yvalue+ystep,ystep))
        ax.set_ylim(0,max(ydata)+ystep)
    figure.autofmt_xdate(rotation=30)
    figure.savefig('mybarplot',format="png")
    print 'figure size2=',figure.get_size_inches()
    pylab.show()

def get_max_yvalue(yvals):
    return max(yvals) if yvals else 0

如果我尝试使用一小部分项目,我会得到

if __name__=='__main__':
    datamap = dict(mark=39,jim=40, simon=20,dan=33)    
    print datamap
    create_barchart(datamap)

但如果我使用更大的集合

datamap = dict(mark=39,jim=40, simon=20,dan=33) 
additional_values= dict(jon=34,ray=23,bert=45,kevin=35,ned=31,bran=11,tywin=56,tyrion=30,jaime=36,griffin=25,viserys=25)
datamap.update(additional_values)  
create_barchart(datamap)

这看起来很糟糕, 我想知道是否有办法增加图形的宽度,根据要绘制的项目数,在两种情况下保持条形的宽度相同

【问题讨论】:

  • len(map) 应该给你柱的数量,你知道这会进入函数。为什么不能根据这个值设置图表的宽度?您的示例中似乎缺少某些内容。它应该是交互式的吗?
  • 不,它不应该是交互式的..应该根据项目的数量计算出宽度的缩放..这是我的脑细胞进入睡眠的情况:-)

标签: python width matplotlib figure


【解决方案1】:

你可以在初始化图形的时候设置宽度:

# default scale is 1 in your original case, scales with other cases:
widthscale = len(yvalues)/4 
figsize = (8*widthscale,6) # fig size in inches (width,height)
figure = pylab.figure(figsize = figsize) # set the figsize

用上面的三行替换figure = pylab.figure() 行,你就会得到你想要的。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 2018-05-20
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多