在python中绘制并注释相应的特定元素

时间:2020-09-08 06:00:06

标签: python matplotlib plot

假设我有一个这样的数据框:

Col1    Col2
 1       A
 5       B
 3       C
 2       D

特别是在python中

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

如果我使用以下代码在matplotlib中绘制col1值:

plt.plot(DF.Col1)

我得到这个数字 enter image description here

现在我要注释col2,该值大于2。这意味着,它在图中的5和3处注释了“ B”和“ C”。我该怎么办?

2 个答案:

答案 0 :(得分: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)

您的输出将是:

otput screenshot


注释

现在,任何顶点的坐标(基于前面的代码)是一对(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()

您的输出将是:

graph

答案 1 :(得分:1)

请检查此代码段 。我创建了另一个名为 x 的数据框,该数据框可根据需要保存您的排序值。

在这里显示两个条件之间的差异,我根据您的值创建了两个重叠的折线图。但是,如果您只想单行,则可以删除

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

plot

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