京橋のバイオインフォマティシャンの日常

データ分析、コマンドライン、プログラミングについての技術資料・自己アップデート・悩み事などをまとめています。最近、ディープラーニング関連のR言語の資料をまとめるべく注力してます。

Bioconductor/BioImageDbsパッケージの使い方〜深層学習用の画像アレイデータを取得する〜

BioImageDbsパッケージは、Rで可読なフォーマット(.Rds)で、 深層学習(DL)用の画像アレイデータ(4次元あるいは5次元)を 提供するexperimentHubパッケージである。

今回、BioImageDbsパッケージの使用方法を解説する。

BioImageDbsのインストール

まずは、Bioconductor関連のパッケージも含めて、インストールする。

#インストール
install.packages("BiocManager")
BiocManager::install("ExperimentHub")
BiocManager::install("BioImageDbs")
install.packages("magick")

#ロード
library(ExperimentHub)
library(BioImageDbs)

BioImageDbsのデータセット表示

2021-05-18のスナップショットには、23 個のレコードが登録されています。

3D電顕解析で得られた神経系のデータセット、タイムラプスの細胞時系列データなどがあります。

#事前セットアップ
eh <- ExperimentHub()

#BioImageの情報取得
query(eh, "BioImageDbs")

#ExperimentHub with 23 records
# snapshotDate(): 2021-05-18
# $dataprovider: CELL TRACKING CHALLENGE (http://celltracki...
# $species: Homo sapiens, Mus musculus, Drosophila melanoga...
# $rdataclass: List, magick-image
# additional mcols(): taxonomyid, genome, description,
#   coordinate_1_based, maintainer, rdatadateadded,
#   preparerclass, tags, rdatapath, sourceurl, sourcetype 
# retrieve records with, e.g., 'object[["EH6095"]]' 
#
#           title                                             
#  EH6095 | EM_id0001_Brain_CA1_hippocampus_region_5dTensor...
#  EH6096 | EM_id0001_Brain_CA1_hippocampus_region_5dTensor...
#  EH6097 | EM_id0002_Drosophila_brain_region_5dTensor.rds    
#  EH6098 | EM_id0002_Drosophila_brain_region_5dTensor_trai...
#  EH6099 | LM_id0001_DIC_C2DH_HeLa_4dTensor.rds              
#  ...      ...                                               
#  EH6113 | LM_id0003_Fluo_N2DH_GOWT1_5dTensor.rds            
#  EH6114 | EM_id0003_J558L_4dTensor.rds                      
#  EH6115 | EM_id0003_J558L_4dTensor_train_dataset.gif        
#  EH6116 | EM_id0004_PrHudata_4dTensor.rds                   
#  EH6117 | EM_id0004_PrHudata_4dTensor_train_dataset.gif

画像アレイデータのダウンロード

(1) EM_id0001_Brain_CA1_hippocampus_region

画像セグメンテーション用の2値化ラベル付き5次元アレイ。 電子顕微鏡(FIB-SEM)画像の3Dセグメンテーションデータセット(1065x2048x1536ボリューム、約5x5x5nmの解像度)で、 マウス脳のCA1海馬領域にあるミトコンドリアのバイナリーラベル付き画像を含む。

#EM_id0001の情報取得
qr <- query(eh, c("BioImageDbs", "EM_id0001"))

#タイトルの表示
mcols(qr)$title
#[1] "EM_id0001_Brain_CA1_hippocampus_region_5dTensor.rds"              
#[2] "EM_id0001_Brain_CA1_hippocampus_region_5dTensor_train_dataset.gif"

