根据地块总数确定子地块面积

Determine subplot square dimensions from total number of plots

当我知道我需要的地块总数并且我希望排列是一个正方形(可能有一些空的子地块)时,我正在尝试弄清楚如何计算子地块尺寸。

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

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

(也对其他替代方案或预制解决方案开放,我正在为 pandas 数据帧的字典做多个子图矩阵)

这应该适用于您正在尝试做的事情。我没有尝试使用 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()