【问题标题】:Update Existent Matplotlib Subplot with a user input使用用户输入更新现有的 Matplotlib 子图
【发布时间】:2016-11-16 20:13:49
【问题描述】:

我目前正在尝试在我的代码中实现“缩放”功能。我的意思是我希望并排放置两个子图,其中一个包含初始数据,另一个包含由用户输入决定的“放大”图。

目前,我可以并排创建两个子图,但是在调用用户输入后,我的脚本不是更新第二个子图,而是在下面创建一个全新的图形,而不是更新第二个子图。重要的是首先绘制包含data 的图形,以便用户可以相应地选择输入值。

def plot_func(data):

    plot_this = data

    plt.close('all')

    fig = plt.figure()

    #Subplot 1
    ax1 = fig.add_subplot(1,2,1)
    ax1.plot(plot_this)
    plt.show()

    zoom = input("Where would you like to zoom to: )
    zoom_in = plot_this[0:int(zoom)]

    #Subplot 2
    ax2 = fig.add_subplot(1,2,2)
    ax2.plot(zoom_in)

    plt.show()

上面的代码是我希望做的简化版本。显示一个子图,并基于该子图,让用户输入一个输入。然后要么编辑一个已经创建的子图,要么在第一个子图旁边创建一个新的子图。同样重要的是,“放大”的子图与第一个相对的子图并排在下方。

【问题讨论】:

  • 你知道通常的matplotlib绘图窗口已经实现了Zoom tool吗?
  • 我没有!感谢您的链接。尽管我并没有尝试实际缩放,而是尝试绘制与其自身平行的较大数据集的一部分。也许缩放是不正确的词。
  • 那么也许您正在寻找something like this
  • 是的,虽然没有那么复杂。我不需要在第一个图中显示第二个图,只需将它们并排显示即可。

标签: python matplotlib figure subplot


【解决方案1】:

我认为用户输入数字进行缩放不是很方便。更标准的方式是各种matplotlib tools 已经提供的鼠标交互。

没有用于放大不同绘图的标准工具,但我们可以使用 matplotlib.widgets.RectangleSelector 轻松提供此功能,如下面的代码所示。

我们需要在两个子图中绘制相同的数据,并将 RectangleSelector 连接到其中一个子图 (ax)。每次进行选择时,第一个子图中选择的数据坐标仅用作第二个子图的轴限制,有效地证明了放大(或放大)功能。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import  RectangleSelector


def onselect(eclick, erelease):
  #http://matplotlib.org/api/widgets_api.html
  xlim = np.sort(np.array([erelease.xdata,eclick.xdata ]))
  ylim = np.sort(np.array([erelease.ydata,eclick.ydata ]))
  ax2.set_xlim(xlim)
  ax2.set_ylim(ylim)

def toggle_selector(event):
    # press escape to return to non-zoomed plot
    if event.key in ['escape'] and toggle_selector.RS.active:
        ax2.set_xlim(ax.get_xlim())
        ax2.set_ylim(ax.get_ylim())


x = np.arange(100)/(100.)*7.*np.pi
y = np.sin(x)**2

fig = plt.figure()
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122)

#plot identical data in both axes
ax.plot(x,y, lw=2)
ax.plot([5,14,21],[.3,.6,.1], marker="s", color="red", ls="none")
ax2.plot(x,y, lw=2)
ax2.plot([5,14,21],[.3,.6,.1], marker="s", color="red", ls="none")

ax.set_title("Select region with your mouse.\nPress escape to deactivate zoom")
ax2.set_title("Zoomed Plot")

toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='box',  interactive=True)
fig.canvas.mpl_connect('key_press_event', toggle_selector)

plt.show()

【讨论】:

  • 这是一个了不起的工具,谢谢!我对它进行了测试,它完美无缺。我确实有一个问题,那就是我在 Jupyter Notebook 中运行我的脚本,这就是我对用户输入法感兴趣的原因。是否可以在笔记本中允许此功能?
  • @neerbasu 您想使用 jupyter notebook 的事实是应该在问题中添加的重要信息。我绝对从未使用过jupyter,但是关于笔记本的全部故事,用户无论如何都可以直接在代码中输入任何值吗?那你为什么需要input?我也怀疑我上面的交互式示例在 jupyter 中不起作用。
  • 你说得对,很抱歉在看到它是一个关键因素之前我没有提到这一点。我很抱歉。好消息是我确实找到了一些代码,可以实现与您之前提到的相同的功能。
【解决方案2】:
%matplotlib inline
import mpld3
mpld3.enable_notebook()

【讨论】:

  • 您需要提供一些最低限度的信息,说明这 3 行在多大程度上可以回答您的问题。有人怎么会到这个网站根本不明白这些行是什么意思以及把它们放在哪里。
猜你喜欢
  • 2017-03-31
  • 2019-03-14
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多