#詳細情報
qr[1]
#ExperimentHub with 1 record
# snapshotDate(): 2021-05-18
# names(): EH6095
# package(): BioImageDbs
# $dataprovider: https://www.epfl.ch/labs/cvlab/data/data-em/
# $species: Mus musculus
# $rdataclass: List
# $rdatadateadded: 2021-05-18
# $title: EM_id0001_Brain_CA1_hippocampus_region_5dTensor.rds
# $description: 5D arrays with the binary label for the ima...
# $taxonomyid: 10090
# $genome: NA
# $sourcetype: PNG
# $sourceurl: https://github.com/kumeS/BioImageDbs
# $sourcesize: NA
# $tags: c("3D images", "bioimage", "CellCulture",
#   "electron microscopy", "microscope", "scanning
#   electron microscopy", "segmentation", "Tissue") 
# retrieve record with 'object[["EH6095"]]' 

#アレイデータのダウンロード
ImageData <- qr[[1]]

#アレイデータの詳細表示
str(ImageData$Train)
#List of 2
# $ Train_Original   : num [1, 1:1024, 1:768, 1:165, 1] 0.4 0.518 0.471 0.537 0.51 ...
# $ Train_GroundTruth: num [1, 1:1024, 1:768, 1:165, 1] 0 0 0 0 0 0 0 0 0 0 ...

str(ImageData$Test)
#List of 2
# $ Test_Original   : num [1, 1:1024, 1:768, 1:165, 1] 0.569 0.514 0.475 0.482 0.533 ...
# $ Test_GroundTruth: num [1, 1:1024, 1:768, 1:165, 1] 0 0 0 0 0 0 0 0 0 0 ...

#動画データ(.gif)の表示
magick::image_read(qr[[2]])

f:id:skume:20210919150025g:plain:w600

ここで、qr[]でメタデータにアクセスできる。

また、qr[[]]で実データにアクセスできる。

(2) LM_id0001_DIC_C2DH_HeLa

2D画像セグメンテーション用のHeLa細胞の4次元アレイデータである。 オリジナルデータとマルチラベルが付与された教師画像データのセットである。 データセットの画像は、対物レンズにPlan-Apochromat 63x/1.4(oil)を使用したZeiss LSM 510 Metaで撮影された。

#LM_id0001の情報取得
qr <- query(eh, c("BioImageDbs", "LM_id0001"))

#タイトルの表示
mcols(qr)$title
#[1] "LM_id0001_DIC_C2DH_HeLa_4dTensor.rds"                     
#[2] "LM_id0001_DIC_C2DH_HeLa_4dTensor_train_dataset.gif"       
#[3] "LM_id0001_DIC_C2DH_HeLa_4dTensor_Binary.rds"              
#[4] "LM_id0001_DIC_C2DH_HeLa_4dTensor_Binary_train_dataset.gif"
#[5] "LM_id0001_DIC_C2DH_HeLa_5dTensor.rds" 

#詳細情報
qr[1]
#ExperimentHub with 1 record
# snapshotDate(): 2021-05-18
# names(): EH6099
# package(): BioImageDbs
# $dataprovider: CELL TRACKING CHALLENGE (http://celltrackingchallenge.net/2d-datasets/)
# $species: Homo sapiens
# $rdataclass: List
# $rdatadateadded: 2021-05-18
# $title: LM_id0001_DIC_C2DH_HeLa_4dTensor.rds
# $description: 4D arrays with the multi-labels for the image segmentation. Human HeLa ...
# $taxonomyid: 9606
# $genome: NA
# $sourcetype: PNG
# $sourceurl: https://github.com/kumeS/BioImageDbs
# $sourcesize: NA
# $tags: c("bioimage", "cell tracking", "CellCulture", "microscope",
#   "segmentation", "Tissue") 
# retrieve record with 'object[["EH6099"]]' 

#アレイデータのダウンロード
ImageData <- qr[[1]]

#アレイデータの詳細表示
str(ImageData$Train)
#List of 2
# $ Train_Original   : num [1:84, 1:512, 1:512, 1] 0.518 0.455 0.455 0.447 0.439 ...
# $ Train_GroundTruth: num [1:84, 1:512, 1:512, 1] 0 0 0 0 0 0 0 0 0 0 ...

