QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 937|回复: 0

请教vi和plot等作图的问题

[复制链接]
发表于 2006-3-10 14:58:20 | 显示全部楼层 |阅读模式
我要处理一些数据 平时对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")
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-7-1 12:47 , Processed in 0.177659 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表