#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()