Линейный график для каждой координаты в matplot lib - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь построить линии, соединяющие начало (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()

У меня появляется следующее сообщение об ошибке при запуске этого.

Я получил рисунок какпоказано ниже:

enter image description here

Стрелка и линия соответствуют ожидаемым.стрелка должна быть в конце каждой строки.

Кто-нибудь может посоветовать, что здесь происходит?

Спасибо,

Zep

Ответы [ 3 ]

0 голосов
/ 18 ноября 2018

Не уверен на 100%, но я думаю, что во второй строке вам нужно сделать деталь после xy = кортеж, потому что в противном случае она устанавливает деталь перед ключевым параметром, as, и пытается передать деталь после, как обычный аргумент

0 голосов
/ 18 ноября 2018

Если вы хотите построить отрезки, следующий код работает. Возможно, вам понадобятся стрелки или какой-то элемент 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()
0 голосов
/ 18 ноября 2018

Вы путаете положения стрелок. Каждая пара координат в xy и xytext состоит из значений 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()

enter image description here

...