根据地块总数确定子地块面积
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()
当我知道我需要的地块总数并且我希望排列是一个正方形(可能有一些空的子地块)时,我正在尝试弄清楚如何计算子地块尺寸。
例如,如果我需要 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()