SVG工具提示
此示例显示如何创建将在Matplotlib面片上悬停时显示的工具提示。
虽然可以从CSS或javascript创建工具提示,但在这里,我们在matplotlib中创建它,并在将其悬停在修补程序上时简单地切换它的可见性。这种方法提供了对工具提示的位置和外观的完全控制,而代价是预先获得更多的代码。
另一种方法是将工具提示内容放在SVG对象的Title属性中。然后,使用现有的js/css库,在浏览器中创建工具提示相对简单。内容由title属性决定,外观由CSS决定。
作者:David Huard
import matplotlib.pyplot as pltimport xml.etree.ElementTree as ETfrom io import BytesIOET.register_namespace("", "http://www.w3.org/2000/svg")fig, ax = plt.subplots()# Create patches to which tooltips will be assigned.rect1 = plt.Rectangle((10, -20), 10, 5, fc='blue')rect2 = plt.Rectangle((-20, 15), 10, 5, fc='green')shapes = [rect1, rect2]labels = ['This is a blue rectangle.', 'This is a green rectangle']for i, (item, label) in enumerate(zip(shapes, labels)):patch = ax.add_patch(item)annotate = ax.annotate(labels[i], xy=item.get_xy(), xytext=(0, 0),textcoords='offset points', color='w', ha='center',fontsize=8, bbox=dict(boxstyle='round, pad=.5',fc=(.1, .1, .1, .92),ec=(1., 1., 1.), lw=1,zorder=1))ax.add_patch(patch)patch.set_gid('mypatch_{:03d}'.format(i))annotate.set_gid('mytooltip_{:03d}'.format(i))# Save the figure in a fake file objectax.set_xlim(-30, 30)ax.set_ylim(-30, 30)ax.set_aspect('equal')f = BytesIO()plt.savefig(f, format="svg")# --- Add interactivity ---# Create XML tree from the SVG file.tree, xmlid = ET.XMLID(f.getvalue())tree.set('onload', 'init(evt)')for i in shapes:# Get the index of the shapeindex = shapes.index(i)# Hide the tooltipstooltip = xmlid['mytooltip_{:03d}'.format(index)]tooltip.set('visibility', 'hidden')# Assign onmouseover and onmouseout callbacks to patches.mypatch = xmlid['mypatch_{:03d}'.format(index)]mypatch.set('onmouseover', "ShowTooltip(this)")mypatch.set('onmouseout', "HideTooltip(this)")# This is the script defining the ShowTooltip and HideTooltip functions.script = """<script type="text/ecmascript"><![CDATA[function init(evt) {if ( window.svgDocument == null ) {svgDocument = evt.target.ownerDocument;}}function ShowTooltip(obj) {var cur = obj.id.split("_")[1];var tip = svgDocument.getElementById('mytooltip_' + cur);tip.setAttribute('visibility',"visible")}function HideTooltip(obj) {var cur = obj.id.split("_")[1];var tip = svgDocument.getElementById('mytooltip_' + cur);tip.setAttribute('visibility',"hidden")}]]></script>"""# Insert the script at the top of the file and save it.tree.insert(0, ET.XML(script))ET.ElementTree(tree).write('svg_tooltip.svg')
