我有一个包含80个变量的数据集。我有兴趣创建一个能够在Matplotlib中自动创建20 X 4 GridSpec的函数。每个子图可以包含数据中80个变量中每个变量的直方图或条形图。作为第一步,我成功创建了两个函数(我称之为'计数'和#39;直方图'),其中包含我想要的图的布局。当对单个变量进行测试时,它们都可以工作。下一步,我尝试创建一个函数,该函数将获取列名,循环遍历条件以测试数据类型是否为对象,或者根据数据类型调用正确的函数作为新的子图。这是我到目前为止的代码:
A = np.arange(21)
B = np.arange(4)
coords = []
for i in A:
for j in B:
coords.append([A[i], B[j]])
#Create the gridspec and layout the figure
import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(12,6))
gs = gridspec.GridSpec(2,4)
#Function that relies on what we've done above:
def grid(cols=['MSZoning', 'LotFrontage', 'LotArea', 'Street', 'Alley']):
for i in cols:
for vals in coords:
if str(train[i].dtype) == 'object':
plt.subplot('gs'+str(vals))
counts(cols)
else:
plt.subplot('gs'+str(vals))
histogram(cols)
尝试时,此代码返回错误:
ValueError:子图的单个参数必须是3位整数
为了帮助您实现可视化,我希望实现的目标,我附上下面的屏幕截图,这是由逐行编码(使用我创建的辅助函数)生成的,我试图避免:
任何人都可以帮我弄明白我哪里错了吗?我很感激任何建议。谢谢!
答案 0 :(得分:0)
行plt.subplot('gs'+str(vals))
无效;这也是错误告诉你的。
从matplotlib GridSpec tutorial可以看出,它必须是
ax = plt.subplot(gs[0, 0])
因此,在您的情况下,您可以使用列表中的值
ax = plt.subplot(gs[vals[0], vals[1]])
请注意,如果将gridspec定义为coords
,您还需要确保n*m
列表必须包含gs = gridspec.GridSpec(n,m)
元素。