如何从放大的 matplotlib.pyplot 图中读取新的限制?
How can I read new limits from a zoomed matplotlib.pyplot figure?
我有2个问题,在下面标出Q1、Q2。 Q1是主要的,Q2是次要的。
我想从放大的 matplotlib.pyplot
图中读取新的限制。也就是说,我希望发生类似以下步骤的事情:
- 有一组数据,比如y_i 其中i=0...9999
- 全套是用
matplotlib.pyplot.plot
命令绘制的
- 用户查看数据并使用内置的图形-window 放大镜操作放大数据
- 当用户对缩放感到满意时,he/she 向程序发送消息(Q1: 怎么样?)“我对这些(水平)感到满意限制,阅读并保存它们
- 代码读取当前水平值(Q2:图形window能否保持打开状态?如果是,则步骤(6-7)适用)
- 如果用户想选择另一个间隔,he/she点击“重置图片”按钮并返回到步骤 (3)
- 用户高兴时,he/she关闭图
如果 Q2 为“否”,则步骤 (6-7) 将替换为另一个循环,其中图形在 (5) 中闭合并重新绘制并从 (1) 开始。我可以接受,但更喜欢“Q2=yes”版本。
基于 我猜 plt.waitforbuttonpress()
以某种方式参与其中,但我无法破译 link 中的建议。我从未使用过 python 中的“事件”内容。我希望情节 window 中已经有一些内置的 event
s,我能以某种方式访问它们吗?
示例代码:
import numpy as np
import matplotlib.pyplot as plt
N = 9999
dt = 0.1 / 180 * np.pi # 0.1 degree steps
tt = np.arange(0, N*dt, dt)
yy = np.sin(tt) + 0.05 * np.random.random(tt.shape) # include some noise
fig = plt.figure()
plt.plot(tt,yy)
plt.show()
# now the user zooms in... and questions Q1, Q2 apply.
好的,我找到了解决方案,虽然我觉得这很non-aesthetic。我非常欢迎更好的解决方案。这个对问题 Q1 和 Q2 都有效,但有两个缺点:(1) 它使用全局变量,有人告诉我这是糟糕的编程(?),以及 (2) 它给出弃用警告。代码修改的动机来自https://matplotlib.org/3.3.1/gallery/widgets/rectangle_selector.html (h/t @tmdavison)
import numpy as np
import matplotlib.pyplot as plt
def press_key_in_figure(event):
global xlimits
print("You pressed %s" % event.key)
if event.key == 'a':
xlimits = ax.get_xlim() # floats
print("new x-limits: %.2f %.2f" % xlimits)
if event.key == 'b':
ylimits = ax.get_ylim() # floats
print("new y-limits: %.2f %.2f" % ylimits)
xlimits = (0, 0)
N = 9999
dt = 0.1 / 180 * np.pi # 0.1 degree steps
tt = np.arange(0, N*dt, dt)
yy = np.sin(tt) + 0.05 * np.random.random(tt.shape) # include some noise
fig, ax = plt.subplots()
ax.plot(tt,yy)
fig.canvas.mpl_connect('key_press_event', press_key_in_figure)
plt.show()
# now the user zooms in... and questions Q1, Q2 apply.
print("The new x-limits after the window was closed are", xlimits)
当我 运行 缩放图片,然后按“a”或“b”时,它给出:
C:\python\lib\tkinter\__init__.py:1705: MatplotlibDeprecationWarning: Toggling axes navigation from the keyboard is deprecated since 3.3 and will be removed two minor releases later.
return self.func(*args)
You pressed a
new x-limits: 3.62 6.48
You pressed b
new y-limits: -0.73 -0.23
我不确定“切换轴导航”是什么意思;我没有切换这里的任何东西?有趣的是,我的 python --version
是 3.7.2 所以它似乎没有被删除,与警告中声称的相反。
我有2个问题,在下面标出Q1、Q2。 Q1是主要的,Q2是次要的。
我想从放大的 matplotlib.pyplot
图中读取新的限制。也就是说,我希望发生类似以下步骤的事情:
- 有一组数据,比如y_i 其中i=0...9999
- 全套是用
matplotlib.pyplot.plot
命令绘制的 - 用户查看数据并使用内置的图形-window 放大镜操作放大数据
- 当用户对缩放感到满意时,he/she 向程序发送消息(Q1: 怎么样?)“我对这些(水平)感到满意限制,阅读并保存它们
- 代码读取当前水平值(Q2:图形window能否保持打开状态?如果是,则步骤(6-7)适用)
- 如果用户想选择另一个间隔,he/she点击“重置图片”按钮并返回到步骤 (3)
- 用户高兴时,he/she关闭图
如果 Q2 为“否”,则步骤 (6-7) 将替换为另一个循环,其中图形在 (5) 中闭合并重新绘制并从 (1) 开始。我可以接受,但更喜欢“Q2=yes”版本。
基于 plt.waitforbuttonpress()
以某种方式参与其中,但我无法破译 link 中的建议。我从未使用过 python 中的“事件”内容。我希望情节 window 中已经有一些内置的 event
s,我能以某种方式访问它们吗?
示例代码:
import numpy as np
import matplotlib.pyplot as plt
N = 9999
dt = 0.1 / 180 * np.pi # 0.1 degree steps
tt = np.arange(0, N*dt, dt)
yy = np.sin(tt) + 0.05 * np.random.random(tt.shape) # include some noise
fig = plt.figure()
plt.plot(tt,yy)
plt.show()
# now the user zooms in... and questions Q1, Q2 apply.
好的,我找到了解决方案,虽然我觉得这很non-aesthetic。我非常欢迎更好的解决方案。这个对问题 Q1 和 Q2 都有效,但有两个缺点:(1) 它使用全局变量,有人告诉我这是糟糕的编程(?),以及 (2) 它给出弃用警告。代码修改的动机来自https://matplotlib.org/3.3.1/gallery/widgets/rectangle_selector.html (h/t @tmdavison)
import numpy as np
import matplotlib.pyplot as plt
def press_key_in_figure(event):
global xlimits
print("You pressed %s" % event.key)
if event.key == 'a':
xlimits = ax.get_xlim() # floats
print("new x-limits: %.2f %.2f" % xlimits)
if event.key == 'b':
ylimits = ax.get_ylim() # floats
print("new y-limits: %.2f %.2f" % ylimits)
xlimits = (0, 0)
N = 9999
dt = 0.1 / 180 * np.pi # 0.1 degree steps
tt = np.arange(0, N*dt, dt)
yy = np.sin(tt) + 0.05 * np.random.random(tt.shape) # include some noise
fig, ax = plt.subplots()
ax.plot(tt,yy)
fig.canvas.mpl_connect('key_press_event', press_key_in_figure)
plt.show()
# now the user zooms in... and questions Q1, Q2 apply.
print("The new x-limits after the window was closed are", xlimits)
当我 运行 缩放图片,然后按“a”或“b”时,它给出:
C:\python\lib\tkinter\__init__.py:1705: MatplotlibDeprecationWarning: Toggling axes navigation from the keyboard is deprecated since 3.3 and will be removed two minor releases later.
return self.func(*args)
You pressed a
new x-limits: 3.62 6.48
You pressed b
new y-limits: -0.73 -0.23
我不确定“切换轴导航”是什么意思;我没有切换这里的任何东西?有趣的是,我的 python --version
是 3.7.2 所以它似乎没有被删除,与警告中声称的相反。