str(ImageData$Test)
#List of 2
# $ Test_Original   : num [1:84, 1:512, 1:512, 1] 0.604 0.467 0.459 0.435 0.408 ...
# $ Test_GroundTruth: num [1:84, 1:512, 1:512, 1] 0 0.671 0.671 0.851 0.851 ...

#詳細情報
qr[2]
#ExperimentHub with 1 record
# snapshotDate(): 2021-05-18
# names(): EH6100
# package(): BioImageDbs
# $dataprovider: CELL TRACKING CHALLENGE (http://celltrackingchallenge.net/2d-datasets/)
# $species: Homo sapiens
# $rdataclass: magick-image
# $rdatadateadded: 2021-05-18
# $title: LM_id0001_DIC_C2DH_HeLa_4dTensor_train_dataset.gif
# $description: A animation file (.gif) of the train dataset of LM_id0001_DIC_C2DH_HeLa...
# $taxonomyid: 9606
# $genome: NA
# $sourcetype: PNG
# $sourceurl: https://github.com/kumeS/BioImageDbs
# $sourcesize: NA
# $tags: c("animation", "bioimage", "cell tracking", "CellCulture",
#   "microscope", "segmentation", "Tissue") 
# retrieve record with 'object[["EH6100"]]' 

#動画データ(.gif)の表示
magick::image_read(qr[[2]])

f:id:skume:20210919150049g:plain:w600

【Rでの文字列処理シリーズ(その4)】文字列の近似的文字列マッティング

Rでの文字列処理について、いろいろと試してまとめてみた。

このシリーズでは、主に、baseやstringr、stringdistとかのパッケージを扱う。

今回は、文字列距離を使って、近似的文字列をマッティングする方法を紹介する。

下準備について

########################
#シリーズ共通
########################
#必要なパッケージの読み込み
require(readr)
require(stringr)
require(stringdist)

近似的文字列マッティング

agrep & agrepl 関数

agrep/agrepl関数は、近似的文字列マッティング(あいまい一致)を提供する。

これらの関数は、一般化レーベンシュタイン編集距離(generalized Levenshtein edit distance) *1 を用いて、文字列 x(第2引数)の各要素内で、pattern(第1引数)に近似的にマッチするものを検索する。

ここでは、T/Fで結果が出力される、agrepl関数を扱う。

#対象パターンの文字列
ex0 <- "abcd"

#検索対象
ex1 <- c("a", "ab", "abc", "abd", "abcd", "cdab", "edcba", "abcdefg")

#基本出力
base::agrepl(pattern=ex0, x=ex1, max.distance = 0.1)
#[1] FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE  TRUE

#域値を変えた出力結果
#max.distance = 0
ex1[base::agrepl(pattern=ex0, x=ex1, max.distance = 0)]
#[1] "abcd"    "abcdefg"

#max.distance = 0.1
ex1[base::agrepl(pattern=ex0, x=ex1, max.distance = 0.1)]
#[1] "abc"     "abd"     "abcd"    "abcdefg"

#max.distance = 0.3
ex1[base::agrepl(pattern=ex0, x=ex1, max.distance = 0.3)]
#[1] "ab"      "abc"     "abd"     "abcd"    "cdab"    "abcdefg"

adist 関数

adist関数は、文字ベクトル間の近似的な文字列距離を計算する。 これで出力される距離は、一般化Levenshtein(編集)距離である。

# Approximate String Distances
adist(ex0,  ex1)
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    3    2    1    1    0    4    4    3

stringdist / stringdistmatrix関数で、文字列間の距離指標を計算する

stringdist::amatchstringdist::ainという近似文字列マッチングの関数もあるのだが、 どうも使い勝手が悪くて、stringdist/stringdistmatrix関数を使用する方が良さそうに思う。

現在、stringdistがサポートしている距離指標は、以下の通りである。

