假设我有一个这样的数据框:
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)
现在我要注释col2,该值大于2。这意味着,它在图中的5和3处注释了“ B”和“ C”。我该怎么办?
答案 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)
您的输出将是:
注释
现在,任何顶点的坐标(基于前面的代码)是一对(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 :(得分:1)
请检查此代码段 。我创建了另一个名为 x 的数据框,该数据框可根据需要保存您的排序值。
在这里显示两个条件之间的差异,我根据您的值创建了两个重叠的折线图。但是,如果您只想单行,则可以删除
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()