Matplotlib:添加&更新轴

时间:2013-10-05 19:04:26

标签: python matplotlib plot

我有兴趣编写一个显示整个数组的函数,以及将两个其他轴连接到鼠标坐标(坐标(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轴不完全匹配,而且很难......

0 个答案:

没有答案