Построить график и аннотировать соответствующий конкретный элемент в python

#python #matplotlib #plot

#python #matplotlib #построить

Вопрос:

Предположим, у меня есть фрейм данных, подобный этому:

 Col1    Col2
 1       A
 5       B
 3       C
 2       D
  

В частности, в python

 DF = pd.DataFrame({'Col1' : [1,5,3,2],'Col2':['A','B','C','D']})
  

Если я построю значения col1 в matplotlib со следующим кодом:

 plt.plot(DF.Col1)
  

Я получаю этот рисунок
введите описание изображения здесь

Теперь я хочу аннотировать col2, где значения больше 2. Это означает, что он аннотирует «B» и «C» в 5 и 3 на рисунке. Как я могу это сделать?

Ответ №1:

Col1 содержит значения букв Col2, поэтому вы можете прочитать каждое значение col1 и проверить, больше ли оно, чем 2. Если это так, вы можете взять букву с тем же индексом в Col2.

Вот пример:

 d={'Col1' : [1,5,3,2],'Col2':['A','B','C','D']}

#get the data
col1=d["Col1"]
col2=d["Col2"]

def getGreaterThanNumb(val, lett, numb):
    if len(val) != len(lett):
        #col1 and col2 must have the same lenght!
        return
    for i in range(0, len(lett)):
        if val[i]>numb:
            print(lett[i]) #Print or store it in a collection

getGreaterThanNumb(col1, col2, 2)
  

Ваш результат будет:

вывод скриншота


АННОТАЦИИ

Теперь координаты любых вершин (на основе предыдущего кода) являются парой (x,y) = (i,val[i]) , поэтому вы можете написать:

 for i in range(0, len(lett)):
        if val[i]>numb:
            #print(lett[i]) #Print or store it in a collection
            plt.annotate(lett[i], (i,val[i])) #Annotate
  

Вот полный код (без использования Pandas, но поведение такое же):

 import matplotlib.pyplot as plt
d={'Col1' : [1,5,3,2],'Col2':['A','B','C','D']}
#get the data
col1=d["Col1"]
col2=d["Col2"]

coords = plt.plot(col1)
plt.ylabel('some numbers')


def getGreaterThanNumb(val, lett, numb):
    if len(val) != len(lett):
        #col1 and col2 must have the same lenght!
        return
    for i in range(0, len(lett)):
        if val[i]>numb:
            plt.annotate(lett[i], (i,val[i])) #Annotate

#Call the annotation method
getGreaterThanNumb(col1, col2, 2)

#plot
plt.show()
  

Ваш результат будет:

График

Комментарии:

1. На самом деле, я знаю, как получить элемент, который больше 2. Я не специалист по matplotlib. Я хочу отобразить их на графике. Я ищу способ построения этих точек

Ответ №2:

Пожалуйста, проверьте этот фрагмент .Я создал другой фрейм данных с именем x, который содержит ваше отсортированное значение на основе требований.

Здесь, чтобы показать разницу между обоими условиями, я создал 2 линейных графика, которые перекрываются на основе вашего значения. Но если вам нужна только одна строка, вы можете удалить

 ax.plot(x['Col1'],label='Line1')
  

построить

 import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({'Col1' : [1,5,3,2],'Col2':['A','B','C','D']})
x=df.loc[df['Col1'] > 2]
fig, ax = plt.subplots()
ax.plot(df['Col1'],label='Line2')
ax.plot(x['Col1'],label='Line1')
for x,y,z in zip(x.index.tolist(),x['Col1'],x['Col2']):
  ax.annotate(z,xy=(x,y))
plt.legend()
plt.show()