如何根据输入绘制不同数量的子图?
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, U
和 V
都有三个维度。
子图的最终数字应该有
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()
嗨
我给出了输入的数据列表
list1=[T(x,y,z),U(x,y,z),V(x,y,z) ....... n(x,y,z)]
每个 T, U
和 V
都有三个维度。
子图的最终数字应该有
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()