我想使用(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])
建议?
答案 0 :(得分:57)
您可以这样做:
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='')
我使用的技巧是unpacking argument lists。
答案 1 :(得分:10)
如果您使用的是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')
答案 2 :(得分: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)
应避免参数拆包。这太丑了。
答案 3 :(得分: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')
或者,您可以向已经实例化的对象添加函数。