【问题标题】:Subplots within a for-loopfor循环中的子图
【发布时间】:2023-03-19 14:32:01
【问题描述】:

我想在循环中创建子图,但结果与我想象的不完全一样。我想在一个大图中散点图。数据来源于两个数据框DFdfr 的匹配列。 DFdfr 具有相同数量的行列和索引。应排除两个数据框的前两列。

这是我的方法,但我得到i 图,每个图都有一个子图。我错过了什么?

        measurements = 9
        for i in range(2,measurements+1):
            try:
                x = DF.iloc[1:,i]
                y = dfr.iloc[1:,i]
        
                inds = ~np.logical_or(np.isnan(x), np.isnan(y))
                x = x[inds]
                y = y[inds]

                xy = np.vstack([x,y])
                z = gaussian_kde(xy)(xy)
                b, m = polyfit(x, y, 1)
                
                fig, ax = plt.subplots(measurements+1,facecolor='w', edgecolor='k')
                ax[i].scatter(x, y, c=z,  s=50, cmap='jet', edgecolor='', label=None, picker=True, zorder= 2)
                ax[i].plot(x, b + m * x, '-')
      
            except KeyError:
                continue
        plt.show()

目前我得到了几个地块,但我想要一个带有多个子地块的地块。

【问题讨论】:

  • more fig, ax = plt.subplots(...) 在循环外,否则为每次迭代创建一个新图形
  • 这解决了它!

标签: python for-loop matplotlib plot


【解决方案1】:

确实,您必须将fig, ax = plt.subplots() 排除在循环之外。

其他一些事情:

  • 以这种方式设置edgecolor='' 可能会引发错误。将其移除,或添加特定颜色。
  • 我确定在您的代码中使用tryexcept KeyError 是否相关。每当请求 dict() 对象(使用格式 a = adict[key])并且键不在字典中时,Python 都会引发 KeyError。也许是:x = x[inds]?如果是这样,我建议您在流程的早期进行此检查。

试试这个:

measurements = 9

fig, ax = plt.subplots(measurements+1, facecolor='w', edgecolor='k')

for i in range(2, measurements+1):
    try:
        x = DF.iloc[1:,i]
        y = dfr.iloc[1:,i]

        inds = ~np.logical_or(np.isnan(x), np.isnan(y))
        x = x[inds]
        y = y[inds]

        xy = np.vstack([x,y])
        z = stats.gaussian_kde(xy)(xy)
        b, m = np.polyfit(x, y, 1)
        ax[i].scatter(x, y, c=z,  s=50, cmap='jet', label=None, picker=True, zorder= 2)
        ax[i].plot(x, b + m * x, '-')
    except KeyError:
        # Temporarily pass but ideally, do something
        pass

plt.show()

【讨论】:

  • 有谁知道如何在二次矩阵(例如 3x3)中排列子图而不是垂直对齐?
  • fig, ax = plt.subplots(nrows=3, ncols=3)ax 将是一个二维坐标轴数组,因此您需要相应地对其进行索引(例如,ax[0, 0] 是左上角)
  • 但目前这是一个循环,因此我无法轻松索引它
猜你喜欢
  • 2019-09-04
  • 1970-01-01
  • 2018-07-25
  • 2017-08-21
  • 2019-05-13
  • 1970-01-01
  • 2020-07-23
  • 2015-07-24
  • 2019-06-05
相关资源
最近更新 更多