从总图数确定子图方形尺寸

时间:2017-03-26 06:16:18

标签: algorithm python-3.5 dimensions subplot

当我知道我需要的总块数时,我试图弄清楚如何计算子图尺寸,并且我希望这个布局是一个正方形(可能有几个空的子图)。

例如,如果我需要22个子图,那么我将为5x5制作一个总共25个子图的网格,然后将其中的三个留空。

所以我想我正在寻找一种算法,我输入22并输出5,例如。任何人都知道在python中执行此操作的简短方法(如果可能,可能是lambda函数)?

(对于这样做,我也可以使用其他替代方案或预先制定的解决方案,我为pandas数据帧字典做了多个子图矩阵)

1 个答案:

答案 0 :(得分:1)

这应该适用于你想要做的事情。我没有尝试过lambda函数,但我怀疑修改它是不是很难。不会有任何空图,因为一旦超出绘图值,算法就会停止。

我将字典分解为键和值列表,因为我在撰写本文时最初使用的是列表。直到try子句的所有内容都可以在不将值转换为列表的情况下工作。如果你想用空图填充而不是使用有点hack -y break_test位,你可以将你的所有代码放在try子句中。

奇怪的破解版本:

fig = plt.figure()

# Makes organizing the plots easier
key_list, val_list = [k, v for k, v in dict.getitems()]

# We take advantage of the fact that int conversions always round down
floor = int(np.sqrt(len(val_list))

# If the number of plots is a perfect square, we're done.
# Otherwise, we take the next highest perfect square to build our subplots
if floor ** 2 == len(val_list):
    sq_chk = floor
else:
    sq_chk = floor + 1

plot_count = 0

# The try/except makes sure we can gracefully stop building plots once 
# we've exhausted our dictionary values.
for i in range(sq_chk):
    for j in range(sq_chk):
        try:
            break_test = val_list[plot_count]
        except:
            break

        ax = fig.add_subplot(sq_chk, sq_chk, plot_count + 1)
        ax.set_title(key_list[plot_count])

        ...
        # Whatever you want to do with your plots
        ...

        plot_count += 1

plt.show()

没有中断版本:

fig = plt.figure()
key_list, val_list = [k, v for k, v in dict.getitems()]

floor = int(np.sqrt(len(dict))

if floor ** 2 == len(dict):
    sq_chk = floor
else:
    sq_chk = floor + 1

plot_count = 0

# Everything from the original snippet should be nested in the try clause
for i in range(sq_chk):
    for j in range(sq_chk):
        try:

            ax = fig.add_subplot(sq_chk, sq_chk, plot_count + 1)
            ax.set_title(key_list[plot_count])

            ...
            # Whatever you want to do with your plots
            ...

            plot_count += 1

        except:
            plot_count +=1

plt.show()