matplotlib 中每个坐标的线图

Line plot for each coordinate in matplot lib

我正在尝试绘制连接起点 (x,y) 和终点 (x,y) 的线条 这意味着一条线将连接 (x1start,y1start) 到 (x1end,y1end) 我在数据框中有多行。 复制实际数据框的示例数据框如下所示:

df = pd.DataFrame()
df ['Xstart'] = [1,2,3,4,5]
df ['Xend'] = [6,8,9,10,12]
df ['Ystart'] = [0,1,2,3,4]
df ['Yend'] = [6,8,9,10,12]

据此,如果我们查看 df 的第一行,一条线将连接 (1,0) 到 (6,6) 为此,我使用 for 循环为每一行画一条线,如下所示:

  fig,ax = plt.subplots()
fig.set_size_inches(7,5)

for i in range (len(df)):
    ax.plot((df.iloc[i]['Xstart'],df.iloc[i]['Xend']),(df.iloc[i]['Ystart'],df.iloc[i]['Yend']))
    ax.annotate("",xy = (df.iloc[i]['Xstart'],df.iloc[i]['Xend']),
    xycoords = 'data',
    xytext = (df.iloc[i]['Ystart'],df.iloc[i]['Yend']),
    textcoords = 'data',
    arrowprops = dict(arrowstyle = "->", connectionstyle = 'arc3', color = 'blue'))

plt.show()

当我 运行 这个时,我有以下错误信息。

得到如下图:

箭头和线符合预期。箭头应该在每条线的终点。

谁能告诉我这是怎么回事?

谢谢,

齐普

您混淆了箭头的位置。 xyxytext 中的每个坐标对都包含一个 x 和 y 值。

另外,为了在图表中看到箭头,您需要手动设置图表的限制,因为在缩放数据限制时,出于充分的理由,注释没有被考虑在内。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame()
df ['Xstart'] = [1,2,3,4,5]
df ['Xend'] = [6,8,9,10,12]
df ['Ystart'] = [0,1,2,3,4]
df ['Yend'] = [6,8,9,10,12]


fig,ax = plt.subplots()
fig.set_size_inches(7,5)

for i in range (len(df)):
    ax.annotate("",xy = (df.iloc[i]['Xend'],df.iloc[i]['Yend']),
                xycoords = 'data',
                xytext = (df.iloc[i]['Xstart'],df.iloc[i]['Ystart']),
                textcoords = 'data',
                arrowprops = dict(arrowstyle = "->", 
                                  connectionstyle = 'arc3', color = 'blue'))

ax.set(xlim=(df[["Xstart","Xend"]].values.min(), df[["Xstart","Xend"]].values.max()),
       ylim=(df[["Ystart","Yend"]].values.min(), df[["Ystart","Yend"]].values.max()))
plt.show()

不是 100% 确定,但我认为在第二行中,您需要将 xy= 之后的部分设为元组,否则它会将 , 前面的部分设置为关键字参数,并尝试像往常一样传递 , 之后的部分参数

如果要绘制线段,可以使用以下代码。您可能需要箭头或某种 annotate 元素(注意正确的拼写),但您的目标似乎是绘制线段,这完成了:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame()
df ['Xstart'] = [1,2,3,4,5]
df ['Xend'] = [6,8,9,10,12]
df ['Ystart'] = [0,1,2,3,4]
df ['Yend'] = [6,8,9,10,12]

fig = plt.figure()
ax = fig.add_subplot(111)
for i in range (len(df)):
    ax.plot(
        (df.iloc[i]['Xstart'],df.iloc[i]['Xend']),
        (df.iloc[i]['Ystart'],df.iloc[i]['Yend'])
    )
plt.show()