我想使用一个 (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])
建议?我想使用一个 (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])
建议?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='')
我使用的技巧是解包参数列表。
如果您正在使用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')
列表推导式
我强烈建议您大量使用列表推导式。它们不仅简洁而又强大,还能让您的代码变得非常易读。
可以尝试像这样写:
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)
应该避免使用参数拆包,它看起来很丑陋。
编写一个辅助函数。
这里有一个比较冗长的版本,但我相信有一些技巧可以压缩它。
>>> 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')
或者,您可以将函数添加到已实例化的对象中。
plt.plot(*np.transpose(a))
(其中我调用了import numpy as np
), 这与你所建议的是等效的。 - Tony S Yu