我有这样的数据集(文件名'数据'):
a 10.1
b 10.1
c 10.2
b 15.56
a 3.20
我想将这些数据绘制成点。当我尝试:
plot 'data' using 2:xticlabels(1)
我获得了具有5个x轴值a,b,c,b,a的图,但我希望在具有所有5个y值的图上仅得到3(a,b,c(顺序不重要))。有可能吗?
我的真实数据文件如下所示:
2-8-16-17-18 962.623408
2-3-4-5-6 -97.527840
2-8-9-10-11 962.623408
2-8-9-10-11 937.101308
2-3-4-5-6 37.101308
并且有大约一千条记录。
我不知道如何使用mgilson的代码,但他给了我一个主意。我添加到数据文件的附加列(索引):
1 a 10.1
2 b 10.1
3 c 10.2
2 b 15.56
1 a 3.20
之后在gnuplot中绘图很容易: plot 'data' u 1:3
我使用perl,所以我的脚本看起来像这样:
#!/usr/bin/perl
$index_number = 0;
while (<>)
{
$line = $_;
@columns = split(" ",$line);
$col1 = $columns[0];
$col2 = $columns[1];
if( not exists $non_numeric{$col1} )
{
$index_number++;
$non_numeric{$col1} = $index_number;
}
print "".$non_numeric{$col1}."\t".$col1."\t".$col2."\n";
}
答案 0 :(得分:1)
我怀疑你能想出一个只有gnuplot的解决方案。但是,只要您的系统上安装了python2.5或更新版本,此就应该工作。 (它适用于您的测试数据)。
import sys
import collections
data = collections.defaultdict(list)
keys = []
# build a mapping which maps values to xticlabels (hereafter "keys")
# Keep a second keys list so we can figure out the order we put things into
# the mapping (dict)
with open(sys.argv[1]) as f:
for line in f:
key,value = line.split()
data[key.strip()].append( value )
keys.append(key.strip())
def unique(seq):
"""
Simple function to make a sequence unique while preserving order.
Returns a list
"""
seen = set()
seen_add = seen.add
return [ x for x in seq if x not in seen and not seen_add(x) ]
keys = unique(keys) #make keys unique
#write the keys alongside 1 element from the corresponding list.
for k in keys:
sys.stdout.write( '%s %s\n' % (k, data[k].pop()) )
# Two blank lines tells gnuplot the following is another dataset
sys.stdout.write('\n\n')
# Write the remaining data lists in order assigning x-values
# for each list (starting at 0 and incrementing every time we get
# a new key)
for i,k in enumerate(keys):
v = data[k]
for item in v:
sys.stdout.write( '%d %s\n' % (i, item) )
现在编写此脚本的脚本:
set style line 1 lt 1 pt 1
plot '<python pythonscript.py data' i 0 u 2:xticlabels(1) ls 1,\
'' i 1 u 1:2 ls 1 notitle
这是如何运作的。当您执行plot ... u 2:xticlabels(1)
之类的操作时,gnuplot 隐式将顺序整数x值分配给数据点(从0开始)。 python脚本重新排列数据以利用这一事实。基本上,我创建了一个映射来映射&#34;键&#34;在第一列中,列出与该键对应的元素。换句话说,在您的虚拟数据文件中,键'a'
映射到值列表[10.1, 3.2]
。但是,python词典(映射)没有排序。所以我保留了第二个维护订单的清单(这样你的轴标记为&#39; a&#39;&#39; b&#39;&#39; c&#39;而不是&#39;例如,c&#39;,&#39; a&#39;&#39; b&#39;我确保轴列表是唯一的,以便我可以使用它来打印必要的数据。我用2遍传递数据。第一遍只打印每个列表中的一个值以及映射&#34;键&#34;。第二遍打印剩余的值以及gnuplot将隐式分配给它们的x值。在两个数据集之间,我插入2个空行,以便gnuplot可以使用index
关键字(此处缩写为i
)来区分差异。现在我们只需要相应地绘制两个数据集。首先我们设置一个linestyle,这样两个过程在绘制时都会有相同的样式。然后我们用xticlabels和索引1使用x值绘制索引0(第一个数据集),y值对计算的python脚本(u 1:2
)。对不起,解释很长(并且原始版本略有错误)。祝你好运,快乐的gnuplotting!