按列填充matplotlib子图,而不是按行

7

默认情况下,matplotlib子图是按行填充而不是按列填充的。为了澄清,以下命令:

plt.subplot(nrows=3, ncols=2, idx=2)
plt.subplot(nrows=3, ncols=2, idx=3)

将第一个图绘制到3x2绘图网格的右上角图(idx = 2),然后绘制到中间左侧图(idx = 3)。

有时出于某些原因,可能希望按行而不是按列填充子图(例如,因为直接连续的图属于同一组并且更容易解释,当它们彼此相邻时,而不是相互靠近)。如何实现这一目标?

3个回答

14

您可以使用以下代码创建一个 3x2 的轴数组:

fig, axes = plt.subplots(nrows=3, ncols=2)

如果您对该数组进行转置并展平,那么您可以按列而不是按行绘制:

fig, axes = plt.subplots(nrows=3, ncols=2)

for ax in axes.T.flatten():
    ax.plot([1,2,3])

2

可能有很多(简单的)方法来实现这个,但是因为我花了不止一分钟来考虑这个问题,所以我想分享我的解决方案:

def row_based_idx(num_rows, num_cols, idx):
    return np.arange(1, num_rows*num_cols + 1).reshape((num_rows, num_cols)).transpose().flatten()[idx-1]

有了这个,人们可以轻松地执行以下操作

row_based_plot_idx = row_based_idx(num_rows, num_cols, col_based_plot_idx)
plt.subplot(num_rows, num_cols, row_based_plot_idx)

希望这篇文章能够帮助一些人省下时间。当然,可能会有更好的解决方案。


0

如果你被迫使用 index

尝试使用这个翻译器:

to_row_major_order = (lambda idx, n_row, n_col: ((idx - 1) % n_row) * n_col + int((idx - 1) / n_row) + 1)

# usage:
nrows = 3
ncols = 2
col_major_order_idx = 2
row_major_order_idx = to_row_major_order(col_major_order_idx, nrows, ncols)
plt.subplot(nrows=nrows, ncols=ncols, idx=row_major_order_idx)

一些参考: https://en.wikipedia.org/wiki/Row-_and_column-major_order

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接