如何將整個數據幀行添加為散點圖批注

我正在散點圖上繪制兩列Pandas DataFrame,我希望每個點都顯示數據幀的所有行值。我看過這篇文章,并嘗試使用mplcursors做一些類似的事情:

import pandas as pd
from datetime import date, datetime, time, timedelta
import numpy as np
import matplotlib.pyplot as plt
from mplcursors import cursor

df = pd.DataFrame()
df['datetime'] = pd.date_range(start='2016-01-01', end='2016-01-14', freq='30T')
#df = df.set_index('datetime')
df['x1'] = np.random.randint(-30, 30, size=len(df))
df['x2'] = np.random.randint(-30, 20, size=len(df))
df['x3'] = np.random.randint(-20, 30, size=len(df))
df['y1'] = np.random.randint(-100, 100, size=len(df))
df['y2'] = np.random.randint(-300, 200, size=len(df))
df['y3'] = np.random.randint(-200, 300, size=len(df))

def conditions(s):
    if (s['y1'] > 20) or (s['y3'] < 0):
        return 'group1'
    elif (s['x3'] < 20):
        return 'group2'
    elif (s['x2'] == 0):
        return 'group3'
    else:
        return 'group4'

df['category'] = df.apply(conditions, axis=1)

fig = plt.figure(figsize=(12,4))

ax1 = plt.subplot(121)
ax1.scatter(df.x1, df.y1, label='test1')
ax1.scatter(df.x2, df.y2, label='test2')
#cursor(hover=True)
ax1.set_xlabel('test1')
ax1.set_ylabel('test2')
ax1.legend(['test1','test2'])
cr1 = cursor(ax1,hover=True)
#ax1.annotation_names = df.columns.tolist()
cr1.connect("add", lambda x: x.annotation.set_text(df.columns.tolist()[x.target.index]))

ax2 = plt.subplot(122)
ax2.scatter(df.x1, df.y1, label='test1')
ax2.scatter(df.x3, df.y3, label='test3')
ax2.set_xlabel('test1')
ax2.set_ylabel('test3')
ax2.legend(['test1','test3'])
cr2 = cursor(ax2,hover=True)
#ax2.annotation_names = df.columns.tolist()
cr2.connect("add", lambda x: x.annotation.set_text(df.columns.tolist()[x.target.index]))

# save figure
import pickle
pickle.dump(fig, open('FigureObject.fig.pickle', 'wb'))
plt.show()

當我將鼠標懸停在某個點上時,我希望看到一個包含以下內容的標簽(例如):

datetime = 2016-01-01 00:00:00 
x1 = 1 
x2 = -4 
x3 = 22 
y1 = -42 
y2 = -219 
y3 = -158    
category = group1

但我得到了這種類型的錯誤:

cr2.connect("add", lambda x: x.annotation.set_text(df.columns.tolist()[x.target.index]))
IndexError: list index out of range

我怎么修理它?

? 最佳回答:
  • IndexError之所以出現是因為df.columns.tolist()[x.target.index]df.columns.tolist()是一個由7列組成的列表,然后由[x.target.index]索引。
  • df.iloc[x.target.index, :].to_dict()將獲得該點所需的行數據,因為adictalist comprehension為每個keyvalue對創建一個字符串,每個列用\n分隔
cr1.connect("add", lambda x: x.annotation.set_text('\n'.join([f'{k}: {v}' for k, v in df.iloc[x.target.index, :].to_dict().items()])))

  • 或者,使用.to_string()
cr1.connect("add", lambda x: x.annotation.set_text(df.iloc[x.target.index, :].to_string()))

主站蜘蛛池模板: 久久国产免费一区| 亚洲免费视频一区二区三区| 福利一区国产原创多挂探花| 久久一区二区精品综合| 精品人妻无码一区二区三区蜜桃一 | 三上悠亚精品一区二区久久| 日韩最新视频一区二区三| av无码一区二区三区| 国产精品无码一区二区在线观| 中文字幕精品一区二区三区视频| 一本一道波多野结衣AV一区| 国产精品丝袜一区二区三区| 亚洲福利视频一区二区| 国内精自品线一区91| 精品一区二区三区在线播放视频| 中文字幕一区视频一线| 国产日韩精品一区二区三区| 亚洲一区二区无码偷拍| 国产精品视频一区二区三区无码| 无码AV动漫精品一区二区免费| 亚洲av永久无码一区二区三区| 亚洲狠狠狠一区二区三区| 无码精品视频一区二区三区| AV天堂午夜精品一区| 无码AV一区二区三区无码| 视频一区在线播放| 国产91精品一区| 波多野结衣中文字幕一区二区三区| 亚洲日本va一区二区三区| 国产乱码一区二区三区四| 中文字幕亚洲综合精品一区| 亚洲AV综合色一区二区三区| 久久精品一区二区国产| 国产内射在线激情一区| 国产亚洲日韩一区二区三区| 国产一在线精品一区在线观看| 在线观看免费视频一区| 本免费AV无码专区一区| 日韩免费观看一区| 一区二区在线电影| 中文字幕日韩精品一区二区三区|