在matplotlib中同时显示绘图的注释文本
Display annotation text of plot simultaneously in matplotlib
我正在尝试同时在同一个图形(或图形)中显示多个绘图的注释文本。下面的代码工作得很好,但它一次为一个图显示一个注释,但我的图表有多个图。 plot1_list、plot2_list、plot3_list 是我图表中的绘图列表。在我的图中,注释文本采用 "labels" 的形式。
如何同时显示每个列表中每个图的注释文本?
import mplcursors
cursor1 = mplcursors.cursor(plot1_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor1.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
cursor2 = mplcursors.cursor(plot2_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor2.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
cursor3 = mplcursors.cursor(plot3_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor3.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
上面代码中的绘图列表是使用以下代码创建的:
label1 = str("MAXIMUM HEAD=" + str(m_head))
label2 = str("MAXIMUM POWER=" + str(m_power))
label3 = str("MAXIMUM EFFICIENCY=" + str(m_efficiency))
plot1, = host.plot(y0, y, linestyle=styles[0], color=colorstouse[count], label=label1)
plot2, = par1.plot(y0, y1, linestyle=styles[1], color=colorstouse[count], label=label2)
plot3, = par2.plot(y0, y2, linestyle=styles[2], color=colorstouse[count], label=label3)
在您的情况下,每条曲线都需要一个单独的 mplcursor。这样每一个都可以单独打开或关闭。
代码看起来有点复杂。这是一个简化的尝试。该示例显示了使用 3 个轴的 15 条曲线。请注意,它可能会变得非常拥挤,因此 90 条弯道可能有点太多了。
from matplotlib import pyplot as plt
import numpy as np
import mplcursors
num_devices = 5
fig, host = plt.subplots(figsize=(12, 4))
fig.subplots_adjust(right=0.8)
par1 = host.twinx()
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.1))
x = np.linspace(0, 10)
y = -x ** 2 + 5 * x + 10
y1 = 10 + 20 * np.cos(x)
y2 = 30 + 5 * np.sin(x)
ys = [y + np.random.uniform(10, 30) for i in range(num_devices)]
y1s = [y1 + np.random.uniform(10, 30) for i in range(num_devices)]
y2s = [y2 + np.random.uniform(10, 30) for i in range(num_devices)]
colors = plt.cm.tab10.colors
plots = []
for dev in range(num_devices):
plot1 = host.plot(x, ys[dev], c=colors[dev], ls='-', label=f'plot 1 - dev {dev}')
plot2, = par1.plot(x, y1s[dev], c=colors[dev], ls='--', label=f'plot 2 - dev {dev}')
plot3, = par2.plot(x, y2s[dev], c=colors[dev], ls=':', label=f'plot 3 - dev {dev}')
plots += [plot1, plot2, plot3]
print(plots)
for i, plot in enumerate(plots):
cursor = mplcursors.cursor(plot, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
cursor.connect("add", lambda sel: sel.annotation.set_text(sel.artist.get_label()))
plt.show()
我正在尝试同时在同一个图形(或图形)中显示多个绘图的注释文本。下面的代码工作得很好,但它一次为一个图显示一个注释,但我的图表有多个图。 plot1_list、plot2_list、plot3_list 是我图表中的绘图列表。在我的图中,注释文本采用 "labels" 的形式。 如何同时显示每个列表中每个图的注释文本?
import mplcursors
cursor1 = mplcursors.cursor(plot1_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor1.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
cursor2 = mplcursors.cursor(plot2_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor2.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
cursor3 = mplcursors.cursor(plot3_list, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
@cursor3.connect("add")
def on_add(sel):
sel.annotation.set_text(sel.artist.get_label())
上面代码中的绘图列表是使用以下代码创建的:
label1 = str("MAXIMUM HEAD=" + str(m_head))
label2 = str("MAXIMUM POWER=" + str(m_power))
label3 = str("MAXIMUM EFFICIENCY=" + str(m_efficiency))
plot1, = host.plot(y0, y, linestyle=styles[0], color=colorstouse[count], label=label1)
plot2, = par1.plot(y0, y1, linestyle=styles[1], color=colorstouse[count], label=label2)
plot3, = par2.plot(y0, y2, linestyle=styles[2], color=colorstouse[count], label=label3)
在您的情况下,每条曲线都需要一个单独的 mplcursor。这样每一个都可以单独打开或关闭。
代码看起来有点复杂。这是一个简化的尝试。该示例显示了使用 3 个轴的 15 条曲线。请注意,它可能会变得非常拥挤,因此 90 条弯道可能有点太多了。
from matplotlib import pyplot as plt
import numpy as np
import mplcursors
num_devices = 5
fig, host = plt.subplots(figsize=(12, 4))
fig.subplots_adjust(right=0.8)
par1 = host.twinx()
par2 = host.twinx()
par2.spines["right"].set_position(("axes", 1.1))
x = np.linspace(0, 10)
y = -x ** 2 + 5 * x + 10
y1 = 10 + 20 * np.cos(x)
y2 = 30 + 5 * np.sin(x)
ys = [y + np.random.uniform(10, 30) for i in range(num_devices)]
y1s = [y1 + np.random.uniform(10, 30) for i in range(num_devices)]
y2s = [y2 + np.random.uniform(10, 30) for i in range(num_devices)]
colors = plt.cm.tab10.colors
plots = []
for dev in range(num_devices):
plot1 = host.plot(x, ys[dev], c=colors[dev], ls='-', label=f'plot 1 - dev {dev}')
plot2, = par1.plot(x, y1s[dev], c=colors[dev], ls='--', label=f'plot 2 - dev {dev}')
plot3, = par2.plot(x, y2s[dev], c=colors[dev], ls=':', label=f'plot 3 - dev {dev}')
plots += [plot1, plot2, plot3]
print(plots)
for i, plot in enumerate(plots):
cursor = mplcursors.cursor(plot, hover=False, bindings={"toggle_visible": "h", "toggle_enabled": "e"})
cursor.connect("add", lambda sel: sel.annotation.set_text(sel.artist.get_label()))
plt.show()