将数据重塑为“最接近的正方形”

时间:2016-07-18 22:34:53

标签: python matplotlib

我对python很新。目前使用matplotlib我有一个脚本,返回可变数量的子图,我将传递给另一个脚本进行绘图。我想把这些子情节安排成一个很好的安排,即“最接近正方形的东西”。所以答案是独一无二的,比方说我的重量列数更高

示例:假设我有6个图表,我需要的网格是2x3。如果我有9,它是3x3。如果我有12,它是3x4。如果我有17,它是4x5,但最后一行只创建了一个。

尝试解决方案:我可以轻松找到最接近的方块:

    num_plots = 6
    square_size = ceil(sqrt(num_plots))**2

但这会留下空洞。有没有办法制作正确的网格尺寸?

2 个答案:

答案 0 :(得分:2)

这就是我过去做过的事情

num_plots = 6
nr = int(num_plots**0.5)
nc = num_plots/nr
if nr*nc < num_plots:
    nr+=1
fig,axs = pyplot.subplots(nr,nc,sharex=True,sharey=True)

答案 1 :(得分:2)

如果您有5或7等素数的素数,除非您去一行或一列,否则无法做到。如果有9或15个图,它应该可以工作。

以下示例显示了如何

  • 删除多余的空图
  • 强制轴指针为2D数组,因此即使只有一个图或一行图,也可以对其进行索引
  • 在循环浏览
  • 时为每个绘图找到正确的行和列

这是:

nplots=13
#find number of columns, rows, and empty plots
nc=int(nplots**0.5)
nr=int(ceil(nplots/float(nc)))
empty=nr*nc-nplots
#make the plot grid
f,ax=pyplot.subplots(nr,nc,sharex=True)

#force ax to have two axes so we can index it properly
if nplots==1:
    ax=array([ax])
if nc==1:
    ax=ax.reshape(nr,1)
if nr==1:
    ax=ax.reshape(1,nc)

#hide the unused subplots
for i in range(empty): ax[-(1+i),-1].axis('off')

#loop through subplots and make output
for i in range(nplots):
    ic=i/nr #find which row we're on. If the definitions of ir and ic are switched, the indecies for empty (above) should be switched, too.
    ir=mod(i,nr) #find which column we're on
    axx=ax[ir,ic] #get a pointer to the subplot we're working with
    axx.set_title(i) 

Example result using nplots=1, nplots=3, and nplots=13