我有兴趣编写一个显示整个数组的函数,以及将两个其他轴连接到鼠标坐标(坐标(n,m)的像素,一个ax将包含数组[n,:]和另一个数组[:,m])
我取得了实质性进展,但有一些问题我无法解决,我希望得到一些帮助!
首先:轴和图像之间有一些空白区域,我真的不知道它们出现的原因。 第二:当我调整图形大小时,我想保持方形,但我不知道如何做到这一点。 第三:当我在图中移动鼠标时,我不能像我想要的那样更新两个添加的轴(ax1和ax2)......
对于第三点,如果我放入ax1 / ax2.cla()会有一些问题,因为没有更多的行。 fig.canvas.draw_idle()和plt.draw()似乎解决了部分问题,但是当鼠标没有移动时,ax1和ax2变空了......
下面是一个小小的片段,转变了我遇到的主要困难:
import matplotlib.pyplot as plt
import numpy as np
def update(event):
if event.inaxes:
a = ax1.get_lines()[0]
b = ax2.get_lines()[0]
a.set_xdata(data[:,int(event.ydata)])
b.set_ydata(data[int(event.xdata),:])
ax1.draw_artist(a)
ax2.draw_artist(b)
fig.canvas.blit(ax1.bbox)
fig.canvas.blit(ax2.bbox)
data = np.random.rand(200,200)*10000
fig = plt.figure(num = None, figsize=(8, 8), dpi=60)
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(data, interpolation = "bilinear", origin = "lower", cmap = 'binary',aspect='auto')
ax1 = fig.add_axes([0.9, 0.1, 0.05, 0.8], sharey = ax)
ax2 = fig.add_axes([0.1, 0.05, 0.8, 0.05], sharex = ax)
ax1.set_xlim((0,10000))
ax2.set_ylim((0,10000))
ax1.plot(np.arange(0,200,1)*50, np.arange(0,200,1), animated = True)
ax2.plot(np.arange(0,200,1), np.arange(0,200,1)*50, animated = True)
fig.canvas.mpl_connect("motion_notify_event", update)
plt.show()
非常感谢!
编辑:这是我能得到的最接近我想要的结果。我保持方面=' auto'因为否则当图形被调整大小时,子轴(ax1,ax2)不保持主轴(ax)形状......所以我更喜欢让ax取ax1和ax2的大小。也许它有一个轴可以选择禁用方面的选项(比如没有方面=' auto' for imshow)。import matplotlib.pyplot as plt
import numpy as np
def update(event):
if not event.inaxes: return
a = ax1.get_lines()[0]
b = ax2.get_lines()[0]
a.set_xdata(data[:,int(event.xdata)])
b.set_ydata(data[int(event.ydata),:])
fig.canvas.draw()
def axis_to_fig(axis):
def transform(coord):
return fig.transFigure.inverted().transform(
axis.transAxes.transform(coord))
return transform
def add_sub_axes(axis, rect, share):
fig = axis.figure
left, bottom, width, height = rect
trans = axis_to_fig(axis)
figleft, figbottom = trans((left, bottom))
figwidth, figheight = trans([width,height]) - trans([0,0])
if share == "x":
return fig.add_axes([figleft, figbottom, figwidth, figheight], sharex = axis)
if share == "y":
return fig.add_axes([figleft, figbottom, figwidth, figheight], sharey = axis)
data = np.random.rand(200,200)*10000
fig = plt.figure(num = None, figsize=(8, 8), dpi=60)
ax = fig.add_subplot(111)#add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(data, interpolation = "bilinear", origin = "lower", cmap = 'binary', aspect='auto')
ax.set_adjustable('box-forced')
ax1 = add_sub_axes(ax, [1.0, 0, 0.1, 1], "y")
ax2 = add_sub_axes(ax, [0, -0.1, 1, 0.1], "x")
ax1.plot(np.arange(0,200,1)*50, np.arange(0,200,1), '-',color = 'red')
ax1.grid(True)
ax2.plot(np.arange(0,200,1), np.arange(0,200,1)*50, '-',color = 'red')
ax2.grid(True)
ax2.set_xlim((0,np.size(data,0)))
ax1.set_ylim((0,np.size(data,1)))
fig.canvas.mpl_connect("motion_notify_event", update)
ax.axis('off')
plt.show()
尽管如此,添加的轴与初始子图的x / y轴不完全匹配,而且很难......