面板行中的“matplotlib”可点击图

Dav*_*ave 5 python plot matplotlib data-science panel-pyviz

我已经弄清楚如何使matplotlib图表可单击,以便我可以单击一个点并根据该点的元数据创建一个新图,遵循此处的答案。

现在是时候将可点击的绘图放入Panel仪表板中了。明显的举动是将该数字添加到panel.Row. 虽然这显示了该图,但我没有得到交互性。

import matplotlib.pyplot as plt
import panel as pn

class custom_objects_to_plot:
    def __init__(self, x, y, name):
        self.x = x
        self.y = y
        self.name = name

a = custom_objects_to_plot(10, 20, "a")
b = custom_objects_to_plot(30, 5, "b")
c = custom_objects_to_plot(40, 30, "c")
d = custom_objects_to_plot(120, 10, "d")

def on_pick(event):
    my_fig, my_ax = plt.subplots() # New plot with unique name
    my_ax.scatter([1, 2, 3, 4], [5, 6, 7, 8]) # Make the scatterplot
    my_fig.show() # Show the plot

fig, ax = plt.subplots()
for obj in [a, b, c, d]:
    artist = ax.plot(obj.x, obj.y, 'ro', picker=5)[0]
    artist.obj = obj

fig.canvas.callbacks.connect('pick_event', on_pick)

my_row = pn.Row()
my_row.append(fig)
my_row.show()
Run Code Online (Sandbox Code Playgroud)

如何使交互式(可点击)绘图看起来像从命令行运行时的样子?

小智 1

我对面板不太熟悉,但我在他们的 git 上发现了这个未解决的问题:

https://github.com/holoviz/panel/issues/2349

该问题指出:

我喜欢使用 matplotlib 构建交互式 GUI,并大量使用 matplotlibs 事件,例如 button_press_event、motion_notify_event 等。目前这在 Panel 中是不可能的,因为 Matplotlib 几乎被处理为静态图像,可以在对象更改时重新绘制。

我还检查了文档,以及对未解决问题的一些新更新,看起来通过ipympl添加了一些功能,您可以在其中使用交互式后端,但我不知道它的充实程度。我认为它会看起来像这样,但我可以在今晚晚些时候进行测试。

fig.canvas.callbacks.connect('pick_event', on_pick)

mpl_pane = pn.pane.Matplotlib(fig, interactive=True)
my_row = pn.Row(mpl_pane)
my_row.show()
Run Code Online (Sandbox Code Playgroud)

只是好奇,但它是否必须使用panel,或者另一个 python GUI 可以工作吗?我知道如何在其他 python GUI 框架中执行此操作。