在 matplotlib 用户界面中更新颜色条而不重置缩放历史记录
updating colorbar without resetting zoom history in matplotlib user interface
我正在尝试制作一个绘图,其中使用类似于例如的方案在可视化数据的基础上缩放更新色标。 http://matplotlib.org/examples/event_handling/viewlims.html (also note similar question Matplotlib imshow, dynamically resample based on zoom)
但是我在处理颜色条时遇到了一个问题,删除它并添加一个新的后,缩放历史被重置。在我的真实代码中,颜色条更新是在每次缩放时完成的,因此 matplotlib 绘图中的返回和主页按钮根本不起作用。
查看下面的示例代码可能会更清楚。
是什么原因?有什么办法可以防止这种情况发生吗?
从所有不必要的部分中删除的代码大致如下所示:
#create and plot a test image with colorbar,
#zoom and everything works
import numpy as np
N=100
a=np.random.random((N,N))
plt.figure()
plt.imshow(a,interpolation='none')
plt.colorbar()
plt.show()
#at this point I can zoom and use back and forward buttons as always
#but if I zoom in and then execute the following code, the history is reset and I cannot go back or home any more (the zooming history works in the future, but is reset every time I replace the colorbar):
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
不幸的是,这很困难,而且它也有点取决于您使用的后端。有两种类型的工具栏:通常是默认的 toolbar2 和将成为默认的 toolmanager。我的解决方案将基于当前默认的 toolbar2。
这里的问题是图 fig
的查看历史存储在两个 cbook.Stack
对象(fig.canvas.toolbar._views
和 fig.canvas.toolbar._positions
)中,它们在更新期间被清除fig.canvas.toolbar.update()
。因此,我很容易想到两种解决方案。
首先是复制两个堆栈,然后恢复:
import copy
s = copy.copy( fig.canvas.toolbar._views )
p = copy.copy( fig.canvas.toolbar._positions )
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
fig.canvas.toolbar._views = s
fig.canvas.toolbar._positions = p
第二个是从您的 NavigationToolbar2
对象中删除更新功能。例如:
fig.canvas.toolbar.update = lambda: None
然后您的原始代码将在不重置历史记录的情况下运行:
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
对于工具管理器,您需要查看 backend_tools 中的 ToolViewsPositions。
我正在尝试制作一个绘图,其中使用类似于例如的方案在可视化数据的基础上缩放更新色标。 http://matplotlib.org/examples/event_handling/viewlims.html (also note similar question Matplotlib imshow, dynamically resample based on zoom)
但是我在处理颜色条时遇到了一个问题,删除它并添加一个新的后,缩放历史被重置。在我的真实代码中,颜色条更新是在每次缩放时完成的,因此 matplotlib 绘图中的返回和主页按钮根本不起作用。
查看下面的示例代码可能会更清楚。 是什么原因?有什么办法可以防止这种情况发生吗?
从所有不必要的部分中删除的代码大致如下所示:
#create and plot a test image with colorbar,
#zoom and everything works
import numpy as np
N=100
a=np.random.random((N,N))
plt.figure()
plt.imshow(a,interpolation='none')
plt.colorbar()
plt.show()
#at this point I can zoom and use back and forward buttons as always
#but if I zoom in and then execute the following code, the history is reset and I cannot go back or home any more (the zooming history works in the future, but is reset every time I replace the colorbar):
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
不幸的是,这很困难,而且它也有点取决于您使用的后端。有两种类型的工具栏:通常是默认的 toolbar2 和将成为默认的 toolmanager。我的解决方案将基于当前默认的 toolbar2。
这里的问题是图 fig
的查看历史存储在两个 cbook.Stack
对象(fig.canvas.toolbar._views
和 fig.canvas.toolbar._positions
)中,它们在更新期间被清除fig.canvas.toolbar.update()
。因此,我很容易想到两种解决方案。
首先是复制两个堆栈,然后恢复:
import copy
s = copy.copy( fig.canvas.toolbar._views )
p = copy.copy( fig.canvas.toolbar._positions )
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
fig.canvas.toolbar._views = s
fig.canvas.toolbar._positions = p
第二个是从您的 NavigationToolbar2
对象中删除更新功能。例如:
fig.canvas.toolbar.update = lambda: None
然后您的原始代码将在不重置历史记录的情况下运行:
ax=plt.gca()
im=ax.images[-1]
im.colorbar.remove()
#in real code, color range is updated here
plt.colorbar()
对于工具管理器,您需要查看 backend_tools 中的 ToolViewsPositions。