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

时间:2018-03-01 16:43:24

标签: python matplotlib

默认情况下,matplotlib子图由行填充,而不是按列填充。澄清一下,命令

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

首先绘制到3x2绘图网格(idx = 2)的右上图,然后进入左中图(idx = 3)。

有时,无论出于何种原因,可能需要按行填充子图,而不是按列填充(例如,因为直接连续的图集在一起并且当位于彼此下方时更容易解释,而不是彼此相邻)。如何实现这一目标?

3 个答案:

答案 0 :(得分:5)

您可以使用以下方法创建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])

答案 1 :(得分:1)

可能有一百万(简单)方法可以做到这一点,但由于我花了一分多钟时间思考这个问题,我想我会分享我的解决方案:

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)

希望这可以节省一分钟的时间。当然,有更好的解决方案。

答案 2 :(得分: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