Python 使用Matplotlib组织轴

Python 使用Matplotlib组织轴,python,matplotlib,matrix,plot,Python,Matplotlib,Matrix,Plot,我正在使用Matplotlib和Python绘制由线连接的关节构成的二维骨骼(数据来自坐标文本文件,表示(x,y)关节),并排绘制每个关节到所有其他关节的距离矩阵,由使用相同文本文件数据的某些计算生成 到目前为止,我已经绘制了骨架,连接到按键事件,这意味着通过每次读取文本文件,绘制了许多骨架,生成了一个运动,运动是可以感知的,因为用户必须按向右箭头键一个接一个地绘制骨架序列,从那时起,这一运动就一直可见 另外,我已经建立了矩阵,在代码中经过一些计算后,每个矩阵都以蓝色比例绘制,旁边有一个颜色条。

我正在使用Matplotlib和Python绘制由线连接的关节构成的二维骨骼(数据来自坐标文本文件,表示(x,y)关节),并排绘制每个关节到所有其他关节的距离矩阵,由使用相同文本文件数据的某些计算生成

到目前为止,我已经绘制了骨架,连接到按键事件,这意味着通过每次读取文本文件,绘制了许多骨架,生成了一个运动,运动是可以感知的,因为用户必须按向右箭头键一个接一个地绘制骨架序列,从那时起,这一运动就一直可见

另外,我已经建立了矩阵,在代码中经过一些计算后,每个矩阵都以蓝色比例绘制,旁边有一个颜色条。我已经测试了每个矩阵的绘图,效果很好。请注意,如果文本文件中有43个骨架,则必须有43个矩阵,每个骨架对应一个矩阵

问题在于:我使用散射方法绘制骨架,仅使用一个图形和一个轴。我必须在骨架旁边绘制每个矩阵,我使用imshow将矩阵从一个数组绘制成一个图形,以图像的格式,就像图像一样。但是,我不知道如何在不添加另一个轴的情况下,预先组织轴并绘制骨架旁边的矩阵,例如,fig,(ax1,ax)=plt.子图(ncols=2)。由于我是Matplotlib的初学者,我对如何在不必重建绘制骨架的方法的情况下并排绘制矩阵感到有点困惑

守则:

from matplotlib import gridspec
import matplotlib.pyplot as plt
import numpy as np

movement = np.loadtxt("file01.txt")

bone_list = [[1, 3], [2, 3], [3, 4], [4, 7], [5, 7], [6, 7], [1, 8], [2, 9], 
[8, 10], [9, 11], [10, 12], [11, 13], [5, 14], [6, 15], [14, 16], [15, 17], 
[16, 18], [17, 19], [3, 20]]

bone_list = np.array(bone_list) - 1
number_of_postures = int(len(movement)/20)
list_for_matrix = []


for i in range(number_of_postures):

    list_for_matrix.append(movement[(i*20):((i+1)*20),:3]) 
    matrixCoord = np.array(list_for_matrix)
    matrixDistance= np.zeros((number_of_postures,20,20))


for k in range(number_of_postures): 
    for i in range(len(matrixDistance[0])): 
        for j in range(len(matrixDistance[0])):     
            matrixDistance[k,i,j] = np.linalg.norm(matrixCoord[k,i,:] - 
            matrixCoord[k,j,:])


fig, ax = plt.subplots()

i = 1 #this variable is for plotting from the second skeleton on with the function call.

def press(event):
global i

if event.key == 'right':        
    fig.canvas.draw_idle()  
    plt.cla()   
    plt.xlim(100, 190)  
    plt.ylim(-250, 0)   
    skeleton = movement[i*20:(i+1)*20]      
    x = skeleton[:, 0]      
    y = -skeleton[:, 1]     
    sc = ax.scatter(x, y, s=40) 
    for bone in bone_list:      
        ax.plot([x[bone[0]], x[bone[1]]], [y[bone[0]], y[bone[1]]], 'r')

    plt.subplots_adjust(left=0.12, bottom=0.11, right=0.49, top=0.93,wspace=0.20, hspace=0.20)

    if i < number_of_postures:  
        i+=1

    else:           
        return


    #plot of the first skeleton, outside the function call.
    plt.xlim(100, 190)
    plt.ylim(-250, 0)
    skeleton = movement[0*20:(0+1)*20]
    x = skeleton[:, 0]
    y = -skeleton[:, 1]
    sc = ax.scatter(x, y, s=40)
    for bone in bone_list   
        ax.plot([x[bone[0]], x[bone[1]]], [y[bone[0]], y[bone[1]]], 'r')
    plt.subplots_adjust(left=0.12, bottom=0.11, right=0.49,top=0.93,wspace=0.20, hspace=0.20)


    fig.canvas.mpl_connect("key_press_event", press)
    plt.show()


    #that's the plotting for the matrices, outside the plt.show(), since it's not working properly.
    '''
    img = matrixDistance[i]
    imgplot = plt.imshow(img)
    plt.title('Distance Matrix')
    imgplot.set_cmap('PuBu')
    plt.colorbar()

    '''
