簡體   English   中英

按列而不是行填充 matplotlib 子圖

[英]Fill matplotlib subplots by column, not row

默認情況下,matplotlib 子圖按行填充,而不是按列填充。 為了澄清,命令

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

首先繪制到 3x2 繪圖網格的右上方圖 (idx=2),然后繪制到左中圖 (idx=3)。

有時,無論出於何種原因,都可能需要按行而不是按列填充子圖(例如,因為直接連續的圖屬於一起,並且放置在彼此下方而不是彼此相鄰時更容易解釋)。 如何做到這一點?

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

可能有一百萬種(簡單的)方法可以做到這一點,但是由於我花了一分鍾多的時間來思考這個問題,我想我會分享我的解決方案:

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)

只是希望這可以為某人節省一分鍾。 當然,還有更好的解決方案可用。

如果您強制使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM