python - 将鼠标悬停在多轴上的一个点上时如何使标签出现?
问题描述
我正在尝试在 matplotlib 上显示具有多轴的悬停标签。
我正在使用 python 3.6.8 和 matplotlib 3.0.3
我的情节有多个轴,我查看了这篇文章中的示例:
将鼠标悬停在 matplotlib 中的某个点上时可以显示标签吗?
但什么也没发生(看不到标签)。
这是我的代码:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
x = np.sort(np.random.rand(15))
y = np.sort(np.random.rand(15))
y2 = np.sort(np.random.rand(15))
fig = plt.figure()
ax1 = plt.subplot(2, 2, 1)
line, = plt.plot(x,y)
ax1.grid(True)
ax2 = ax1.twinx()
ax2.plot(x, y2, color='green')
ax2.tick_params(axis='y', labelcolor='green')
annot = ax1.annotate("", xy=(0,0), xytext=(-20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
x,y = line.get_data()
annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
text = "x = {}\ny= {}".format(x[ind["ind"][0]], y[ind["ind"][0]])
annot.set_text(text)
annot.get_bbox_patch().set_alpha(0.4)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax1:
cont, ind = line.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
当我禁用(评论)第二个轴(ax2
)时,我可以看到标签。
使用多轴时如何显示悬停标签?
解决方案
问题确实是事件仅针对双轴之一触发。因此,如果要标记两个轴的内容,则需要多路复用标记,即创建两个注释,每个轴一个,并调整代码以使两个注释都可能可见。
这可能如下所示:
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
x = np.sort(np.random.rand(15))
y = np.sort(np.random.rand(15))
y2 = np.sort(np.random.rand(15))
fig = plt.figure()
ax1 = plt.subplot(2, 2, 1)
line1, = plt.plot(x,y)
ax1.grid(True)
ax2 = ax1.twinx()
line2, = ax2.plot(x, y2, color='green')
ax2.tick_params(axis='y', labelcolor='green')
annots = []
for ax in [ax1, ax2]:
annot = ax1.annotate("", xy=(0,0), xytext=(-20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w", alpha=0.4),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
annots.append(annot)
annot_dic = dict(zip([ax1, ax2], annots))
line_dic = dict(zip([ax1, ax2], [line1, line2]))
def update_annot(line, annot, ind):
x,y = line.get_data()
annot.xy = (x[ind["ind"][0]], y[ind["ind"][0]])
text = "x = {}\ny= {}".format(x[ind["ind"][0]], y[ind["ind"][0]])
annot.set_text(text)
def hover(event):
if event.inaxes in [ax1, ax2]:
for ax in [ax1, ax2]:
cont, ind = line_dic[ax].contains(event)
annot = annot_dic[ax]
if cont:
update_annot(line_dic[ax], annot, ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if annot.get_visible():
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
推荐阅读
- php - 无法使用 postgres 和 docker 创建数据库
- php - Laravel 迁移错误:找不到基表或视图
- python - 如何使用按钮浏览下一个和上一个列表项?
- java - 给定数组表示 S 所需的最小数字计数
- python - Filter grouped pandas dataframe, keep all rows with minimum value in column
- javascript - 赛普拉斯:对意外访问/请求错误进行故障排除
- python - ValueError:形状 (None, 1) 和 (None, 101) 不兼容
- css - 名称修改导致选择器不选择
- javascript - 如何打开一个新的空白窗口并使新的空白窗口在 Javascript 中显示警报?
- r - 如何在所有组合中使用 SD 求平均值