亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python Matplotlib Multicursor:在圖例中顯示光標下的值

Python Matplotlib Multicursor:在圖例中顯示光標下的值

慕碼人2483693 2022-12-20 15:19:42
我正在使用 Multicursor 在每個圖形上獲取光標。我想在將鼠標懸停在圖表上時在圖例中顯示被光標擊中的數據點的值,就像這樣實際上我一直認為這是 matplotlib 和 Multicursor 的標準功能,但似乎不是。有人已經這樣做了,還是我必須自己實施。我已經在 cursor 下找到了這篇文章 matplotlib multiple values,但這可能只是我想要的實現的開始。
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

我已經開發了一個解決方案。


import matplotlib.pyplot as plt

import numpy as np

from matplotlib.widgets import MultiCursor

from bisect import bisect_left



fig = plt.figure(figsize=(15, 8))


# create random graph with 60 datapoints, 0 till 59

x = list(range(0,60))


axes_list = [] 


def createRandomGraph(ax,x):

    y = np.random.randint(low=0, high=15, size=60)

    data.append(y)

    ax.plot(x,y, marker='.')



def take_closest(myList, myNumber):

    """

    Assumes myList is sorted. Returns closest value to myNumber.


    If two numbers are equally close, return the smallest number.

    """

    pos = bisect_left(myList, myNumber)

    if pos == 0:

        return myList[0]

    if pos == len(myList):

        return myList[-1]

    before = myList[pos - 1]

    after = myList[pos]

    if after - myNumber < myNumber - before:

       return after, pos

    else:

       return before, pos-1




def show_Legend(event): 

    #get mouse coordinates

    mouseXdata = event.xdata    


    # the value of the closest data point to the current mouse position shall be shown

    closestXValue, posClosestXvalue = take_closest(data[0], mouseXdata)


    i = 1

    for ax in axes_list:

        datalegend = ax.text(1.05, 0.5, data[i][posClosestXvalue],  fontsize=7,

                                      verticalalignment='top', bbox=props, transform=ax.transAxes)               

        ax.draw_artist(datalegend) 


        # this remove is required because otherwise after a resizing of the window there is 

        # an artifact of the last label, which lies behind the new one

        datalegend.remove()

        i +=1


    fig.canvas.update()



# store the x value of the graph in the first element of the list

data = [x]


# properties of the legend labels

props = dict(boxstyle='round', edgecolor='black', facecolor='wheat', alpha=1.5)


for i in range(5):

    if(i>0):        

        # all plots share the same x axes, thus during zooming and panning 

        # we will see always the same x section of each graph

        ax = plt.subplot(5, 1, i+1, sharex=ax)             

    else:

        ax = plt.subplot(5, 1, i+1)        


    axes_list.append(ax)    

    createRandomGraph(ax,x)  


multi = MultiCursor(fig.canvas, axes_list, color='r', lw=1)   


# function show_Legend is called while hovering over the graphs 

fig.canvas.mpl_connect('motion_notify_event', show_Legend)


plt.show()

輸出看起來像這樣

https://i.stack.imgur.com/ksxGW.gif

查看完整回答
反對 回復 2022-12-20
  • 1 回答
  • 0 關注
  • 424 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號