是否可以将数组从二维矩阵输入到pyplot.scatter函数?

时间:2016-01-27 05:42:19

标签: python matplotlib

我是最近从R转换为Python的数据分析师。在R中,我可以将矩阵输入到可以生成散点图的函数中。但是,这在Python中也可能吗?

我访问了与我的问题相关的其他帖子,但看起来他们首先为每个变量创建单独的列表,然后从中生成散点图。但是,我想将变量保存在单个数据结构下,如下所示。但是,当程序执行带有分散功能的行时,我收到错误。

感谢您就此事提出意见。

x = 0

data = []
for n in range(15):
    x = random.uniform(0, 10)
    b = random.uniform(2,5)
    m = random.uniform(.5,6)
    y = x*m + b
    data.append((round(x,2),round(y,2)))

mat = np.matrix(data)

matplotlib.pyplot.scatter(mat[:,0],mat[:,1])  
matplotlib.pyplot.show()

2 个答案:

答案 0 :(得分:1)

我相信你错过了一步 - 你需要使用numpy数组而不是标准的python列表:

import numpy as np
#...
for n in range(15):
     #...
     data.append((round(x,2),round(y,2)))
mat = np.array(data)

如果你还没有,你需要先安装numpy。

答案 1 :(得分:0)

我认为您的问题在于您使用的数据结构。在示例中,您提供的data是元组列表。我提到这个是因为如果你想进一步探索python进行数据分析,你应该对列表,元组,集合,字典和numpy数组感到满意。

对于您的示例,scatter需要两个“数组类似”对象,x和y坐标。这意味着它将读取您提供的任何可迭代对象,可以是列表,numpy数组或元组。

你有一个元组列表,所以你必须通过获取列表的每个元素中的第一个或第二个对象来创建这个“数组类似”对象,列表comprenhension看起来像

matplotlib.pyplot.scatter([l[0] for l in data],[l[1] for l in data])

执行此操作的其他方法是反向使用zip命令。 zip创建一个迭代器,它聚合来自给定的每个迭代的元素。这意味着:

zip([x1,x2,x3,x4],[y1,y2,y3,y4])=[[x1,y1],[x2,y2],[x3,y3],[x4,y4]]

您可以看到与您需要的完全相反,但zip中的'*'运算符就是这样,所以对于您的示例将是:

matplotlib.pyplot.scatter(zip(*data)[0],zip(*data)[1])

正如eknumbat所说,你可以使用numpy.array来提供更多选择