1

我试图在 pylab 中拼凑一个散点图,但到目前为止都失败了。我不是这样的程序员,所以请多多包涵。

我有一个数据集,由包含在 csv 文件中的两列数据组成,大约有 60k 行。这是一个示例:

100000000012640,0.888888888888889
100000000105442,0.777777777777778
100000000206866,1.0
100000000304930,0.777777777777778
100000000583236,0.888888888888889
100000000683528,0.777777777777778
718435316,1.0
718494043,0.777777777777778
718602951,0.777777777777778
718660499,0.777777777777778
718766852,1.0
718795104,1.0
718862926,0.777777777777778
718927526,0.777777777777778
718952836,1.0
719102865,0.777777777777778
719156726,1.0
719213511,1.0
719425334,1.0
719452158,1.0
719493947,0.777777777777778
719566609,1.0
720090346,0.777777777777778
720127760,0.777777777777778
720143948,0.944444444444444
720221566,1.0
720256688,0.944444444444444
720349817,0.777777777777778
720380601,0.777777777777778
720446322,1.0
720524740,1.0
720560353,1.0
720594066,0.777777777777778
720673388,1.0
720716865,0.777777777777778
720730249,1.0
720774433,1.0

我的目标是绘制这些数据的散点图,第一行数据在 x 轴上,第二行在 y 轴上。x 轴的值按降序排列,从显示的值开始,到 999963505 结束。y 轴的值始终介于 0 和 1 之间。

这是我尝试过的(使用“ipython --pylab”):

data = loadtxt('./data/OD-4322/facebookID.csv', unpack=True, dtype=('float', 'float'), delimiter=',')
scatter(data[0],data[1])

这让我得到了类似于散点图的东西,但不是我正在寻找的东西:

http://content.screencast.com/users/FernandoGarridoVaz/folders/Jing/media/a0df81c5-2dbb-4e93-8e18-3c9db07728f5/00000793.png

(我会直接发布图片,但我在网站上的声誉还不允许)。

我怎样才能使 x 轴与我的值在同一范围内?为什么我的情节中的点都堆积在 0 和 1 上,而实际上它们分布在 0 和 1 之间的所有地方?

4

1 回答 1

1

Pylab 使用 numpy,您可以在此处查找提供的数据格式。您在第一列中使用了非常高的数字,不需要浮点双精度,而是需要高整数值。查看您粘贴的示例数据:

>>> x = np.loadtxt('./temp.dat', unpack=True, dtype=('float'), delimiter=',')[0] 
>>> x
array([  1.00000000e+14,   1.00000000e+14,   1.00000000e+14,
     1.00000000e+14,   1.00000001e+14,   1.00000001e+14])
>>> x = np.loadtxt('./temp.dat', unpack=True, dtype=('uint64'), delimiter=',')[0]
>>> x
array([100000000012640, 100000000105442, 100000000206866, 100000000304930,
   100000000583236, 100000000683528], dtype=uint64)
>>> y = np.loadtxt('./temp.dat', unpack=True, dtype=('float'), delimiter=',')[1]
>>> scatter(x,y)

请注意,您在行scatter(data[0],data[1])中所做的事情是在loadtxt()两列的语句之后完成的。第一个函数在读入浮点数后显示您的数据。使用以“uint64”形式读取的数据将帮助您绘制散点图。

很好的起点:matplotlib 画廊

编辑以回答您的评论,更好地控制输入数据的读取:

# create python lists to store the data
x_vals = []
y_vals = []
#open file and read in a list containing all lines as string
f = open("./temp.dat","r")
lines = f.readlines()
#Go through the lines
   #strip() takes away "\n" characters and such
   #split(",") creates a list of the string line splitted into (here: 2) substrings
for line in lines:
   x,y = line.strip().split(",")
   #append values to their lists and apply the right format
   x_vals.append(np.uint64(x))
   y_vals.append(np.float64(y))

scatter(x_vals,y_vals)
#or just plot the data as points using:
plot(x_vals,y_vals,"o")

您的数据在最小值和最大值之间有很大的范围,当您将集合分成小数和大数时,您会得到更好的结果

于 2013-02-26T23:38:43.333 回答