请教vi和plot等作图的问题
我要处理一些数据 平时对vi等只会查找/替换之类的功能
现在急着用 还麻烦大家指点一下
我的数据是如下形式:
2 7 3.525115
2 10 3.383307
2 11 3.541492
2 15 2.839893
2 34 2.930046
2 36 3.797043
7 12 3.996071
7 13 2.808753
7 14 2.851043
7 15 2.858498
7 18 3.632217
10 33 3.377613
10 34 2.751064
11 18 3.093442
...
第一列和第二列分别是x y 的坐标 第三列是这点上面的值
我希望实现
1. 把第一列和第二列的数字都运算一下 比如+ 91
2. 做出一个点图 点的值用颜色表示 并能自己指定颜色的scale 我试过xmgrace 可惜没有我不知道那个颜色表示什么范围 请推荐一下合适的软件
2.1 我看到有个软件的教程使用了类似的操作 它用一个脚本先把缺失的点补上 即[i,j] 1<=i,j<=n 的坐标都写上 补上的点都赋予 0 值 ,然后产生一个gnuplot可以处理的脚本 最后生成一个相当不错的ps结果
但是我使用这个脚本有些问题 因为那个列子里面的第三列 也就是值那一列是频率值 缺失的点赋予0值是合适的 可是我这个数据里面的值是距离的 缺失的点其实是他们距离大于了某个cutoff距离 他们被设置为0值反而成为了距离最近的点了 在颜色尺度上非常接近实际上靠近的点 不知道该怎么修改这个脚本
如果简单的使补上的点得到一个大于cutoff的值也是不妥的 因为自动生成的color scale的图示会把这些值也包括进去 我希望的是所有没有出现的点就使用背景色 比如白色 自动生成的color scale则不把这些包括进去
下面是脚本 我试图看明白 但是实在不懂len这些函数是什么意思
如果方便的话 麻烦懂的朋友帮我修改一下
不胜感激!
#!/usr/bin/python
### USAGE: use_gnuplot.py data_file x_step y_step
###
### The file must contain 3 columns: x,y, value
### X and Y must be integer
### x_step and y_step is set to 1 by default
import sys
import re
x_step=1.0
y_step=1.0
empty_value=0.0
data_x=[]
data_y=[]
data_v=[]
data=[]
file_name="data"
f1=open("gnuplot_data","w")
f2=open("gnuplot_script","w");
max_x=-10000
max_y=-10000
min_x=10000
min_y=10000
if len(sys.argv)==4:
file_name=sys.argv[1]
x_step=float(sys.argv[2])
y_step=float(sys.argv[3])
if len(sys.argv)==2:
file_name=sys.argv[1]
f =open(file_name,"r")
for line in f:
data=re.split('\s+',line.strip())
data_x.append(float(data[0]))
data_y.append(float(data[1]))
data_v.append(float(data[2]))
if float(data[0]) < min_x:
min_x = float(data[0])
if float(data[1]) < min_y:
min_y = float(data[1])
if float(data[0]) > max_x:
max_x = float(data[0])
if float(data[1]) > max_y:
max_y = float(data[1])
print min_x,max_x,min_y,max_y
#m=[[None for i in range(max_x-min_x+1)] for j in range(max_y-min_y+1)]
m=[[None for i in range(max_y-min_y+1)] for j in range(max_x-min_x+1)]
for i in range(0,max_x-min_x+1):
for j in range(0,max_y-min_y+1):
m[j] = empty_value
for i in range(0,len(data_x)):
m[int(data_x-min_x)][int(data_y-min_y)] = data_v
for i in range(0,max_x-min_x+1):
for j in range(0,max_y-min_y+1):
f1.write(str(i+min_x)+" "+str(j+min_y)+" "+str(m[j])+"\n")
f1.write(str(i+min_x)+" "+str(j+min_y+y_step)+" "+str(m[j])+"\n")
f1.write("\n")
for j in range(0,max_y-min_y+1):
f1.write(str(i+min_x+x_step)+" "+str(j+min_y)+" "+str(m[j])+"\n")
f1.write(str(i+min_x+x_step)+" "+str(j+min_y+y_step)+" "+str(m[j])+"\n")
f1.write("\n")
f2.write("set terminal postscript eps enhanced color\n")
f2.write("set output 'out.eps'\n")
f2.write("set pm3d map\n")
f2.write("set size ratio 1\n")
max_x = max_x+x_step
max_y = max_y+y_step
f2.write("set xrange ["+str(min_x)+":"+str(max_x)+"]\n")
f2.write("set yrange ["+str(min_y)+":"+str(max_y)+"]\n")
f2.write("splot 'gnuplot_data' with pm3d t''\n")