对研究论文署名的一些观点

最近在论文署名上遇到一些困惑, 于是整理了一下个人观点。 这些原则或者观点当然毫无约束力, 但是, 对于不愿意遵循这些原则的同行, 合作是有难度的。 当然, 人微言轻, 这可能对学科没有任何影响。

以下是相应的原则或者观点:

  1. 先有研究,后有论文,不能本末倒置。

  2. 研究论文不但是展示研究成果,更是展示作者的观点与思想。署名意味着自己对数据的准确性,方法的正确性,结果的准确性与文章的结论、观点都是认同,且能够负责的。

  3. 如果不同意论文的观点,不要署名。

  4. 文章第一稿的作者自动成为第一作者。无论稿件被别人做了多少修改,甚至部分内容重写,修改稿件的人都无权成为第一作者。修改论文功劳再大,都不能成为该稿件第一作者。

  5. 数据提供人和进行数据分析处理的人员必须列为作者。如果对方不同意列为作者,应获得书面确认,此时应在致谢中表示感谢。

  6. 通讯作者主要负责对论文的认真修改以及投稿,统筹回复审稿人意见等,对稿件的质量有最后把关的责任。审稿人需要负起这些责任。

  7. 论文作者只能是对论文撰写有直接贡献的人,最少要参与论文正文的修改。将对论文毫无直接贡献的人列入作者并不合适。

  8. 只对论文提出修改意见而未对论文做出修改的,一般只应列入致谢,不可列为作者。

  9. 论文只有一个第一作者,世界上并不存在共同第一作者。

10.论文只有一个通讯作者,不允许出现两个通讯作者。

11.第一作者完成初稿后,不要急于按顺序列出作者,而是最好由各作者协商,在投稿前确定署名顺序。一般来说,贡献越小,作者的排名就越靠后。文章作者数不宜超过五个。

  1.  遇到有意见分歧的情况,各贡献者之间协商解决,以免发生不快。

鼓--写给村里的侠客

广袤的华北平原的上,

处暑时节,

一盏灯熄灭了,

他的秋天也在这一天停止;

 

川流不息的潮白河边,

在那个名不见经传的小村里,

扭秧歌的鼓声停了,

侠客的大鼓陷入了永久的沉默;

 

他没有了秋天,也就没有了冬天和春天,

明年的大年初一,

人们就不用去吸他家里的烟气,

也不用再求他家墙上那被熏黄的菩萨保佑;

 

大兴安岭、张家口、二连浩特,

在他的故事里总是年轻三十岁。

村里人都说他会武术,能飞檐走壁。

他说,“这辈子不知道应该坐多少次牢,从未失手……”;

 

从明天开始,

世界上便没有人再记得他的“丰功伟绩”,

连村里人也不再认识他,

只低头看庄稼或者手机;

 

侠客的鼓声停了,

侠客消失在河畔的夕阳里,

侠客再也不会回来,

就跟从未存在过一样。

 

2017年8月25日于香港大埔

ImageMagick批量调整多个文件夹下照片的尺寸

  1. Install ImageMagick https://www.imagemagick.org/script/index.php

安装 ImageMagick

  1. Make sure the command mogrify could be called from CMD

安装时选择添加路径,以便mogrify组建能够从CMD调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#### Run the following R code

运行以下R代码。location为照片所保存的文件夹。

location ="D:/photos"
setwd(location)

dirs <- list.dirs(path = location, full.names =TRUE, recursive =TRUE)

for(i in 1:length(dirs)){
temp <- dirs[i]
setwd(temp)
system("mogrify -resize 2909x4000 -density 72 *.jpg")
print(paste("Resizing",temp))
}

更多选项参见 mogrify的帮助。

用PartitionFinder2 筛选系统发育分析分隔模型

PartitionFinder2是用来在建立进化树时筛选最优进化模型以及分区(分隔)方案的软件,是用Python2语言编写的。

核苷酸序列在不同位点有不同的突变速率。核苷酸序列又分为编码基因和非编码基因。编码基因中,密码子第一、二位往往较为稳定,第三位往往变异速率较高。非编码基因因为受到的选择压力一般较小,所以往往可保留更多突变。不同基因以及不同位点的突变速率不同,可能对所推断进化树的稳定性有很大影响。所以在多基因建立进化树过程中,设置分隔模型就显得很重要。

但是分隔模型怎样设置才算合理呢?在PartitionFinder软件开发出来之前,研究人员一般通过将不同基因分开,例如gene1、gene2、gene3,再将每个基因的不同位点分开如gene1_1、gene1_2、gene1_3作为分隔模型,以提高进化树的稳健性。

