如何根据输入绘制不同数量的子图?

How to plot the figure of varying number of subplots according to the input?

我给出了输入的数据列表 list1=[T(x,y,z),U(x,y,z),V(x,y,z) ....... n(x,y,z)]

每个 T, UV 都有三个维度。 子图的最终数字应该有

T (x,y)         T(x,z)      T(y,z)

U (x,y)         U(x,z)      U(y,z)

V (x,y)         V(x,z)      V(y,z)

如何制作一个函数来输出这样一个数字?

我正在尝试类似

nrow=len(list)
ncol=3

fig = plt.figure(figsize=(9, 6))
For i in list:
    for k in (ncol*nrow):
        sub2 = fig.add_subplot(nrow,ncol,1)
        plt.scatter(list[i](x),list[i](y))
        sub3 = fig.add_subplot(nrow,ncol,2)
        plt.scatter(list[i](x),list[i](z))
        sub3 = fig.add_subplot(nrow,ncol,3)
        plt.scatter(list[i](y),list[i](z))
        

我不知道如何找到一个通用的解决方案..虽然看起来很傻

以下是对您似乎想要做的事情的可能解释:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

list1 = [pd.DataFrame(np.random.rand(20, 3), columns=['x', 'y', 'z']) for _ in range(np.random.randint(2, 6))]

nrow = len(list1)
ncol = 3

fig = plt.figure(figsize=(9, 6))
for row, list_i in enumerate(list1):
    ax1 = fig.add_subplot(nrow, ncol, row * 3 + 1)
    ax1.scatter(list_i['x'], list_i['y'])
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax2 = fig.add_subplot(nrow, ncol, row * 3 + 2)
    ax2.scatter(list_i['x'], list_i['z'])
    ax2.set_xlabel('x')
    ax2.set_ylabel('z')
    ax3 = fig.add_subplot(nrow, ncol, row * 3 + 3)
    ax3.scatter(list_i['y'], list_i['z'])
    ax3.set_xlabel('y')
    ax3.set_ylabel('z')
plt.tight_layout()
plt.show()

使用 the object-oriented API 并使循环更“pythonic”,相同的代码可能如下所示:

fig, axs = plt.subplots(ncols=ncol, nrows=nrow, figsize=(9, 6), squeeze=False)
for row_axs, list_i in zip(axs, list1):
    for ax, (first, second) in zip(row_axs, [('x', 'y'), ('x', 'z'), ('y', 'z')]):
        ax.scatter(list_i[first], list_i[second])
        ax.set_xlabel(first)
        ax.set_ylabel(second)
plt.tight_layout()