gnuplot:简单的蜂群示例

gnuplot: simple beeswarm example

我一直在努力研究 this doc 第 62 页的基本蜂群图。我想他们会跳过一些细节,我不确定他们使用了哪些实际数据。我认为特别是问题在于将 categorical/string 变量映射到 X 轴值。

我使用了这个数据:

A 1
A 2
A 3
B 4
B 5
B 6

使用此脚本:

set terminal png
set output "graph.png"
set jitter
plot "data.csv" using 1:2:1 with points lc variable

我收到这个错误:

"graph_script" line 4: warning: Skipping data file with no valid points

plot "data.csv" using 1:2:1 with points lc variable
                                                   ^
"graph_script" line 4: x range is invalid

在他们的演示库中,我看到了类似 set xtics ("A" -1, "B" 0) 的东西,它可能会帮助我更好地标记已经是数字的数据,但是如果我的数据不是以数字开头怎么办?

我需要 (hash_string_to_large_int() % 2) 之类的东西吗?一定有更简单的方法!

如评论中所述,您必须将密钥“转换”为数字才能绘制它们。 您可以通过使用您的唯一关键字创建一个列表并定义一个函数来获取索引来做到这一点。

  • 首先,下面的例子创建了一些随机数据
  • 后面的代码对关键字一无所知,因此它从随机数据中从头开始创建唯一列表。

也许有(我不知道)仅使用 gnuplot 的更简单的解决方案。

代码:

### bee-swarm plot with string keys
reset session

# create some random test data
myExts = '.py .sh .html'
set print $Data
    do for [i=1:100] {
        print sprintf("%s %d",word(myExts,int(rand(0)*3)+1),int(rand(0)*10+1)*5)
    }
set print

# create a unique list of strings from a data stringcolumn
Uniques = ''
addToList(list,col) = list.( strstrt(list,'"'.strcol(col).'"') > 0 ? '' : ' "'.strcol(col).'"')
stats $Data u (Uniques = addToList(Uniques,1),0) nooutput

getIdx(key) = (_idx=NaN, sum [_i=1:words(Uniques)] (word(Uniques,_i) eq key ? _idx=_i : 0), _idx)

set offsets 0.5,0.5,1,1
set key noautotitle

set multiplot layout 1,2

    set title "No jitter"
    plot $Data u (idx=getIdx(strcol(1))):2:(idx):xtic(word(Uniques,idx)) w points pt 7 lc var

    set title "With jitter"
    set jitter
    replot
unset multiplot
### end of code

结果: