将鼠标悬停在数据上时如何显示数据标签 [英] How to show data labels when you mouse over data

查看:117
本文介绍了将鼠标悬停在数据上时如何显示数据标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在绘制一些看起来像这样的数据

I am plotting some data that looks like

931,Oxfordshire,9314125,123255,Larkmead School,Abingdon,125,124,20,SUPP,8
931,Oxfordshire,9314126,123256,John Mason School,Abingdon,164,164,25,6,16
931,Oxfordshire,9314127,123257,Fitzharrys School,Abingdon,150,149,9,0,11
931,Oxfordshire,9316076,123298,Our Lady's Abingdon,Abingdon,57,57,SUPP,SUPP,16

我的基本步骤是

df = pandas.read_csv("file.csv", names=['A','B','C','D','E','F','G', 'H','I','J', 'K'], header=None)
df.replace('SUPP', 3.0, inplace=True)
df = df.convert_objects(convert_numeric=True)
df['KG'] = df['K']*1.0/df['G']
plt.plot(result['KG'])
plt.show()

但是,当我将鼠标悬停在图表上时,我真的很想得到每所学校的名称,这样我就可以浏览数据.有什么办法吗?

However I would really like to get the name of each school when I mouse over the graph so I can explore the data. Is there any way to do this?

推荐答案

只需插入我自己的项目,看看mpldatacursor: https://github.com/joferkington/mpldatacursor

Just to plug my own project, have a look at mpldatacursor: https://github.com/joferkington/mpldatacursor

作为一个基本示例,只需调用datacursor(hover=True, point_labels=df['E'])即可获得90%的所需方式.例如,将您的代码段放在上面:

As a basic example, just calling datacursor(hover=True, point_labels=df['E']) will get you 90% of the way to what you want. For example, taking your code snippet above:

from StringIO import StringIO
import pandas as pd
import matplotlib.pyplot as plt
from mpldatacursor import datacursor

f = StringIO(
"""931,Oxfordshire,9314125,123255,Larkmead School,Abingdon,125,124,20,SUPP,8
931,Oxfordshire,9314126,123256,John Mason School,Abingdon,164,164,25,6,16
931,Oxfordshire,9314127,123257,Fitzharrys School,Abingdon,150,149,9,0,11
931,Oxfordshire,9316076,123298,Our Lady's Abingdon,Abingdon,57,57,SUPP,SUPP,16
""")
df = pd.read_csv(f, names=['A','B','C','D','E','F','G', 'H','I','J', 'K'],
                 header=None)
df.replace('SUPP', 3.0, inplace=True)
df = df.convert_objects(convert_numeric=True)
df['KG'] = df['K']*1.0/df['G']
plt.plot(df['KG'], marker='o')

datacursor(hover=True, point_labels=df['E'])

plt.show()

每当鼠标悬停在行上时,我们都会获得一个弹出标签.

We'll get a popup label whenever the line is hovered over.

但是,根据设计,默认行为是每当鼠标悬停在行上/单击行时,都会显示弹出窗口.因此,使用point_labels选项时,结果可能与您的想法不尽相同:

However, by design, the default behavior is to display the pop-up whenever the line is hovered over / clicked on. Therefore, when using the point_labels option, the result may not quite be what you had in mind:

如果仅希望将鼠标悬停在顶点上时显示弹出窗口,则可以使用类似的解决方法:(在下一个版本中,将有一个选项仅在顶点上显示弹出窗口,因此以后将不再需要此解决方法.)

If you only want the pop-up to be displayed when the vertexes are hovered over, you can use a workaround similar to this: (There will be an option for only displaying the pop-up at vertexes in the next release, so this workaround won't be required in the future.)

from StringIO import StringIO
import pandas as pd
import matplotlib.pyplot as plt
from mpldatacursor import datacursor

f = StringIO(
"""931,Oxfordshire,9314125,123255,Larkmead School,Abingdon,125,124,20,SUPP,8
931,Oxfordshire,9314126,123256,John Mason School,Abingdon,164,164,25,6,16
931,Oxfordshire,9314127,123257,Fitzharrys School,Abingdon,150,149,9,0,11
931,Oxfordshire,9316076,123298,Our Lady's Abingdon,Abingdon,57,57,SUPP,SUPP,16
""")
df = pd.read_csv(f, names=['A','B','C','D','E','F','G', 'H','I','J', 'K'],
                 header=None)
df.replace('SUPP', 3.0, inplace=True)
df = df.convert_objects(convert_numeric=True)
df['KG'] = df['K']*1.0/df['G']
plt.plot(df['KG'], marker='o')

l, = plt.plot(df['KG'], marker='o', linestyle='', visible=False)
datacursor(l, hover=True, point_labels=df['E'])

plt.show()

此外,您可能只想显示有问题的学校,而不是x,y坐标等.要更改此设置,请使用自定义的formatter函数:

Also, you might want to only display the school in question, instead of the x,y coordinates, etc. To change this, use a custom formatter function:

datacursor(l, hover=True, point_labels=df['E'],
           formatter=lambda **kwargs: kwargs['point_label'][0])

最后,您可能想要一个带有更奇特的箭头和不同的相对位置的白框:

And finally, you might want a white box with a fancier arrow and a different relative position:

datacursor(l, hover=True, point_labels=df['E'], bbox=dict(fc='white'),
           formatter=lambda **kwargs: kwargs['point_label'][0], xytext=(0, 25),
           arrowprops=dict(arrowstyle='simple', fc='white', alpha=0.5))

对于最后一个示例,只需将它们全部组合成可运行的版本即可:

Just to put it all together into a runnable version for the last example:

from StringIO import StringIO
import pandas as pd
import matplotlib.pyplot as plt
from mpldatacursor import datacursor

f = StringIO(
"""931,Oxfordshire,9314125,123255,Larkmead School,Abingdon,125,124,20,SUPP,8
931,Oxfordshire,9314126,123256,John Mason School,Abingdon,164,164,25,6,16
931,Oxfordshire,9314127,123257,Fitzharrys School,Abingdon,150,149,9,0,11
931,Oxfordshire,9316076,123298,Our Lady's Abingdon,Abingdon,57,57,SUPP,SUPP,16
""")
df = pd.read_csv(f, names=['A','B','C','D','E','F','G', 'H','I','J', 'K'],
                 header=None)
df.replace('SUPP', 3.0, inplace=True)
df = df.convert_objects(convert_numeric=True)
df['KG'] = df['K']*1.0/df['G']
plt.plot(df['KG'], marker='o')

l, = plt.plot(df['KG'], marker='o', linestyle='', visible=False)
datacursor(l, hover=True, point_labels=df['E'], bbox=dict(fc='white'),
           formatter=lambda **kwargs: kwargs['point_label'][0], xytext=(0, 25))

plt.show()

这篇关于将鼠标悬停在数据上时如何显示数据标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