matplotlib
官方除了提供了鼠标十字光标的示例,还提供了同一图像内多子图共享光标的示例,其功能主要由widgets
模块中的multicursor
类提供支持。
multicursor
类与cursor
类参数类似,差异主要在:
-
cursor
类参数只有一个ax
,即需要显示光标的子图;multicursor
类参数为canvas
和axes
,其中axes
为需要共享光标的子图列表。 -
cursor
类中,光标默认是十字线;multicursor
类中,光标默认为竖线。
官方示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import multicursor t = np.arange(0.0, 2.0, 0.01) s1 = np.sin(2*np.pi*t) s2 = np.sin(4*np.pi*t) fig, (ax1, ax2) = plt.subplots(2, sharex=true) ax1.plot(t, s1) ax2.plot(t, s2) multi = multicursor(fig.canvas, (ax1, ax2), color= 'r' , lw=1) plt.show() |
简易修改版
1
|
multi = multicursor(fig.canvas, (ax1, ax2), color= 'r' , lw=1, horizon=true, verton=true) |
multicursor
类源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
class multicursor(widget): "" " provide a vertical (default) and / or horizontal line cursor shared between multiple axes. for the cursor to remain responsive you must keep a reference to it. example usage:: from matplotlib.widgets import multicursor import matplotlib.pyplot as plt import numpy as np fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=true) t = np.arange(0.0, 2.0, 0.01) ax1.plot(t, np.sin(2*np.pi*t)) ax2.plot(t, np.sin(4*np.pi*t)) multi = multicursor(fig.canvas, (ax1, ax2), color= 'r' , lw=1, horizon=false, verton=true) plt.show() "" " def __init__(self, canvas, axes, useblit=true, horizon=false, verton=true, **lineprops): self.canvas = canvas self.axes = axes self.horizon = horizon self.verton = verton xmin, xmax = axes[-1].get_xlim() ymin, ymax = axes[-1].get_ylim() xmid = 0.5 * (xmin + xmax) ymid = 0.5 * (ymin + ymax) self.visible = true self.useblit = useblit and self.canvas.supports_blit self.background = none self.needclear = false if self.useblit: lineprops[ 'animated' ] = true if verton: self.vlines = [ax.axvline(xmid, visible=false, **lineprops) for ax in axes] else: self.vlines = [] if horizon: self.hlines = [ax.axhline(ymid, visible=false, **lineprops) for ax in axes] else: self.hlines = [] self.connect() def connect(self): "" "connect events." "" self._cidmotion = self.canvas.mpl_connect( 'motion_notify_event' , self.onmove) self._ciddraw = self.canvas.mpl_connect( 'draw_event' , self.clear) def disconnect(self): "" "disconnect events." "" self.canvas.mpl_disconnect(self._cidmotion) self.canvas.mpl_disconnect(self._ciddraw) def clear(self, event): "" "clear the cursor." "" if self.ignore(event): return if self.useblit: self.background = ( self.canvas.copy_from_bbox(self.canvas.figure.bbox)) for line in self.vlines + self.hlines: line.set_visible(false) def onmove(self, event): if self.ignore(event): return if event.inaxes is none: return if not self.canvas.widgetlock.available(self): return self.needclear = true if not self.visible: return if self.verton: for line in self.vlines: line.set_xdata((event.xdata, event.xdata)) line.set_visible(self.visible) if self.horizon: for line in self.hlines: line.set_ydata((event.ydata, event.ydata)) line.set_visible(self.visible) self._update() def _update(self): if self.useblit: if self.background is not none: self.canvas.restore_region(self.background) if self.verton: for ax, line in zip(self.axes, self.vlines): ax.draw_artist(line) if self.horizon: for ax, line in zip(self.axes, self.hlines): ax.draw_artist(line) self.canvas.blit() else: self.canvas.draw_idle() |
到此这篇关于matplotlib绘制多子图共享鼠标光标的方法示例的文章就介绍到这了,更多相关matplotlib 多子图鼠标光标内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/mighty13/article/details/112145863