我正在尝试在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])
这让我有点像散点图,但不是我想要的东西:
(我会直接发布图片,但我在网站上的声誉还不允许)。
我怎样才能使x轴与我的值在同一范围内?为什么我的情节中的点都堆积在0和1上,而实际上它们分布在0到1之间?
答案 0 :(得分:1)
Pylab使用numpy,您可以查找提供的数据格式here。您在第一列中使用非常高的数字,并且不需要浮点双精度但是需要高整数值。查看您粘贴的示例数据:
>>> 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()
语句之后完成的。第一个函数在以float格式读入后显示您的数据。使用读作“uint64”的数据将有助于您的散点图。
编辑以回答您的评论,更多地控制对输入数据的读取:
# 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")
您的数据在最小值和最大值之间的范围非常大, 将集合划分为小数和大数时,您将获得更好的结果