【发布时间】:2021-09-16 13:26:04
【问题描述】:
下面的代码表示对应于读取具有 n 行的文本文件的图形的绘制。每行包含 4 列,前三列是 (x,y,z) 点的坐标,第四列是此绘图不需要的二进制变量。
每读取 20 行,就会读取一个骨架,该骨架是一组 20 个 (x,y,z) 点或关节,每个关节由每行的前三列组成。
文本文件包含 860 行,并且 860/20 = 43,即 20 个关节数,以创建 (x,y,z) 关节的骨架。然后,文本文件由 43 个骨架组成,生成一个运动。因此,文本文件代表一个动作。
我在构建将每个 (x,y,z) 点以逻辑方式连接到其他点的边(线)时遇到问题,以便点的绘图看起来像骨架。那必须在里面一个循环,因此在每读取 20 行时,生成一个骨架,并且在按键事件之后,比如说右箭头键,读取接下来的 20 行并生成另一个骨架。
我是 Python 和 Matplotlib 的初学者。我已经发布了下面这张由 Matploblit 生成的没有边缘的骨架的图片,以及与我需要用边缘实现的结果类似的另一张图片。
文本文件内容示例:
1.3200000e+002 8.0000000e+001 6.8100000e+002 1.0000000e+000
1.6900000e+002 8.1000000e+001 6.6500000e+002 1.0000000e+000
1.4800000e+002 7.5000000e+001 6.5000000e+002 0.0000000e+000
1.5100000e+002 9.8000000e+001 6.9800000e+002 0.0000000e+000
1.3200000e+002 1.2000000e+002 6.7400000e+002 1.0000000e+000
1.6100000e+002 1.2200000e+002 6.6200000e+002 8.1730800e-001
另外,在绘制骨架时,只取了两个坐标,(x,y) 来生成一个二维骨架,所以第三个坐标被忽略了。并且,绘制已经在循环中,但是按键事件部分还没有实现,下一个骨架是在当前画布关闭时绘制的。
此外,您可能会注意到绘图正在生成前一个骨架与下一个骨架的重叠。我也发布了重叠的图片,这是在第一个骨架之后生成的 42 个骨架之一。
绘制的第一个没有关节的骨架: https://i.stack.imgur.com/FNFTL.png
接下来绘制的 42 个没有关节的骨架之一,存在重叠问题: https://i.stack.imgur.com/D8FQt.png
所需结果的一种方法: https://i.stack.imgur.com/PkWUc.png
from pylab import *
from matplotlib import gridspec
import numpy as np
import sys
import math
import matplotlib.pyplot as plt
movement = np.loadtxt("file01.txt")
number_of_postures = int(len(movement)/20)
listing = []
for i in range(number_of_postures):
listing.append(movement[(i*20):((i+1)*20),:3])
matrixCoord = np.array(listing)
num_plots = number_of_postures
z = 0
for m in range(num_plots):
gs = gridspec.GridSpec(1, 2, width_ratios=[3, 1]) # create figure at start of loop
z += 20
skeleton = movement[:z,:2]
x = skeleton[:,0]
y = -skeleton[:,1]
plt.subplot(gs[1])
plt.scatter(x,y, s=40)
plt.title('Skeleton')
plt.show()
【问题讨论】:
-
也许您可以发布文本文件,以便我们可以看到应该从中绘制线条的数据。
-
1.3200000E+002 8.0000000E+001 6.8100000E+002 1.0000000E+000 1.6900000E+002 8.10000E+001 6.6500000E+002 1.002 1.002 1.002 1.000000 000E+0000 0000 000E+0000 000 E+0000 000 E+0000 000 E+0000 000 E+0000 000E+0000 000 E+0000 000 E+0000 000 E+0000 0000 +002 0.0000000e+000 1.5100000e+002 9.8000000e+001 6.9800000e+002 0.0000000e+000 1.3200000e+002 1.2000000e+002 6.7400000e+002 1.0000000e+000 1.6100000e+002 1.2200000e+002 6.6200000e+002 8.1730800e-001 7.9567300e-001 文件太长,举例,800行.
-
好的,我的意思是你写的 20 行构成一个骨架 - 即使这样也没有必要,也许 3 行,这样就可以设置三个线图的示例
-
请注意,您可以将这几行也像问题中的代码一样发布。通过这种方式,我们可以看到文件中数字的结构。不幸的是,上面的评论只是一个巨大的数字列表,并没有告诉没有参与的人任何事情。请添加描述文件中的一行如何描述要绘制的联合线:哪个数字表示什么(x1、x2、y1、y2 或其他...)
-
我已经更改了描述。
标签: python matplotlib