使用matplotlib.pyplot绘制点[[x1,y1],[x2,y2]]。

42

我想使用一个 (x,y) 对的列表来绘制图形,而不是使用两个列表,一个是 X 值的列表,另一个是 Y 值的列表。例如:

a = [[1,2],[3,3],[4,4],[5,2]]
plt.plot(a, 'ro')

与其这样:

plt.plot([1,3,4,5], [2,3,4,2])
建议?
4个回答

67
你可以像这样做:
a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*zip(*a))

很遗憾,您不能再传递 'ro' 参数了。您必须将标记和线条样式值作为关键字参数进行传递:

a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*zip(*a), marker='o', color='r', ls='')

我使用的技巧是解包参数列表


6
我通常使用 plt.plot(*np.transpose(a))(其中我调用了 import numpy as np), 这与你所建议的是等效的。 - Tony S Yu
解包很有用。 - Dee

11

如果您正在使用NumPy数组,您可以通过轴提取:

a = array([[1,2],[3,3],[4,4],[5,2]])
plot(a[:,0], a[:,1], 'ro')

对于列表,你需要像这样使用一些助手:

a = [[1,2],[3,3],[4,4],[5,2]]
plot(*sum(a, []), marker='o', color='r')

9

列表推导式

我强烈建议您大量使用列表推导式。它们不仅简洁而又强大,还能让您的代码变得非常易读。

可以尝试像这样写:

list_of_lists = [[1,2],[3,3],[4,4],[5,2]]    
x_list = [x for [x, y] in list_of_lists]
y_list = [y for [x, y] in list_of_lists]

plt.plot(x_list, y_list)

应该避免使用参数拆包,它看起来很丑陋。


1

编写一个辅助函数。

这里有一个比较冗长的版本,但我相信有一些技巧可以压缩它。

>>> def helper(lst):
    lst1, lst2 = [], []
    for el in lst:
        lst1.append(el[0])
        lst2.append(el[1])
    return lst1, lst2

>>> 
>>> helper([[1,2],[3,4],[5,6]])
([1, 3, 5], [2, 4, 6])
>>> 

还要添加这个辅助程序:

def myplot(func, lst, flag):
    return func(helper(lst), flag)

然后这样调用:

myplot(plt.plot, [[1,2],[3,4],[5,6]], 'ro')

或者,您可以将函数添加到已实例化的对象中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接