【问题标题】:Scatter plot in pylab: arranging axis and datapylab中的散点图:排列轴和数据
【发布时间】:2013-02-12 13:59:25
【问题描述】:

我正在尝试在 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 之间的所有地方?

【问题讨论】:

  • 您能用整个文件中 10-20 行的随机子样本替换数据样本吗?您给出的范围太小,无法尝试复制您的问题。如果您可以以np.array 格式发布,则可以简单地剪切并粘贴到例如ipython,会很棒。

标签: python matplotlib


【解决方案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() 语句之后完成的。第一个函数在读入浮点数后显示您的数据。使用以 `uint64' 形式读取的数据将帮助您绘制散点图。

好的起点:matplotlib gallery

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

# 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")

您的数据在最小值和最大值之间的范围非常大, 将集合分为小数和大数会得到更好的结果

【讨论】:

  • 谢谢@schuh。我曾尝试使用 uint64,但出现以下错误:items = [conv(val) for (conv, val) in zip(converters, vals)] ValueError: invalid literal for long() with base 10: '0.888888888888889
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2018-10-02
  • 2016-11-08
相关资源
最近更新 更多