【发布时间】:2021-06-10 18:31:58
【问题描述】:
我有以下代码:
# Make plot of channels with gaps
fig, ax = plt.subplots(nrows=len(gap_list), ncols=1, figsize=(12,len(gap_list)), sharex=True, squeeze=False)
for ch in gap_list:
i = gap_list.index(ch)
resample_s = 4*ch_gap[ch]['rec_rate']
ylabel = ch + ' (' + ch_gap[ch]['board'] +') - '+ ch_gap[ch]['unit']
data = df[ch].resample(f'{resample_s}s').mean()
is_nan = data.isnull()
ax[i].fill_between(data.index, 0, (is_nan*data.max()), color='r', step='mid', linewidth='0')
ax[i].plot(data.index, data, color='b', linestyle='-', marker=',', label=ylabel)
ax[i].legend(loc='upper left')
plt.tight_layout()
plt.show()
其中 gap_list 是一个列表,其中包含来自 pandas 数据框 (df) 的列名。列表的长度可以是 1 到 10 之间的任何值。当 nrows > 1 时它可以正常工作。但是当 nrows == 1 时,我会遇到一个引发异常的问题:
'AxesSubplot' object is not subscriptable
然后我找到了squeeze kwarg并将其设置为false,我认为一切都很好,但现在代码引发了这个异常:
'numpy.ndarray' object has no attribute 'fill_between'
然后我采取了不同的策略并将图形设置在循环之外并将子图创建放在循环内:
fig = plt.figure(figsize=(12,len(gap_list)))
在for循环中创建的每个轴如下:
ax = plt.subplot(len(gap_list), 1, i+1)
这适用于 nrows=1 和 norws > 1。但是,我找不到使所有子图共享 X 轴的好方法。在原始方法中,我可以为 plt.subplots() 设置 sharex=True。
所以感觉原始方法更符合实际,但缺少一个要素来更好地处理 nrows=1 案例。
【问题讨论】:
-
当您将 sqeeze 设置为 False 时,ax 将始终是 2D 数组,因此当您执行 ax[i] 时,您会得到一个 1D 数组,而不是轴对象。在这种情况下,您必须通过 ax[i][0] 访问轴。
标签: python pandas numpy matplotlib