点击matplotlib scatterplot point 显示另一个基于点元数据的图表?
Click matplotlib scatterplot point to display another graph based on point's meta data?
我已经在我的机器上得到 this 到 运行,它给了我一个想法:我可以根据点的元数据显示一个新的图形而不是打印一个字符串吗?
为了了解我的数据,我有一个包含实验名称和结果的 SQL table,然后我有另一个包含整个实验过程的 table。使用 matplotlib
作图也很容易。我想创建一些交互式的东西,我可以在其中绘制实验的最终结果(某种散点图),允许用户更深入地钻取并查看单击点的整个实验的图表。
看来我应该可以修改 on_pick
函数来进行绘图,如下面的代码所示。
import matplotlib.pyplot as plt
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):
plt.scatter([1,2,3,4], [5,6,7,8]) # For the real function, run a SQL query to
# get the data needed to do the plot of interest
plt.title(event)
plt.show()
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)
plt.show()
当我 运行 执行此操作时,出现错误:QCoreApplication::exec: The event loop is already running
。
可以matplotlib
执行我想做的事情吗?
(最终,目标是将此交互式图表放入 panel
浏览器 window,但我现在满足于 运行 matplotlib
来自命令行。)
除了不需要创建新的散点图,而是更新旧的散点图之外,您所做的一切几乎都很好。这就是你的错误所在。 plt.show()
的循环已经是 运行,并且在您的回调中,您正在尝试再次启动它。你的回调应该是这样的:
def on_pick(event):
plt.clf() # It will clear previous scatter from figure
plt.scatter([1, 2, 3, 4], [5, 6, 7, 8])
plt.draw() # It will tell pyplot to redraw
这将导致:
已提供答案,正在寻找
我想出了如何绘制新图形的方法。它所需要的只是 on_pick
中的唯一名称,而不仅仅是 plt
中的图形和轴。
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
我已经在我的机器上得到 this 到 运行,它给了我一个想法:我可以根据点的元数据显示一个新的图形而不是打印一个字符串吗?
为了了解我的数据,我有一个包含实验名称和结果的 SQL table,然后我有另一个包含整个实验过程的 table。使用 matplotlib
作图也很容易。我想创建一些交互式的东西,我可以在其中绘制实验的最终结果(某种散点图),允许用户更深入地钻取并查看单击点的整个实验的图表。
看来我应该可以修改 on_pick
函数来进行绘图,如下面的代码所示。
import matplotlib.pyplot as plt
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):
plt.scatter([1,2,3,4], [5,6,7,8]) # For the real function, run a SQL query to
# get the data needed to do the plot of interest
plt.title(event)
plt.show()
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)
plt.show()
当我 运行 执行此操作时,出现错误:QCoreApplication::exec: The event loop is already running
。
可以matplotlib
执行我想做的事情吗?
(最终,目标是将此交互式图表放入 panel
浏览器 window,但我现在满足于 运行 matplotlib
来自命令行。)
除了不需要创建新的散点图,而是更新旧的散点图之外,您所做的一切几乎都很好。这就是你的错误所在。 plt.show()
的循环已经是 运行,并且在您的回调中,您正在尝试再次启动它。你的回调应该是这样的:
def on_pick(event):
plt.clf() # It will clear previous scatter from figure
plt.scatter([1, 2, 3, 4], [5, 6, 7, 8])
plt.draw() # It will tell pyplot to redraw
这将导致:
已提供答案,正在寻找
我想出了如何绘制新图形的方法。它所需要的只是 on_pick
中的唯一名称,而不仅仅是 plt
中的图形和轴。
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