为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信