% sudo yum install -y erlang . . . 失敗: erlang-erts.x86_64 0:R16B-03.7.fc20 完了しました! % erl zsh: command not found: erl
selinux-policyをupdateする必要があるらしい
sudo yum update -y selinux-policy
失敗したerlang-ertsだけ再インストール
sudo yum install -y erlang-erts
こんな感じで円グラフを表示する方法です。
http://www.cdc.gov/dhdsp/data_statistics/ems/fs_ems_mt.htm
作ってみて、とりあえず楽にカスタムできそうなやつが出来たのでコードをおいておきます。
結果としてはこんな感じ
jVectorMap and Raphaël - CodePen
Raphaëlは初めて使いましたがこれはいいですね、いじってて楽しいのでもう少し触ってみようかと思います。
コードなどは私のCodePenにあります。
今回は単純にこうできる、という紹介ですのであまりそれっぽくないですが...
外枠を太くしたり、といったことがg.Raphaelのpiechartに見た感じなさそうだったので大きさの同じcircleを作成してそれをアニメーションさせています。
あと、gridは座標が分かりやすいようつけているだけです。
user名とかを使いまわす人向けです。
最近dockerが楽しくて一日中弄ってます。
ただ、毎回思うのがオプション指定が多くて面倒
docker run -it -u cordea -w /home/cordea --name hoge hoge/hoge /usr/bin/zsh
/usr/bin/zsh に関してはDockerfileで指定すれば問題はない
ただ user と working directory はどうしたものやら
調べてもそもそも指定している人が少ない
というわけでpythonで簡単に書いてみました。
詳しいことはGitHub(下にリンクが貼ってあります)のREADME.mdを見て下さい。
導入方法等はGitHubで。
ただ、調べればREADME.mdより詳しく書いてあるところがあるかと思います。
使用前
docker run -it -u cordea -w /home/cordea --name hoge hoge/hoge /usr/bin/zsh
使用後
dockerun hoge/hoge
もちろん以下のように一部のオプションだけ変更したり、もともとrunコマンドにあるオプションを使用するのも可能です。
dockerun -w / --name huge hoge/hoge
ただ、他のオプションを指定する場合はoptparseの仕様で"-- -a"のようにしないといけないみたいです。
まぁ、他のオプションを多用するならdockerunを書き換えるか、docker runを使うかするのが楽かと思いますが...
急ごしらえで作ったものでバグも多いかと思います。
バグを見つけたらご自身で直していただくか、ご連絡頂けますと幸いです。
探せば似たようなのはありそうだけどとりあえず満足。
echo ${array[0]}
で出力される結果がshellによっては必ずしも望んだものにはならないという話
要するに配列のインデックスの開始がshellの種類によって0だったり1だったりするということです。
複数のshellを使う人には当たり前の知識かもしれませんが、私には新鮮だったのでメモ。
sh-3.2$ array=(0 1 2 3) sh-3.2$ echo ${array[*]} 0 1 2 3 sh-3.2$ echo ${array[0]} 0 sh-3.2$ echo ${array[1]} 1
CORDEA@macrou:~$ array=(0 1 2 3) CORDEA@macrou:~$ echo ${array[*]} 0 1 2 3 CORDEA@macrou:~$ echo ${array[0]} 0 CORDEA@macrou:~$ echo ${array[1]} 1
CORDEA@macrou% array=(0 1 2 3) CORDEA@macrou% echo ${array[*]} 0 1 2 3 CORDEA@macrou% echo ${array[0]} CORDEA@macrou% echo ${array[1]} 0
[CORDEA@macrou ~]$ set array = ( 0 1 2 3 ) [CORDEA@macrou ~]$ echo ${array[*]} 0 1 2 3 [CORDEA@macrou ~]$ echo ${array[0]} [CORDEA@macrou ~]$ echo ${array[1]} 0
[CORDEA@macrou ~]$ set array = ( 0 1 2 3 ) [CORDEA@macrou ~]$ echo ${array[*]} 0 1 2 3 [CORDEA@macrou ~]$ echo ${array[0]} [CORDEA@macrou ~]$ echo ${array[1]} 0
$ array=(0 1 2 3) $ echo ${array[*]} 0 1 2 3 $ echo ${array[0]} 0 $ echo ${array[1]} 1
multifasta形式のファイルを投げるとGC含量を計算します。
ATGC以外の文字(Nとか) が入った場合の動作は保証していません。
動作確認にはNucleic and/or Amino Acid contentsを使用させていただきました。
fasta := URLDownload["http://example.com/hoge.fasta"] lines = Import[fasta, {"FASTA", "LabeledData"}] gcContent = Map[Module[{map = Counts[Characters[Last[#]]]}, First[#] -> Interpreter["PercentFraction"][N[(map["G"] + map["C"]) / Total[map]]]] &, lines] Do[Echo[Last[x], First[x] <> ": "], {x, prc}]
python gc.py sequence.ffn
#!/bin/env python # encoding:utf-8 # # Author: Yoshihiro Tanaka # Created: 2014-10-09 # import sys infile = open(sys.argv[1], "r") lines = infile.readlines() infile.close() atgc = ['A', 'T', 'G', 'C'] fflag = False lst = [] for l in range(len(lines)): line = lines[l] if ">" in line: if fflag: sys.stdout.write(seq) print("gc%: " + str( (lst[2]+lst[3]) / float(sum(lst)) )) lst = [] seq = line fflag = True else: for i in range(len(atgc)): try: lst[i] += line.count(atgc[i]) except: lst.append(line.count(atgc[i])) sys.stdout.write(seq) print("gc%: " + str( (lst[2]+lst[3]) / float(sum(lst)) ))
awk version 20070501
動作確認はMac OS Xのみ
awk -f gc.awk sequence.ffn
#!/bin/awk -f # encoding:utf-8 # # Author: Yoshihiro Tanaka # Created: 2014-10-26 # function calc_gc(atgc) { sum = 0; for (i in atgc) { sum += atgc[i] } gc = ((atgc["G"] + atgc["C"]) / sum)*100 return gc } function plus_atgc(atgc) { if (substr($0, i, 1) in atgc) { return substr($0, i, 1) } } { if ($0~/^>/) { if (length(atgc) > 0) { printf("%s%0.2f\n","gc%: ",calc_gc(atgc)) } print $0 for (i=1; i<=4; ++i) { atgc[substr("ATGC", i, 1)] = 0 } } else { for (i=1; i<=length($0); ++i) { ++atgc[plus_atgc(atgc)] } } } END { printf("%s%0.2f\n","gc%: ",calc_gc(atgc)) }
動作確認はDebianとCentOSしかしていません。
GNU sed しか動かないようです。BSD sed(Mac OSとか)の方はgsed使うか書き換えて下さい。
chmod u+x gc.sh ./gc.sh sequence.ffn
#!/bin/bash # # Author: Yoshihiro Tanaka # date: 2014-10-08 flag=false lines=$(wc -l $1 | sed -e 's/^ *//g' | cut -d ' ' -f 1) j=1 for line in `cat $1`; do if [ `echo $line | grep ">"` ]; then if $flag; then echo $seq for val in ${array[@]}; do let sum+=$val done echo "gc%: $(echo "scale=4; ((${array[2]}+${array[3]}) / $sum) * 100" | bc | cut -c 1-5)" sum=0 array=() fi seq=$line flag=true else tmp=($(echo $line | sed -e 's/\(.\)/\1\n/g' | grep "[ATGC]" | sort | uniq -c | sed -e 's/^ *//g' | cut -d ' ' -f 1)) i=1 for val in ${tmp[@]}; do let result=${array[$i]}+$val array[$i]=$result let i++ done if [ $lines -eq $j ]; then for val in ${array[@]}; do let sum+=$val done echo $seq echo "gc%: $(echo "scale=4; ((${array[2]}+${array[3]}) / $sum) * 100" | bc | cut -c 1-5)" fi fi let j++ done
主に
tmp=($(echo $line | sed -e 's/\(.\)/\1\n/g' | grep "[ATGC]" | sort | uniq -c | sed -e 's/^ *//g' | cut -d ' ' -f 1))
このあたりについて。
ATGCで並んだ文字列をsedで一文字ずつ改行してgrepでATGCだけ取り出します。
これは放置していると改行コードまで入ってしまうためです。
次のsortとuniqによってATGCの並び順はA, C, G, Tになります。
その後のsedでは前半のスペースを全て消しています。
ちなみにawk '{print $1}' によって以下の部分を省略できます。
sed -e 's/^ *//g' | cut -d ' ' -f 1
今回はawkを使わずに書きたかったのであえてこの書き方にしてあります。
そのため、以下の部分では array[2] (C) と array[3] (G) を取り出して計算しています。
echo "gc%: $(echo "scale=4; ((${array[2]}+${array[3]}) / $sum) * 100" | bc | cut -c 1-5)"
それと、以下の部分でcutしているのは、bcを行った際にどうしても5.5500のように00が付いてしまうのが紛らわしいと感じたためです。
"scale=4; ((${array[2]}+${array[3]}) / $sum) * 100" | bc | cut -c 1-5
何かいい方法があればご教授ください。
最近小ネタばっかりですが
こんなファイルがあったとして
0,1,2,3,4,5,6,7,8,9 a,b,c,d,e,f,g,h,i,j
このような感じで出力したい場合
0 1 2 3 4:5:6:7:8:9 a b c d e:f:g:h:i:j
#!/bin/awk -f BEGIN { FS="," } { for(i=1; i<=NF; i++) { if (i>5) { if (i==NF) { print $i } else { printf $i ":" } } else { printf $i "\t" } } }
もう少しきれいに書けないものか...
棒グラフや凡例の重なり順についてはStack Overflowにかかれていますが、Polar chartの重なり順については慣れていない人では少し戸惑うかもしれませんのでメモ。
matplotlibにおける重なり順の指定にはzorderを使用します。
こんな感じのものを作る時。
きちんと重なり順を指定しないとこうなることがあります。
set_zorderで大きい値に指定したものが表に出ます。
この場合は内側からプロットされるため、zorderを順番に9, 8, 7, 6, 5... というように指定しています。
import numpy as np import matplotlib.pyplot as plt theta = np.tile(0, 10) radii = np.arange(2.0, 22.0, 2.0) width = np.pi*2 colors = theta ax = plt.subplot(111, polar=True) bars = ax.bar(theta, radii, width=width, bottom=0.0) c = 0 for r, bar in zip(radii, bars): # ここでzorderの指定 bar.set_zorder(10-c) if c % 2 == 0 or c == 0: bar.set_facecolor('#000000') else: bar.set_facecolor('#ffffff') bar.set_alpha(1.0) c += 1 plt.show()
余談ですがmatplotlibでplotした画像の背景が透過されたpngで保存したい場合はsavefigを使います。
plt.savefig('***.png', transparent=True)