我正在尝试在 matplotlib 上显示具有多轴的悬停标签。
我正在使用 python 3.6.8 和 matplotlib 3.0.3
但什么也没发生(看不到标签)。
这是我的代码:
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)时,我可以看到标签。
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):