python matplotlib用于带有函数和标签的循环图

时间:2017-10-30 12:40:46

标签: python matplotlib

我正在尝试使用标签来绘制数组中的多个函数。

所以我从这里找到了一些帮助:https://stackoverflow.com/a/11493343/4055341并尝试修改代码,如下所示。但是我得到了一个错误。我得到的错误是ValueError,但我怎样才能使它们具有相同的大小?

import numpy as np
import matplotlib.pyplot as plt


x = np.linspace(0, 10, 100)

y = [[5*x], [1*x], [2*x]]

labels = ['foo', 'bar', 'baz']

for y_arr, label in zip(y, labels):
    plt.plot(x, y_arr, label=label)

plt.legend()
plt.show()

1 个答案:

答案 0 :(得分:1)

y = [[5*x], [1*x], [2*x]]替换y = [5*x, 1*x, 2*x]应足以解决您的问题。

<强>推理:

当您执行x = np.linspace(0, 10, 100)时,x成为类似于x = [0, 0.1010, 0.2020, 0.3030, ..., 9.7979, 9.8989, 10]的Numpy数组。将x乘以标量会生成具有相同大小的新Numpy数组,例如5*x = [0, 0.505, 1.01, 1.515, ..., 48.989, 49.494, 50]。因此,y = [5*x, 1*x, 2*x]将是一个列表,其中每个元素都是正确的Numpy数组。

在视觉上,它是这样的:

y = [
    [0, 0.1010, 0.2020, 0.3030, 9.7979, 9.8989, 10],
    [0, 0.505, 1.01, 1.515, 48.9895, 49.4945, 50],
    [0, 0.202, 0.404, 0.606, 19.5958, 19.7978, 20]
]

另一方面,y = [[5*x], [1*x], [2*x]]是一个包含3个列表的列表,每个列表只包含一个对象:乘法产生的Numpy数组。这是结果:

y = [
    [
        [0, 0.1010, 0.2020, 0.3030, 9.7979, 9.8989, 10]
    ],
    [
        [0, 0.505, 1.01, 1.515, 48.9895, 49.4945, 50]
    ],
    [
        [0, 0.202, 0.404, 0.606, 19.5958, 19.7978, 20]
    ]
]

这就是为什么plot会中断的原因:只要x,它就会期待一个数组,而是将y_arr分配给[[0, 0.1010, 0.2020, 0.3030, 9.7979, 9.8989, 10]],例如:a只包含一个对象的列表(恰好是Numpy数组)。