提问人:DKANN01 提问时间:7/14/2023 最后编辑:jaredDKANN01 更新时间:7/14/2023 访问量:41
在 Matplotlib 中绘制嵌套列表
Plotting Nested Lists in Matplotlib
问:
我正在尝试在 matplotlib 中将嵌套列表绘制为单独的线,但我的 x 和 y 坐标在嵌套列表中。
List = [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [5, 7], [0, 0]], [[0, 0], [8, 8], [0, 0]], [[0, 0], [8, 8], [0, 0]], [[0, 0], [16, 5], [0, 0]], [[0, 0], [20, 9], [0, 0]], [[0, 0], [4, 8], [20, 9], [16, 5], [0, 0]], [[0, 0], [10, 11], [0, 0]]]
每个嵌套列表都是其自己的行,每个嵌套列表都是一个坐标。
我尝试使用这篇文章中的代码:在 python 中将嵌套列表绘制为多条趋势线,但它不起作用。
答:
1赞
jared
7/14/2023
#1
您可以遍历每条线,然后分别提取 x 和 y 数据进行绘图。我使用列表推导进行了提取。您也可以使用 numpy 来做到这一点。
import matplotlib.pyplot as plt
plt.close("all")
data = [[[0, 0], [0, 0]],
[[0, 0], [0, 0]],
[[0, 0], [0, 0]],
[[0, 0], [5, 7], [0, 0]],
[[0, 0], [8, 8], [0, 0]],
[[0, 0], [8, 8], [0, 0]],
[[0, 0], [16, 5], [0, 0]],
[[0, 0], [20, 9], [0, 0]],
[[0, 0], [4, 8], [20, 9], [16, 5], [0, 0]],
[[0, 0], [10, 11], [0, 0]]]
fig, ax = plt.subplots()
for n, line in enumerate(data):
x = [_line[0] for _line in line]
y = [_line[1] for _line in line]
ax.plot(x, y, label=n)
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.legend()
fig.show()
评论
0赞
mozway
7/14/2023
没有列表推导式:ax.plot(*zip(*line), label=n)
;)
0赞
jared
7/14/2023
@mozway 有趣的是,我没有想到这一点。是否将内部列表分为第一和第二索引?*line
1赞
mozway
7/14/2023
不,是那样的。 将所有子列表扩展为单个参数:-> -> -> ,然后我们再次将其扩展为参数:(zip
*line
zip(*line)
zip(*[[0, 0], [5, 7], [0, 0]])
zip([0, 0], [5, 7], [0, 0])
([0, 5, 0], [0, 7, 0])
plot
plot([0, 5, 0], [0, 7, 0])
)
0赞
ConfusedDetermination
7/14/2023
#2
尝试使用 ,见下文。另外,尽量避免将列表命名为“List”,因为它是一种数据类型,以后可能会出现问题!np.array
from matplotlib import pyplot as plt
import numpy as np
Lists = [[[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [0, 0]], [[0, 0], [5, 7], [0, 0]], [[0, 0], [8, 8], [0, 0]], [[0, 0], [8, 8], [0, 0]], [[0, 0], [16, 5], [0, 0]], [[0, 0], [20, 9], [0, 0]], [[0, 0], [4, 8], [20, 9], [16, 5], [0, 0]], [[0, 0], [10, 11], [0, 0]]]
xcords = []
ycords = []
for i in range(len(Lists)): # ie, [[0,0],[0,0]]
x = []
y = []
for j in range(len(Lists[i])): # ie, [0,0]
x.append(Lists[i][j][0])
y.append(Lists[i][j][1])
xcords.append(x)
ycords.append(y)
#Now you have xcords and ycords, corresponding lists of lists wherein each sublist makes up a line
print("x:", xcords, "y:", ycords)
xarrays = []
yarrays = []
for k in range(len(xcords)): #ie, [0, 0]
xarrays.append(np.array(xcords[k]))
yarrays.append(np.array(ycords[k]))
#See comment below from Jarad
for i in range(len(xarrays)):
plt.plot(xarrays[i], yarrays[i])
plt.show()
这段代码可以进一步简化,但我希望它被证明是一个有用的起点。
评论
0赞
jared
7/14/2023
您可以使用循环概括最后一行:。也就是说,对于手头的问题来说,这个解决方案有点过于复杂。for
for i in range(len(xarrays)): plt.plot(xarrays[i], yarrays[i])
0赞
jared
7/14/2023
此外,matplotlib 导入通常写为 .import matplotlib.pyplot as plt
评论