手法名 概要
osa 最適文字列アラインメント(制限付きダメラウ・レーベンシュタイン距離)
lv Levenshtein距離(Rネイティブの adist と同様)
dl Full Damerau-Levenshtein 距離
hamming ハミング距離(aとbの文字数が同じであること)
lcs 最長共通部分文字列の距離
qgram q-gram距離
cosine q-gramプロファイル間のコサイン距離
jaccard q-gramプロファイル間のJaccard距離
jw Jaro距離、あるいはJaro-Winkler 距離
soundex soundexエンコーディングに基づく距離

詳細は、ここで確認できる。

search.r-project.org

とりあえず、いつくかの手法で近似的文字列マッティングを実行してみる。

ここでは、表形式で結果が出力されるstringdistmatrix関数を扱う。 使い方は、stringdistとほぼ同じ。

#対象パターンの文字列
ex0 <- "abcd"

#検索対象
ex2 <- c("a", "ab", "abc", "abd", "cdab", "edcba", "abcdefg")

#Optimal string aligment (osa)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="osa", nthread=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   1    4     4       3

#Levenshtein distance
stringdist::stringdistmatrix(a=ex0, b=ex2, method="lv", nthread=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   1    4     4       3

#Full Damerau-Levenshtein distance
stringdist::stringdistmatrix(a=ex0, b=ex2, method="dl", nthread=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   1    4     4       3

#Longest common substring distance
stringdist::stringdistmatrix(a=ex0, b=ex2, method="lcs", nthread=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   1    4     7       3

#q-gram distance (q=1)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="qgram", nthread=2, q=1, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   1    0     1       3

#q-gram distance (q=2)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="qgram", nthread=2, q=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 3  2   1   3    2     7       3

#q-gram distance (q=3)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="qgram", nthread=2, q=3, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 2  2   1   3    4     5       3

#cosine distance between q-gram profiles (q=1)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=1, useNames="strings")
#       a        ab       abc       abd cdab     edcba   abcdefg
#abcd 0.5 0.2928932 0.1339746 0.1339746    0 0.1055728 0.2440711

#cosine distance between q-gram profiles (q=2)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=2, useNames="strings")
#       a        ab       abc       abd      cdab edcba   abcdefg
#abcd NaN 0.4226497 0.1835034 0.5917517 0.3333333     1 0.2928932

#cosine distance between q-gram profiles (q=3)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=3, useNames="strings")
#       a  ab       abc abd cdab edcba   abcdefg
#abcd NaN NaN 0.2928932   1    1     1 0.3675445

#Jaccard distance between q-gram profiles (q=1)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=1, useNames="strings")
#       a        ab       abc       abd cdab     edcba   abcdefg
#abcd 0.5 0.2928932 0.1339746 0.1339746    0 0.1055728 0.2440711

#Jaccard distance between q-gram profiles (q=2)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=2, useNames="strings")
#       a        ab       abc       abd      cdab edcba   abcdefg
#abcd NaN 0.4226497 0.1835034 0.5917517 0.3333333     1 0.2928932

#Jaccard distance between q-gram profiles (q=3)
stringdist::stringdistmatrix(a=ex0, b=ex2, method="cosine", nthread=2, q=3, useNames="strings")
#       a  ab       abc abd cdab edcba   abcdefg
#abcd NaN NaN 0.2928932   1    1     1 0.3675445

#Jaro-Winkler distance
stringdist::stringdistmatrix(a=ex0, b=ex2, method="jw", nthread=2, useNames="strings")
#        a        ab        abc        abd cdab     edcba   abcdefg
#abcd 0.25 0.1666667 0.08333333 0.08333333    1 0.5166667 0.1428571

#  Distance based on soundex encoding
stringdist::stringdistmatrix(a=ex0, b=ex2, method="soundex", nthread=2, useNames="strings")
#     a ab abc abd cdab edcba abcdefg
#abcd 1  1   1   1    1     1       0

あとがき

どうも、osaとかlvとかの整数値の結果よりも、 cosine類似度かJaccard距離、Jaro-Winkler距離で計算して、 小数点以下の数値結果が返ってくる方が何だか計算したっ感じになるのは私だけだろうか。

参考資料

www.karada-good.net

www.okadajp.org

http://finzi.psych.upenn.edu/library/stringdist/html/amatch.htmlfinzi.psych.upenn.edu

https://journal.r-project.org/archive/2014-1/loo.pdfjournal.r-project.org

*1:ある文字列を別文字列に変換するのに必要な挿入、削除、置換の最小の重み付けされた数

【Rのジミ〜な小技シリーズ】Rコンソールにカラーテキストを表示するTips

R言語で、message()関数を使うと、赤い文字列がコンソールに表示されるけど、 もっとほかの色で、コンソール表示ができれば良いのにとか思ったりしないでしょうか??

今回、こういう細かい悩みを解決する記事を書いてみました。

base::message()関数

messageはデフォルトで使えて、通常、赤文字で出力される。

message(1)
message("Hello world!")

f:id:skume:20210908144001p:plain:w350

Crayon - stylish terminal output in R

Crayonは、Colored terminal output on terminalsを可能にしてくれるパッケージである。

さっそく、インストールしてみる。

Crayonのインストール

devtools::install_github("gaborcsardi/crayon")
library(crayon)

実行

実行時には、message()あるいはcat()を使う。

#ブラック
cat(black("Hello world!"))
#ブルー
cat(blue("Hello world!"))
#ミドリ
cat(green("Hello world!"))
#マジェンダ
cat(magenta("Hello world!"))
#シアン
cat(cyan("Hello world!"))

#背景ブラック、文字白
cat(bgBlack(white("Hello world!")))
#背景赤、文字白
cat(bgRed(white("Hello world!")))
#背景ミドリ、文字白
cat(bgGreen(white("Hello world!")))
#背景イエロー、文字白
cat(bgYellow(white("Hello world!")))
#背景ブルー、文字白
cat(bgBlue(white("Hello world!")))
#背景マジェンダ、文字白
cat(bgMagenta(white("Hello world!")))
#背景シアン、文字白
cat(bgCyan(white("Hello world!")))

f:id:skume:20210908143756p:plain:w500

textcolor: Colourise text for display in the terminal.

GerminaRパッケージ内のtextcolorでも、カラーテキスト出力がサポートされている。

GerminaRのインストール

install.packages("GerminaR")
library(GerminaR)

メモ: intiパッケージにも同じ関数がある。

実行

textcolor関数で使えるカラーパレットは、 black, blue, brown, cyan, dark gray, green, light blue, light cyan, light gray, light green, light purple, light red, purple, red, white, yellow らしいです。

実行時には、message()あるいはcat()で出力させる。

ただ、背景色はうまく表示されない。。

#ブルー
message(textcolor("Hello world!", fg = "blue"))
cat(textcolor("Hello world!", fg = "blue"))

#ダークグレイ
message(textcolor("Hello world!", fg = "dark gray"))
cat(textcolor("Hello world!", fg = "dark gray"))

#パープル
message(textcolor("Hello world!", fg = "purple"))
cat(textcolor("Hello world!", fg = "purple"))

#ブラウン
message(textcolor("Hello world!", fg = "brown"))
cat(textcolor("Hello world!", fg = "brown"))

f:id:skume:20210908143802p:plain:w400

参考資料

stackoverflow.com

rdrr.io

rdrr.io

【R言語で作成するアニメーション】楕円・斜め楕円のアニメーションを作図してみた件

ふと、夏季休暇中に、 楕円の公式のパラメータを変えたときに、 どんな図形になるんだったっけと思い立ち、 Rで、アニメーションのプログラムを作ってみた。

楕円の公式を解析的に解いてみて作図したところ、 楕円の形って結構発散するんだなとはじめて知った、夏休み。

楕円の作図

#インストール
install.packages("plotrix")

#楕円の公式(R風)
#x^2/a^2 + y^2/b^2 = 1
#y = ±sqrt((1 - x^2/a^2 )*b^2)

#パラメータ設定
A <- c(1:10, 10:1, 1:3)
B <- rep(3, length(A))
a <- c(A, 3, B)
b <- c(B, 2, A)

animation::saveGIF({
for(n in seq_len(length(a))){
#n <- 1
#X軸
x <- seq(-10, 10, by=0.01)

#Y軸
suppressWarnings(y1 <- sqrt((1 - x^2/a[n]^2 )*b[n]^2))
suppressWarnings(y2 <- -sqrt((1 - x^2/a[n]^2 )*b[n]^2))

#アニメーション作成
plot(x, y1, type="n",
     xlab="x", ylab="y", cex.lab=1.5, cex.axis=1.5,
     xlim=c(min(x, na.rm = T), max(x, na.rm = T)),
     ylim=c(min(x, na.rm = T), max(x, na.rm = T)))
lines(x, y1, type="l", lwd=1.2)
lines(x, y2, type="l", lwd=1.2)
plotrix::boxed.labels(x = 8, y = 8, 
                labels = paste0(" a: ", formatC(a[n], width = 2, flag = " "), "\n", 
                                " b: ", formatC(b[n], width = 2, flag = " ")),
                bg = "#b2f4f4c0", adj = 0.5, cex = 2)
plotrix::boxed.labels(x = -7, y = 8, 
                labels = expression(frac(x^2,a^2) + frac(y^2,b^2) == 1),
                bg = "#fffafa", adj = 0.5, cex = 2)

}},  movie.name = paste0("Fig_01.gif"), interval = 0.25, dpi=300,
nmax = length(a), ani.width = 600, ani.height=600, ani.type="png")

f:id:skume:20210819030715g:plain:w500
楕円の作図アニメーション

斜め楕円の作図

#斜め楕円の公式(R風)
#A*x^2 + B*x*y + C*y^2 = 1
#y = (-B*x ± sqrt((B*x)^2 -4*C*(A*x^2-1))) / 2*C 

#パラメータ設定
A1 <- c(3:-10, -10:10, 10:1, 1:10, 10:3)
B1 <- rep(3, length(A1))
C1 <- rep(3, length(A1))

B2 <- c(3:-10, -10:10, 10:1, 1:10, 10:3)
A2 <- rep(3, length(B2))
C2 <- rep(3, length(B2))

C3 <- c(3:-10, -10:10, 10:1, 1:10, 10:3)
A3 <- rep(3, length(C3))
B3 <- rep(3, length(C3))

#最終的なパラメータセット
A <- c(A1, A2, A3)
B <- c(B1, B2, B3)
C <- c(C1, C2, C3)

#アニメーション作成
animation::saveGIF({
for(n in seq_len(length(A))){
#n <- 1
#X軸
x <- seq(-15, 15, by=0.000002)

#Y軸
suppressWarnings(y1 <- (-B[n]*x + sqrt((B[n]*x)^2 -4*C[n]*(A[n]*x^2-1))) / 2*C[n])
suppressWarnings(y2 <- (-B[n]*x - sqrt((B[n]*x)^2 -4*C[n]*(A[n]*x^2-1))) / 2*C[n])

#NAを削除
x0 <- x[!is.na(y1)]
y1 <- y1[!is.na(y1)]
y2 <- y2[!is.na(y2)]

#作図
plot(x0, y1, type="n",
     xlab="x", ylab="y", cex.lab=1.5, cex.axis=1.5,
     xlim=c(min(x, na.rm = T), max(x, na.rm = T)),
     ylim=c(min(x, na.rm = T), max(x, na.rm = T)))
lines(x0, y1, type="l", lwd=0.1)
lines(x0, y2, type="l", lwd=0.1)
plotrix::boxed.labels(x = max(x, na.rm = T)*4/5, y = max(x, na.rm = T)*4/5, 
                labels = paste0(" A: ", formatC(A[n], width = 2, flag = " "), "\n", 
                                " B: ", formatC(B[n], width = 2, flag = " "), "\n",
                                " C: ", formatC(C[n], width = 2, flag = " ")),
                bg = "#b2f4f4c0", adj = 0.5, cex = 2)
plotrix::boxed.labels(x = max(x, na.rm = T)*-8/15, y = max(x, na.rm = T)*13/15, 
                labels = expression(A*x^2 + B*x*y + C*y^2 == 1),
                bg = "#fffafa", adj = 0.5, cex = 2)

}},  movie.name = paste0("Fig_02.gif"), interval = 0.2, dpi=200,
nmax = length(A), ani.width = 600, ani.height=600, ani.type="png")

f:id:skume:20210819030751g:plain:w500
斜め楕円の作図アニメーション

後書き

斜め楕円を作図するときに、 X軸のポイント数の設定に結構手間取った。 ポイントの刻みが少ないと楕円が切れたように見える。

参考資料

ja.wikipedia.org

examist.jp

oku.edu.mie-u.ac.jp

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/56.htmlcse.naro.affrc.go.jp

Macでのbz2形式への圧縮とbz2形式の解凍

.bz2について

bzip2では、 圧縮効率を良くするために、ブロックソート法などを用いている。 gzipやzipといったデータ圧縮に比べて、より高い圧縮率を示す。 また、bz2単独では、アーカイブ機能はない。

Macでは、bzip2コマンドでbzip2圧縮、 bunzip2コマンドでbzip2解凍ができる。

それでは、Macターミナルを立ち上げて始める。

bzip2コマンドによるbzip2圧縮

bzip2コマンドは、 1つのファイルあるいはファイルパスに対して実行する。

bzip2 -z [File]

オプション

  • -z: 圧縮を行う(デフォルトなので省略化)

また、フォルダの圧縮はできない

bzip2圧縮を行い、任意のファイル名で保存する場合

bzip2 -z [File] > xxxx.bz2

bunzip2コマンドによるbzip2解凍

「XXXX.bz2」を解凍する場合

bunzip2 XXXX.bz2  

#OR

bzip2 -d XXXX.bz2 > [File]

オプション

  • -d: 伸張を行う

また、元ファイルを残して、解凍する場合には、 -kオプションを付ける。

bunzip2 -k XXXX.bz2  

.tar.bz2について

bz2圧縮ではアーカイブ機能がないので、 tarを組み合わせてアーカイブ化する。

.tar.bz2とは、tarでアーカイブ化して、 bzip2圧縮することを意味する。

tarコマンドによるtar.bz2圧縮

「XXXX.tar.bz2」として、tar.bz2圧縮アーカイブ化する場合

tar -jcvf XXXX.tar.bz2 [File1] [File2] [File3]

#OR

tar -acvf XXXX.tar.bz2 [File1] [File2] [File3]

オプション

  • j: bzip2の意味

  • cvf: tarアーカイブ化

  • [File1] [File2] [File3]: 圧縮したいファイル(フォルダも可)

  • a: 拡張子による圧縮方式の自動判定

また、オプションの「-」は、tarの場合、省略できる。

tarコマンドで、フォルダごとの圧縮ができる

tarコマンドによるtar.bz2解凍

「XXXX.tar.bz2」をbz2解凍して、tarアーカイブを戻す場合

tar -jxvf xxxx.tar.bz2

#OR

tar -axvf xxxx.tar.bz2

オプション

  • j: bzip2の意味

  • xvf: tarアーカイブの解凍

  • a: 拡張子による解凍方式の自動判定

また、オプションの「-」は、tarの場合、省略できる。