在 Matplotlib 中绘制嵌套列表

Plotting Nested Lists in Matplotlib

提问人:DKANN01 提问时间:7/14/2023 最后编辑:jaredDKANN01 更新时间:7/14/2023 访问量:41

问:

我正在尝试在 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 中将嵌套列表绘制为多条趋势线,但它不起作用。

python 列表 matplotlib 嵌套列表

评论

0赞 jared 7/15/2023
其中一个解决方案是否回答了您的问题?如果是这样,您可以通过单击解决方案旁边的灰色复选来接受答案。如果没有,请澄清仍然存在的问题。

答:

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*linezip(*line)zip(*[[0, 0], [5, 7], [0, 0]])zip([0, 0], [5, 7], [0, 0])([0, 5, 0], [0, 7, 0])plotplot([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()

Image of matplotlib plots

这段代码可以进一步简化,但我希望它被证明是一个有用的起点。

评论

0赞 jared 7/14/2023
您可以使用循环概括最后一行:。也就是说,对于手头的问题来说,这个解决方案有点过于复杂。forfor i in range(len(xarrays)): plt.plot(xarrays[i], yarrays[i])
0赞 jared 7/14/2023
此外,matplotlib 导入通常写为 .import matplotlib.pyplot as plt