RAxML、MrBayes、BEAST等常用系统发育软件都支持分隔模型,但并不能用于确定最优化的分隔模型设定方案。在建树过程中,如果设置的分隔模型过多,则拟合的参数会过多,造成结果不准确;如果设置的分隔模型过少,或者不设置分隔模型、设置的不合理,也会造成进化树不准确。很多学者已经意识到这个问题,但是一直苦于没有很好的应对方法。

赤池信息量AIC整合了模型的似然值(Likelihood)以及所要估计的参数数量。模型选择的简约理论认为,AIC或者BIC最小的模型是最优的模型。如果似然值已经足够高,进一步增加模型的参数已经不能再显著提高似然值的情况下,可以认为已经找到了最优模型。但是,对于分隔模型的筛选来说,碱基替换模型与分区方式的组合数量非常多,如果要对每一种分区方案对应的碱基模型筛选出最优组合,在很多情况下几乎是不可能的。这是因为:首先,从碱基比对矩阵计算Likelihood是十分耗费时间的。其次,分隔模型的各种组合的数量呈几何级数增长,如果通过几个基因建树,则可能的分隔模型的数量已经超出了大部分计算机的计算能力。此时就需要引入分隔模型的启发式搜索(Heuristic Search)。

PartitionFinder的作者从原理上解决了以上的问题,并通过Python语言实现了相应的算法(Lanfear et al., 2012)。作者证明,PartitionFinder所得的分隔模型比之前的简单处理更加合理。不仅如此,PartitionFinder在获得最优化分隔方案后,同时会给出每个分隔模块所对应的最优进化模型。因此,Modeltest、jModeltest以及ProtTest等软件都已经被PartitionFinder所超越。事实上,2012年Lanfear介绍PartitionFinder的论文发表后,在google scholar上已经被引用了3223次(截至2019年1月19日)。

本文简述PartitionFinder的安装和使用,供同行参考。

1. 下载和安装

1.1 下载

PartitionFinder的下载网址http://www.robertlanfear.com/partitionfinder/,下载后用WinRAR或者7zip解压缩。

图1 PartitionFinder的结构

其中:

  • docs为说明文档
  • Examples 文件夹下为示例文件,包含DNA序列、形态以及氨基酸序列三个例子
  • partfinder 文件夹下为实现算法的 python脚本
  • Programs 文件夹下为PHYML可执行文件,用来计算likelihood
  • Submodules 文件夹下包含了raxml文件夹,但是该文件夹为空。作者并未交代这个文件夹的内容。
  • tests 文件夹下为开发时的测试文件
  • PartitionFinder.py 为筛选DNA序列最优分隔模型的Python脚本
  • PartitionFinderMorphology.py 为筛选形态数据最优分隔模型的Python脚本
  • PartitionFinderProtein.py 为筛选氨基酸序列最优分隔模型的Python脚本

运行PartitionFinder时,要根据数据类型分别调用三个Python脚本,不能混淆。

1.2. 安装Anaconda

PartitionFinder是用Python2开发的,依赖于numpy、pandas、pytables、pyparsing、scipy、sklearn 等若干程序包。在Windows下,安装这些程序包往往较为麻烦。作者Lanfear推荐已经预装了这些程序包的Anaconda Python。

Anaconda Python的下载地址为:

https://www.anaconda.com/distribution/

PartitionFinder只能在Python2.7上运行,不能使用Python3。因此,这里只能下载Anaconda Python2.7。

双击开始安装。

选择将以下路径添加到系统路径:

C:\ProgramData\Anaconda2;C:\ProgramData\Anaconda2\Scripts; C:\ProgramData\Anaconda2\Library\bin; 以便程序能从命令行CMD运行。

图2 下载Anaconda Python2.7

2. 所需文件

运行PartitionFinder,用户需要提供:

  1. phylip文件:包含所要读取的序列
  2. partition_finder.cfg文件:包含模型筛选时设定的参数

2.1 PHYLIP文件