从matplotlib导入gridspec
将matplotlib.pyplot作为plt导入
将numpy作为np导入
movement=np.loadtxt(“file01.txt”)
bone_list=[[1,3]、[2,3]、[3,4]、[4,7]、[5,7]、[6,7]、[1,8]、[2,9],
[8, 10], [9, 11], [10, 12], [11, 13], [5, 14], [6, 15], [14, 16], [15, 17], 
[16, 18], [17, 19], [3, 20]]
bone\u list=np.数组(bone\u list)-1
姿势数=int(len(movement)/20)
列出_矩阵的_=[]
对于范围内的i(姿势的数量):
附加(移动[(i*20):((i+1)*20),:3])
matrixCoord=np.array(列出矩阵的列表)
矩阵距离=np.0((姿势的数量,20,20))
对于范围内的k(姿势的数量):
对于范围内的i(len(矩阵距离[0]):
对于范围内的j(len(矩阵距离[0]):
矩阵距离[k,i,j]=np.linalg.norm(矩阵坐标[k,i,:]-
matrixCoord[k,j,:])
图,ax=plt.子批次()
i=1#此变量用于通过函数调用从第二个骨架开始绘制。
def压力(事件):
全球i
如果event.key=='right':
图canvas.draw_idle()
plt.cla()
plt.xlim(100190)
plt.ylim(-250,0)
骨架=运动[i*20:(i+1)*20]
x=骨架[:,0]
y=-skeleton[:,1]
sc=最大散射(x,y,s=40)
对于“骨骼中的骨骼”列表:
ax.plot([x[bone[0]]、x[bone[1]]、[y[bone[0]]、y[bone[1]]、'r')
plt.子批次调整(左=0.12,下=0.11,右=0.49,上=0.93,wspace=0.20,hspace=0.20)
如果我<姿势的数量:
i+=1
其他:
返回
#第一个骨架的绘图,在函数调用之外。
plt.xlim(100190)
plt.ylim(-250,0)
骨架=运动[0*20:(0+1)*20]
x=骨架[:,0]
y=-skeleton[:,1]
sc=最大散射(x,y,s=40)
用于“骨骼中的骨骼”列表
ax.plot([x[bone[0]]、x[bone[1]]、[y[bone[0]]、y[bone[1]]、'r')
plt.子批次调整(左=0.12,下=0.11,右=0.49,上=0.93,wspace=0.20,hspace=0.20)
图canvas.mpl\u connect(“按键按下事件”,按下)
plt.show()
#这是plt.show()之外的矩阵绘图,因为它工作不正常。
'''
img=矩阵距离[i]
imgplot=plt.imshow(img)
产品名称(“距离矩阵”)
imgplot.set\u cmap('PuBu')
plt.colorbar()
'''
下面是两张图片,代码生成的结果,以及我需要实现的想法

代码生成的结果:

我需要实现的是:


大多数影响子地块的命令会替换同一区域中存在的任何轴。您已经为带有直线的地物创建了一个轴

fig, ax = plt.subplots()
子批次
子批次
的后续调用将删除此轴并创建一个新轴。您需要同时设置两个轴。你可以执行

fig, (ax1, ax2) = figure(ncol=2)
然后使用

sca(ax1) 

在当前代码之前。这将使轴matplotlib在轴上绘制。在当前代码之后和绘制矩阵的代码之前,再次使用命令设置ax2(即
sca(ax2)
)。

您需要一个轴来绘制,因此任何可能的解决方案都很可能需要添加另一个轴。你想避免这样做有什么原因吗?不,我只是不知道如何组织好。我尝试添加另一个轴,但骨架消失了。