Matplotlib 分段图

Matplotlib segmented Plot

我有以下数据集:

   df = pd.DataFrame ({"a": [1,2,3,4,5,6,7,8,9,1,11,12,13,14,15,16,17,18,19,20], 
                'b':[1,2,3,4,50,60,70,8,9,10,110,120,130,140,150,16,17,18,19,20],
                'c':[np.nan,2.2,3.4,np.nan,40.9,60.2,np.nan,8.2,8.9,10.1,np.nan,120.2,
                     130.07,140.23,np.nan,16.054,17.20,18.1,np.nan,20.1],
               'd': [100, np.nan,np.nan, 500,np.nan, np.nan,500, 
                     np.nan,np.nan,np.nan,100, np.nan,np.nan, np.nan,500,
                     np.nan,np.nan, np.nan,100,np.nan  ]}
              )

我正在尝试根据以下条件绘制数据:

  1. 在第 'd' 列的 100 到下 100 个之间 我想要一个 在 x 轴上有 'a' 列的图,在 y 轴上有 'b' 列的散点图和 'c' 的线图。
    那就是我将有 3 个不同的情节。第一个从索引 0 到 10,第二个从索引 10 到索引 18,第三个从 18 到 20。(我可以使用 for 循环生成它)

  2. 在每个图中,我希望根据列 'd' 中的位置 500 值分段线图,即,对于索引 0-3 的第一个图,一个线图,索引 3-6另一个和索引 6-10 中的另一个线图。(我无法制作分段线图)

我正在使用以下代码:

    index = index + [len(df)]
    index1 = index1 + [len(df)]

   for k in range (len(index)-1):
      x = df['a'][index[k] + 1:index[k+1]]
      y = df['c'][index[k]+ 1:index[k+1]]
      y1 = df['b'][index[k]+ 1:index[k+1]]

      plt.scatter(x, y)
      plt.plot(x, y1)
      plt.savefig('plot'+ str(k+1000) +'.png')
      plt.clf()

我的第一个情节是这样的:(但是想要三个分段 线图不是连续的(即索引 0-3 的线不应与 3-6 等连接)

抱歉问题太长了,谢谢:)

预期的输出不清楚,但这是在 groupby 的帮助下将数据集分组的一般策略:

选项一:独立人物

group = df['d'].eq(100).cumsum()
for name, g in df.groupby(group):
    f,ax = plt.subplots()
    ax.scatter(g['a'], g['c'])
    ax.plot(g['a'], g['b'])
    f.savefig(f'figure_{name}.png')

选项 2

ax = plt.subplot()
group = df['d'].eq(100).cumsum()
for name, g in df.groupby(group):
    ax.scatter(g['a'], g['c'])
    ax.plot(g['a'], g['b'], label=name)
ax.legend()

选项 3

ax = plt.subplot()
group = df['d'].eq(100).cumsum()
for name, g in df.groupby(group):
    g = g.reset_index()
    ax.scatter(g.index+1, g['c'])
    ax.plot(g.index+1, g['b'])