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 ]}
)
我正在尝试根据以下条件绘制数据:
在第 'd' 列的 100 到下 100 个之间 我想要一个
在 x 轴上有 'a' 列的图,在 y 轴上有 'b' 列的散点图和 'c' 的线图。
那就是我将有 3 个不同的情节。第一个从索引 0 到 10,第二个从索引 10 到索引 18,第三个从 18 到 20。(我可以使用 for 循环生成它)
在每个图中,我希望根据列 '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'])
我有以下数据集:
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 ]}
)
我正在尝试根据以下条件绘制数据:
在第 'd' 列的 100 到下 100 个之间 我想要一个 在 x 轴上有 'a' 列的图,在 y 轴上有 'b' 列的散点图和 'c' 的线图。
那就是我将有 3 个不同的情节。第一个从索引 0 到 10,第二个从索引 10 到索引 18,第三个从 18 到 20。(我可以使用 for 循环生成它)在每个图中,我希望根据列 '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'])