为每一行绘制pandas的线段图

4

我有数据框,其中包含多个点的x,y坐标。一行可以包含多个点。

我正在尝试找到一种简单的方法,能够在每行数据中的每个点之间绘制直线,生成曲线。

这里是一个简化的例子,其中两条线分别由两个点表示。

line1 = {'p1_x':1, 'p1_y':10, 'p2_x':2, 'p2_y':11 }
line2 = {'p1_x':2, 'p1_y':9, 'p2_x':3, 'p2_y':12 }
df = pd.DataFrame([line1,line2])

df.plot(y=['p1_y','p2_y'], x=['p1_x','p2_x'])

当我尝试绘制它们时,我希望第一条线从x=1开始,第二条线从x=2开始。但实际上,x轴包含了两对值(1,2)和(2,3),而且这两条线在x轴上有相同的起点和终点。
如何解决这个问题?
编辑:如果使用matplotlib,下面的硬编码值将生成我所感兴趣的图形: plt.plot([[1,2],[2,3]],[[10,9],[11,12]])

1
也许你只是想要 df.T.plot() - Bharath M Shetty
3个回答

3

虽然我相信使用纯pandas应该有更简洁的方法,但这里提供了一种使用matplotlib和一些从原始df导出的派生方法的简单方法。(我希望我正确理解了问题)

假设: 在df中,您将x值放在偶数列中,将y值放在奇数列中

获取x

x = df.loc[:, df.columns[::2]]
x

    p1_x    p2_x
0   1   2
1   2   3

获取 y
y = df.loc[:, df.columns[1::2]]
y

    p1_y    p2_y
0   10  11
1   9   12

然后使用for循环绘制图表

for i in range(len(df)):
    plt.plot(x.iloc[i,:], y.iloc[i,:])

enter image description here


谢谢!是的,那就是我想做的! - Dangraf
很高兴能够帮忙。不过我感觉一定有更好的方法。 - akilat90

0

不需要创建额外的数据框。可以通过循环遍历行来绘制这些线条:

line1 = {'p1_x':1, 'p1_y':10, 'p2_x':2, 'p2_y':11 }
line2 = {'p1_x':2, 'p1_y':9, 'p2_x':3, 'p2_y':12 }
df = pd.DataFrame([line1,line2])

for i in range(len(df)):   # for each row:
    # plt.plot([list of Xs], [list of Ys])
    plt.plot([df.iloc[i,0],df.iloc[i,2]],[df.iloc[i,1],df.iloc[i,3]])
plt.show()

这些线条将以不同的颜色绘制。要获得相同颜色的线条,可以添加选项 c='k' 或任何所需颜色。

plt.plot([df.iloc[i,0],df.iloc[i,2]],[df.iloc[i,1],df.iloc[i,3]], c='k')

enter image description here


-1

通常我不使用pandas绘图,因为我认为它相当有限,如果使用matplotlib不是问题的话,以下代码可以使用:

from matplotlib import pyplot as plt
plt.plot(df.p1_x,df.p1_y)
plt.plot(df.p2_x,df.p2_y)
plt.plot()

如果你有很多行需要绘制,可以使用for循环。


猜猜Pandas plotting是什么?如果你在这里看https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.plot.html,它们说“使用matplotlib / pylab制作DataFrame的图表。” - Bharath M Shetty
谢谢您的帮助,但不幸的是这不是解决方案。我需要每行p1和p2之间有一条线。您的第一个图将每行的所有p1连接起来。 - Dangraf
@Dangraf 好的!误解了问题。 - Harald Heitmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接