phylip文件可以通过MUSCLE、CLUSTAL、MAFFT等比对序列的软件生成。如果是多基因序列,一般对每个基因分别比对,手工调整之后,再通过Geneious或phylotools(https://github.com/helixcn/phylotools)等软件生成supermatrix,以phylip格式导出即可

PHYLIP格式的详细定义,参考

http://www.atgc-montpellier.fr/phyml/usersguide.php?type=phylip

PartitionFinder可以接受relaxed phylip,文件中的物种名最长可以达100个字符。

图3 Phylip文件

2.2 partition_finder.cfg 文件

PartitionFinder可以处理三种类型的数据,分别为:

  1. 编码区DNA序列
  2. 氨基酸序列或非编码区DNA序列
  3. 形态数据

根据数据类型的差别,partition_finder.cfg文件会各有不同。

  1. 编码区DNA序列的配置文件要提供每个片段的
  2. 起始和终止位置;
  3. 编码位置(1、2、3)
  4. 氨基酸序列和非编码区DNA序列,只需提供每个基因片段的起始和终止位置。
  5. 形态数据,无需直接指定模块,在计算时采用k-means聚类等算法以划分成不同的组别。

图4 partition_finder.cfg文件的内容

3. 运行

对于DNA序列:

  1. 在partitionFinder文件夹下创建一个新文件夹,命名为test20190219

  2. 将examples/nucleotide文件夹下的test.phy文件以及partition_finder.cfg配置文件拷贝到test20190219文件夹下

  3. 在CMD中,将工作目录转换到partitionFinder下

  4. 调用PartitionFinder.py,格式如下:

python PartitionFinder.py test20190219

  1. 生成的结果会自己保存在test20190219文件夹下,并生成若干新文件(如log.txt)以及文件夹analysis。

  2. 模型筛选的结果就保存在analysis/best_scheme.txt文件中。

图5 运行partitionFinder

图6 partitionFinder的运行结果

4. cfg配置文件

数据类型不同的PHYLIP文件,需要在partition_finder.cfg文件中设置不同的参数。

4.1 cfg文件的参数

4.1.1 alignment

指出phylip的文件名

1
alignment = test.phy;

4.1.2 branchlengths

在优化进化树枝长用于Likelihood计算时,是否各枝长一起优化。

1
branchlengths = linked;

4.1.3 models

models指定模型筛选的范围

1
models = all;

4.1.4 model_selection

model_selection模型筛选的标准,一般用aicc

1
model_selection = aicc;

4.1.5 data_blocks

datablocks 设定数据分区,例如:

1
2
3
4
[data_blocks]
Gene1_pos1 = 1-789\3;
Gene1_pos2 = 2-789\3;
Gene1_pos3 = 3-789\3;

模型筛选的算法 search = greedy;

4.2 部分参数详解

4.2.1 branchlengths

枝长是否相互关联,即是否对每个分隔模式独立估计进化树的枝长(目前只有BEAST、MrBayes、RAxML支持独立估算枝长)

4.2.2 不同数据类型模型筛选的范围

默认情况下models=all;如果用户需要使用更多模型,可设定models=allx,但应尽量避免,这是因为对少数几个模型进行优化要耗费很多时间。

  1. 对于离散性状,例如01性状(BINARY)以及无序质量性状,模型为(MULTISTATE)BINARY+G、BINARY+G+A、MULTISTATE+G、MULTISTATE+G+A,相关详情可参考RAxML的说明书。注意:性状数据模型不能计算AIC。
  2. 对于DNA****序列models=all将比较内置的56种模型。即由14种基本模型为基础:JC、K80、TrNef、K81、TVMef、TIMef、SYM、F81、HKY、TrN、K81uf、TVM、TIM、GTR,同时参考是否用Gamma或者I来表征不同位点进化速率的差异。注意:在分析DNA数据时,如果添加了 --raxml选项,则只计算GTR、GTR+G、GTR+I+G三种模型的AIC的值。
  3. 对于氨基酸序列,默认情况下(使用PHYML计算),要比较的基本模型为:LG、WAG、MTREV、DAYHOFF、DCMUT、JTT、VT、BLOSUM62、CPREV、RTREV、MTMAM、MTART、HIVB、HIVW,每种又分成8种情况:LG、LG+F、LG+G、LG+G+F、LG+I、LG+I+F、LG+I+G、LG+I+G+F ,其中F为是否使用经验氨基酸频率。如果开启了RAxML选项,则会比较LG、WAG、MTREV、DAYHOFF、DCMUT、JTT、VT、BLOSUM62、CPREV、RTREV、MTMAM、MTART、HIVB、HIVW、MTZOA、PMB、JTTDCMUT、FLU、STMTREV、DUMMY、DUMMY2等21种模型,每个模型考虑6种情况。

所筛选模型范围,如果改为models = allx,将进一步扩大:

  1. 对于DNA序列,使用PHYML时,会比较84种模型;使用RAxML时,会比较6种模型;
  2. 对于氨基酸序列,使用PHYML不能获得结果,所以只能使用RAxML,比较的模型数量为195个。此时,所有的碱基频率或者氨基酸频率都是用极大似然估计获得的。

若从指定的模型中筛选:

  1. 如果后续用mrbayes或者beast做分析,则需要设定models为 models = mrbayes;models = beast;,以便只从这两个软件中有的模型中筛选。
  2. 用户也可设定PartitionFinder只考虑有Gamma或Gamma+I的相关的模型
1
2
models = gamma;
models = gammai;
  1. 或直接指定DNA模型的筛选范围:
1
models = JC, JC+G, HKY, HKY+G, GTR, GTR+G;
  1. 指定氨基酸模型的筛选范围
1
models = LG, LG+G, LG+G+F, WAG, WAG+G, WAG+G+F;
  1. 指定模型选择的标准,作者推荐使用corrected AIC, 即AICc
1
2
# model_selection: AIC | AICc | BIC
model_selection = aic;

4.2.3 设定分区

分区模块需要用[data_blocks]标记。

1
2
3
4
5
[data_blocks]
Gene1_codon1 = 1-1000\3;
Gene1_codon2 = 2-1000\3;
Gene1_codon3 = 3-1000\3;
intron = 1001-2000;

[data_blocks] 后紧跟基因以及位点的名称。如上面代码所示: 数据包括Gene1以及intron两部分。对于编码基因Gene1,由于密码子的1、2、3位的进化速率可能不同,因此可将1-1000位点的1、2、3碱基分开,分别作为单独的分区。

上述命令中:

Gene1_codon1 = 1-1000\3; 表示:在第1-1000位点,从第1个碱基开始,步长为3的所有碱基

Gene1_codon2 = 2-1000\3; 表示:在第2-1000位点,从第2个碱基开始,步长为3的所有碱基

Gene1_codon3 = 3-1000\3; 表示:在第3-1000位点,从第3个碱基开始,步长为3的所有碱基

intron = 1001-2000; 表示:从第1001-2000位点。由于是内含子,没有编码功能,所以不用将1、2、3位碱基分开。

如果是为MrBayes筛选分区模型,可在每行前增加charset关键词。

1
2
3
4
charset Gene1_codon1 = 1-1000\3;
charset Gene1_codon2 = 2-1000\3;
charset Gene1_codon3 = 3-1000\3;
charset intron = 1001-2000;

4.2.4 搜寻策略

根据数据量以及要筛选的分区组合的数目,PartitionFinder的搜索策略,要通过修改search参数做相应调整。

1
search: all | greedy | rcluster | rclusterf | hcluster | kmeans | user

其中:

  • search = all 一般用于12个分区以下;
  • search = greedy 10-100个分区;
  • search = rcluster 100个以上的分区;
  • search = rclusterf 只适用于RAxML选项开启时,尤其适用于有若干分析需要数据很大,同时ML需要优化很长时间时,可减少等待的时间;
  • search = hcluster 在研究中不推荐使用,仅为了开发而保留;
  • search = user 如果用户要对上述定义的分区组合,按照指定的方式筛选, 则可在search = user命令之后,指定搜索的策略。同一对括号中的基因表示将作为一个整体进行分析(参见英文版说明书第21页)
1
2
3
4
together= (Gene1_codon1, Gene1_codon2, Gene1_codon3, intron); 
intron_123 = (Gene1_codon1, Gene1_codon2, Gene1_codon3) (intron);
intron_12_3 = (Gene1_codon1, Gene1_codon2) (Gene1_codon3) (intron);
separate= (Gene1_codon1) (Gene1_codon2) (Gene1_codon3) (intron);

4.2.5 搜寻策略调整举例

4.2.5.1 少于12个分区

1
2
3
4
branchlengths = linked;
models = all;
model_selection = aicc;
search = all;

4.2.5.2 对10-100个分区进行筛选

超过100个等位基因的序列,需要用贪婪算法,基本步骤如下:

  1. 设定每个基因的起始位点以及结束位点,编码位置(1,2,3)等
  2. 设定.cfg文件
  3. 用raxml计算Likelihood

对于DNA为:

python PartitionFinder.py InputFoldername --raxml

对于氨基酸为:

python PartitionFinderProtein.py InputFoldername --raxml

4.2.5.3 超大数据(1000个)的分区筛选

超大型数据的位点(1000个以上),贪婪算法仍然太慢,此时推荐使用其他算法,以筛选最优分隔模型设置方案(Lanfear et al 2014),基本步骤如下:

  1. 设定每个基因的起始位点以及结束位点,编码位置(1、2、3)等
  2. 更改.cfg文件,设定 search = rcluster
  3. 在cmd中运行PartitionFinder:
1
python PartitionFinder.py InputFoldername --raxml

如仍然过慢,则更改recluster-max 参数:

1
python PartitionFinder.py InputFoldername --raxml --rcluster-max 100

4.2.6 用户自定义进化树

在模拟研究中,可能会假设已知进化树的结构,探讨能否筛选到最优分区模型。此时可指定一棵进化树,在后续的分析中,该进化树的拓扑结构将被保留,但是枝长会根据GTR+I+GAMMA模型重新估计。指定进化树的命令如下:

1
2
3
ALIGNMENT FILE # 
alignment = test.phy;
user_tree_topology = tree.phy

5.输出结果

生成的结果位于同一文件夹下的analysis文件夹中,该文件夹包含以下文件:

  1. best_schemes.txt纯文本文件,包括所筛选到的最优化分隔模型划分方案以及每个区块对应的最优模型以及RAxML和Nexus的分隔模型。
  2. subsets文件夹:每个分区所对应的AICc值以及相应的筛选过程
  3. schemes文件夹:所分析的分隔模型划分方案,详细的分析过程

6.命令行选项

在运行PartitionFinder时,可在命令行设定一些参数,具体如下:

  • --all-states 仅用于k-means选项开启的情况,用于限定状态的数量
  • --force-restart 删除之前的分析,完全重新开始
  • --min-subset-size 设定子集的大小。只用于k-means算法(这个选项在说明书中交代得不是很清楚)
  • --no-ml-tree 设定此选项后,PartitionFinder将从Neighbour Joining(PHYML)或者Parsimony树(RAxML)开始。
  • --processors N, -p N 多线程计算,使用多个CPU内核。默认情况下,PartitionFinder会使用多个核,如果要控制所用到的核数,则应做相应设定。
  • --quick, -q 让PartitionFinder停止写一些记录文件,如果处理的数据特别大,有可能会提升速度,常用于使用贪婪算法的情况下。
  • --raxml 使用RAxML帮忙寻找最优分隔模型。
  • --rcluster-max N 设定cluster的数量,默认值N为1000或者分区数乘以10中的较大者,一般已经可以保证搜寻到正确的分隔模型。
  • --rcluster-percent N 设定要搜寻的所有可能的分区组成的百分数,默认为10%。该参数配合--rcluster-max N,可减少重复计算。
  • --save-phylofiles 保存数据分析过程中生成的进化树,主要用来纠错。
  • --weights "W_rate , W_base , W_model , W_alpha" 只用于--raxmlhcluster or rcluster选项开启时,分别表示几个参数的权重(参考说明书第26页):
1
2
3
4
1. the overall rate for a subset
2. the base/amino acid frequencies
3. the model parameters
4. the alpha parameter (which describes gamma distributed rates across sites)

进一步阅读

  • Lanfear, R., Calcott, B., Ho, S. Y., & Guindon, S. (2012). PartitionFinder: combined selection of partitioning schemes and substitution models for phylogenetic analyses. Molecular biology and evolution, 29(6), 1695-1701.

附录

DNA序列碱基替换模型的三大要素

1. 碱基频率的估算

模型需要提供ATCG频率的估计方法,目前有四种方法:

  1. equal 直接假定ATCG的频率相同
  2. model 是从其他数据读取不同氨基酸的频率(仅用于氨基酸序列)
  3. empirical 是直接从数据计算ATCG的频率
  4. ML是用极大似然法估计ATCG的频率

注意:在模型后添加+X,即可开启ML方法估计ATCG频率,例如F81+X,不过一般用户都是用empirical的方法估计频率,而且结果与ML的结果相差无几。

2. 碱基替换速率矩阵

用来表征碱基之间的转换速率(Relative rates of substitution),其中GTR模型最为复杂,需要估计所有6个参数。

3. 不同位点进化速率的差异

分成以下几种情形:

  1. 各位点速率恒定;
  2. 部分位点进化树进化树速率恒定不变 (I用来表示进化速率恒定位点的比例):GTR + I;
  3. 假设各位点的进化速率符合Gamma分布(因为Gamma分布要估计的参数少,同时曲线有足够的变化,能够较好地拟合多数情况,所以用Gamma分布):GTR + GAMMA;
  4. 同时考虑各位点的进化树速率的差异以及恒定位点的比例:GTR + GAMMA + I。

用HUGO生成静态网站

HUGO是一个静态网站生成软件,用GO语言写成。主要用于将Markdown文档转换成静态网页。静态网页一般只包括html, Javascript以及CSS等。由于完全不需要在服务器上运行数据库以及服务器端的脚本语言,所以静态网页便于维护,安全性也更高些。

HUGO适于生成个人博客,个人网站等小型网站。有多重风格的主题可以选择。类似的静态网站生成器还有 Jekyll, Hexo, Gitbook, Pelican等。

HUGO需要使用命令行,所以Windows用户在使用时,需要为软件添加系统路径,以便在cmd中直接可以调用。

HUGO下载: https://gohugo.io/

苹果电脑下的安装: brew update && brew install hugo

查看帮助: hugo help

查看版本: hugo version

生成新网站模板,例如要建立一个名为 bookshelf的网站 hugo new site bookshelf

添加新的markdown文件 hugo new post/good-to-great.md

查看content里面的内容 tree -a content

启动hugo的服务器, hugo的本地版服务器便于网页的浏览和调试。同时生成网页的速度极快,且保存后都可以直接刷新,不必再重新开启服务器。 hugo server

打开网络浏览器,如FireFox, Chrome等,输入以下网址 http://localhost:1313/

HUGO网站生成的模板并不提供主题。但是要成功生成网页,就必须要指定模板。查看模板的网页为: https://themes.gohugo.io/

要使用网站模板,需要先建立一个名为theme的文件夹,并将工作目录转移到该文件夹下。以便在生成网站时,按照一定的主题生成网站。

1
mkdir themes && cd themes

用git下载不同网页风格主题 git clone git@github.com:dim0627/hugo_theme_robust.git

按照指定主题生成整个网站,生成的网站在public文件夹下。 hugo --theme=hugo_theme_robust

使用disqus留言板 (https://disqus.com/),需要在config.toml中设定。更改参数为:

1
2
3
[Params]
Author = "XXXXX"
disqusShortname = "xxxxx"

参考

http://nanshu.wang/post/2015-01-31/

https://gohugo.io/overview/quickstart/

Markdown语法: https://daringfireball.net/projects/markdown/syntax

基于DataTables Javascript库建立本地版物种信息快速查询网页

小型标本馆可能并没有足够的经费开发自己的数据管理系统。然而建立自己的标本查询系统又是很多小型标本馆梦寐以求的。对于藏品只有几万份的标本馆来说,一般在开发服务器版本的网页之前, 可以考虑先建立一个基于局域网的本地小型查询系统。

html和Javascript是开发过程中绕不开的两种语言:html用来生成网页布局, 而javascript可用来实现本地版本的动态网页。

在网页中用表格展示数据表, 已经有若干JS脚本, DataTables (https://datatables.net/) 就是其中之一。这里主要介绍将IUCN数据导入DataTables, 并通过html展示。标本记录数据与之类似。

1. 创建文件夹

先创建文件夹, 改名为IUCN,例如位置在 C:UsersjlzhangDesktopIUCN

2. 下载DataTables库

解压缩到IUCN文件夹下。 以版本DataTables-1.10.15为例, 所有内容解压缩到C:Users/jlzhang/Desktop/IUCN/DataTables-1.10.15

3. 创建index.html文件

创建一个叫做index.html的纯文本文件。

代码的编码改为UTF-8。拷贝如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html><meta  http-equiv="Content-Type"content="text/html; charset=UTF-8"><head>

<link rel="stylesheet"type="text/css"href="./DataTables-1.10.15/media/css/jquery.dataTables.css">
</head><body><table id="example"class="display"width="100%"></table>
<script type="text/javascript"charset="utf8"src="./DataTables-1.10.15/media/js/jquery.js"></script>
<script type="text/javascript"charset="utf8"src="./DataTables-1.10.15/media/js/jquery.dataTables.js"></script>
<script type="text/javascript"charset="utf8"src="./dat.js"></script>

<script>
$(document).ready(function(){
$('#example').DataTable({ data:dataSet, columns:[
{ title: "科" },//barcode
{ title: "中文科名" },//locationof the storage
{ title: "学名"},
{ title: "中文名" },
{ title: "濒危等级" },
{ title: "是否特有" }
],//Link to the photo
});
});
</script></body></html>

其中:

1
<link  rel="stylesheet"type="text/css"href="./DataTables-1.10.15/media/css/jquery.dataTables.css">

是引用dataTables所带的css样式表, 以调整网页的外观。

1
<script  type="text/javascript"charset="utf8"src="./DataTables-1.10.15/media/js/jquery.js"></script>

是读取 JQuery函数库。因为dataTable是依赖于JQuery库的, 所以必须要先载入。

1
<script  type="text/javascript"charset="utf8"src="./DataTables-1.10.15/media/js/jquery.dataTables.js"></script>

是读取 jquery.dataTables.js 里面的函数。

1
<script  type="text/javascript"charset="utf8"src="./dat.js"></script>

是读取 dat.js中的数据。该数据以Json格式保存。

4. 将数据导入 dat.js文件

IUCN_CN.xlsx 中保存的是IUCN红色名录数据。用以下R代码将Excel中的数据保存为Json数据。

1
2
3
4
5
6
7
8
9
#### Rscript for generatingjson data
setwd("C:/Users/jlzhang/Desktop/IUCN")
library(openxlsx)
library(jsonlite)
dat <- read.xlsx("IUCN_CN.xlsx")####
colnames(dat)
rrrr <- toJSON(dat, dataframe="values")
writeLines(c("vardataSet = ", rrrr, ";"),"dat.js",useBytes =TRUE)
###useBytes 保证存储的数据是UTF-8格式

IUCN_CN.xlsx 数据表对应的各列名称为:

科, 中文科名, 学名, 中文种名,濒危等级, 是否中国特有

因此, 在html文件的Javascript脚本中创建表格对象时, 要设定DataTable对象要展示的各列。

对应的Javascript代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
$(document).ready(function(){
$('#example').DataTable({
data:dataSet,
columns:[
{ title: "科" },//barcode
{ title: "中文科名" },//locationof the storage
{ title: "学名"},
{ title: "中文名" },
{ title: "濒危等级" },
{ title: "是否特有" }
],//Link to the photo
});
});
</script>

5. 浏览 index.html 文件

保存index.html 文件。 用Firefox或者Chrome打开, 即可浏览。DataTable将导入dat.js数据,并以表格的形式展示出来,并提供表格的查找, 排序等功能。如果已经标本已经数字化, 则可以在R中,生成文件的链接。

本文所述 源代码和数据下载

IUCN.zip

img

图1. IUCN物种分布示例数据

img

图2 用DataTable生成的网页版可查询页面

宝天曼随想

常常想起在宝天曼样地做调查的日子,想起那时一起调查的同学,还有工人师傅。那是在2009年的秋天。那时候虽然读书,但不像现在这样漂泊,工作也不像现在两点一线。在宝天曼的工作虽然艰苦,但是那时候日子足够简单,那是一种简单的幸福。

由于宝天曼25公顷样地的调查需要在入冬前完成,我们研究组十几位硕士博士研究生被派往河南宝天曼自然保护区协助调查。

宝天曼属伏牛山脉,位于河南西南部,南阳市内乡县境内。由于时间紧迫,我们十来个同学一起,第二天就要从北京乘飞机到南阳。飞抵南阳,飞机绕着机场最少飞了三圈,失重几次,还好安全落地了,我着实吓得不轻。匆匆忙下了飞机。不记得当时怎么坐上了去宝天曼的车,车先开往内乡县城,车外由平原逐渐变成丘陵,车子再沿着盘山公路一直开,开到天黑。不知道经过多少急弯,车最后开到华北最后一块没被完全破坏森林的核心地区。

路的尽头是一座三层楼的酒店,装修得清雅简约。杜老师就在这里组织调查。第二天就要上山了。每个人领取了迷彩服、绿胶鞋,戴了帽子,准备了干粮,就要开始一天的工作。群山高耸,远处的山顶上见到大块石壁,石壁之间生长出绿色。

从宾馆到样地要步行45分钟,先沿着公路走约十分钟,然后上山要半个多小时。小路曲曲弯弯,布满青苔。山上最多的是锐齿槲栎、漆树、暖木、马尾松、黄山松、玉玲花、千金榆,也有珍贵的望春玉兰、象白蜡、连香树等。连续走了将近五十分钟,终于到达样地边缘,红绳为界。大家早已累得气喘吁吁,一般都要停下来休息十分钟。

树上挂满了刻有红色数字的铝牌:每一棵树都要编号,由八位数字组成,前四位表示所在20m样方的横纵坐标,如0510表示从原点数从西向东第5个样方,从南向北数,第10个样方。后四位表示样方内的顺序号。原点就在整个样地的西南角,一个特别陡峭和偏僻的地方。记得附近有几棵铁杉,还有钻地枫一类的灌木。每个20m的样方又要分成16个5m见方的小方格,都已拉上尼龙绳。

我们要做的,就是给树挂上挂牌,辨认树种,按照刷好的油漆测量胸径超过1cm所有枝条的直径,并且测量每棵树在5m小方格里面的横纵坐标,以便最后归算到整个大样地所在的坐标系中。25公顷样地是边长500m的正方形,里面有625个20m样地,10000个5m小样方。我们到达时调查已经进行了一半左右,由于担心不能在今年完成,组里特地安排我们在入冬前带领学生还有当地的工人师傅做完调查。否则叶子落了,树种将无法鉴定,地面湿滑结冰,工作起来也会很危险。连续40天的工作就这样开始了。

上山基本上是风雨无阻。当然,如果真是下大雨,还是必须要下山的,秋雨特别凉,何况还是海拔900米的林区。

我们几个都是作为队长,每人带两个人。队里的工人师傅挂牌,队长负责测量并报告树种,另一个做记录。

宝天曼样地很陡,有些地方是长达五六十米的倾斜石壁,石缝间长着灌木,此时仍然要去到石壁中间测量,让人觉得十分危险。有些地段长着很多灰栒子,这是一种灌木,有时候分枝多达四五十条,全部需要测量,大家都怕调查这样的样方,栒子一旦出现,那其他灌木也都较多,如毛樱桃、丁香、绣线菊、六道木等。每个人都为遇到这样的样方发愁。

一般情况下,三个人组成的小分队一天能完成两到三个样方的调查。遇到灌木多的,可能只能完成半个。进展缓慢时,一般都灰心丧气。当然,最开心的是一天的调查工作顺利完成。有时候,看到样子神奇的猴头菇也是让人很开心,只可惜当时没有拍照。

日复一日。

最大的问题是吃不好。每天中午带两个馒头,两个煮鸡蛋, 一包榨菜,连续四十天,几乎天天如此。到最后我只吃鸡蛋。回到宾馆,伙食只记得有炒土豆和紫菜汤,或者炒白菜,不见一丁点儿肉食。周末会改善一次,厨房会把其他客人吃剩下的肉菜和土豆烩在一起,给我们吃:一星期见不到什么油水,终于见到一点儿,已经管不了那么多。饭菜很快一抢而光。最盼望就是有人能进城,捎一点儿花生米或者乡巴佬卤蛋过来,最好能带上一个鸡腿,以便好好享受一顿大餐。

天气越来越冷,我们也不得不加上了厚衣服。

除了调查,还要检查调查的准确性,也就是独立再多调查一次,如果天气不好,则要在室内整理并录入数据。数据都要求双盲录入,也就是同一批数据,由不同的人分别输入,比较两个版本的差别,以互相校正。时间一点儿也没有浪费。

空气清冽,溪水甘甜,树木相伴,鸟鸣婉转,这就是每天的工作的地方。

调查完成的那一天,正好冷空气袭来,吹走了连续几日的乌云,雨后清新无比,树叶已经泛黄,天空高得爽朗,金色与蓝色那么养眼,美得让人陶醉。

在宝天曼一起调查的同学,如今已分散在北京、广东、上海、江西、香港等不同的地方。8年过去了,那时跟我一起调查的大学生们,你们还好吗?帮我们挂牌的工人师傅们,还愿意跟我们一起上山吗? 宝天曼的树木们,你们有长大吗?宝天曼的天,还是蓝得那么让人心醉吗?

2017年4月25日 金龙 于 香港大埔

4月18日的森林

大帽山的春色,

随着阳光,

随着鸟鸣,

随着窗口的阵阵热风,

直扑脸颊

 

寂寞终于被驱散,

三个人在这天下午,

行走林间:

不知道为什么开始,

不知道为什么结束,

不知道为什么叶子要跌落凡尘,

不知道为什么山上满是云朵,

更不知道为什么要经历那么多寒暑

 

森林里辨不清方向:

树的尽头还是树,

山的尽头还是山。

 

缘溪行,

忘路之远近,

却早已不见那渔人。

 

此时此地,

森林就成了麦田:

穿行在森林,

就和小时候穿行在麦田一样

2017年4月18日

用exiftool一次为多个文件夹下的照片添加经纬度

Exiftool是用来读写照片exif信息的软件, 将GPS轨迹 gpx文件放在照片文件夹下,可以一次性为该文件夹下所有照片添加GPS经纬度信息。 添加过经纬度的照片在GeoSetter的软件, 或者其他智能手机中查看十分方便。为照片自动匹配经纬度信息已经成为当前生物多样性调查中的基本步骤之一。 如果积累了较多的照片在不同文件夹中,同时又要一次性更新该文件夹下的所有照片,就稍显麻烦。这里介绍如何用R驱动exiftool, 遍历所有的文件夹, 并更新每张照片的exif信息。

Exiftool (www.sno.phy.queensu.ca/~phil/exiftool/)下载后解压缩, 将 exiftool(-k).exe 改名为exiftool.exe。 放在路径上没有中文的文件夹,如 C:\Program Files\exiftools, 并将该路径添加到系统路径中。

将exiftool添加到系统路径:我的电脑 > 属性 > 高级系统设置> 环境变量。

在系统变量部分中,找到并选择 PATH环境变量。单击编辑。

新建系统变量窗口中,新建 PATH 环境变量的值,加上双引号里面的内容, “C:\Program Files\exiftools” 单击确定。通过单击确定关闭所有剩余窗口。

运行以下R脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
setwd("C:/Users/photos")

#### 航迹gpx文件名
geotag <- "place.gpx"

#### 所有相册的根目录
parent.folder <- "C:/Users/photos"

#### 列出所有子目录
dirs <- list.dirs(path = parent.folder, full.names =TRUE, recursive =TRUE)

#### copy the gpx file toeach subfolder
for(i in 2:length(dirs)){
setwd(dirs[i])
#### 将gpx文件拷贝到每一个子文件夹。如果每个文件夹已经有gpx文件, 则请忽略。
file.copy(from ="C:/Users/photos/place.gpx", to = geotag, overwrite =TRUE)
#### 运行exiftool 命令行
system(paste("exiftool -geotag ", geotag, "./"))
#### unlink(geotag)
}

注: 本文是应华南农业大学曾思金博士的要求而编写的。