そんなときは、離散値なら
scale_fill_grey()
scale_color_grey()
を使う。
デフォルトだと始めと終わりの値を決められない。
それは、
fill <- scale_fill_grey(start = 1, end = 0)
color <- scale_color_grey(start = 1, end = 0)
とすると、最初の値が白で、終わりが黒になり間はいい感じにグレースケールにしてくれる。
博士後期課程の雑記ブログ。 読んだ本、コンピューター系のメモ、愛猫の写真、勉強のこととか。
上記の通り、データの型変換についてのメモです。 棒グラフを作る時は、データの型がintegerとかだと、棒の位置がいい感じにならないので、データの型をcharacterにします。
データの型がintegerの場合と、charcterに直した時の場合のプロットを載せます。 ## 使うデータ 今回使うデータです。
普通にcsvファイルを読み込むと、Timeのところのデータ型がintegerになっていると思います。 これをcharacterに変えます。
read.csv("sample.csv")->yama #csvファイルを読み込み、yamaという名前で格納。
library(tidyverse)
## ─ Attaching packages ──────────────────── tidyverse 1.3.0 ─
## ✓ ggplot2 3.3.3 ✓ purrr 0.3.4
## ✓ tibble 3.1.0 ✓ dplyr 1.0.5
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.1
## ─ Conflicts ───────────────────── tidyverse_conflicts() ─
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
yama
## Genotype Time Curvature
## 1 WT 0 0
## 2 WT 0 0
## 3 WT 0 0
## 4 WT 0 0
## 5 WT 0 0
## 6 WT 2 20
## 7 WT 2 21
## 8 WT 2 22
## 9 WT 2 25
## 10 WT 2 18
## 11 WT 4 40
## 12 WT 4 42
## 13 WT 4 41
## 14 WT 4 47
## 15 WT 4 49
## 16 WT 8 80
## 17 WT 8 75
## 18 WT 8 90
## 19 WT 8 88
## 20 WT 8 82
## 21 mutant 0 0
## 22 mutant 0 0
## 23 mutant 0 0
## 24 mutant 0 0
## 25 mutant 0 0
## 26 mutant 2 10
## 27 mutant 2 5
## 28 mutant 2 4
## 29 mutant 2 19
## 30 mutant 2 12
## 31 mutant 4 16
## 32 mutant 4 20
## 33 mutant 4 23
## 34 mutant 4 25
## 35 mutant 4 20
## 36 mutant 8 29
## 37 mutant 8 20
## 38 mutant 8 22
## 39 mutant 8 21
## 40 mutant 8 15
sapply(yama, class)# yamaの中に含まれるデータの型を確認する
## Genotype Time Curvature
## "character" "integer" "integer"
#yamaのデータからGenotypeとTimeが同じデータにまとめる
#そのデータの中でCurvatureの平均と標準偏差、標準誤差を出す
group_time_mean_sd <-yama %>%
group_by(Genotype, Time) %>%
summarize(mean = mean(Curvature), sd = sd(Curvature), se = sd/sqrt(5))
## `summarise()` has grouped output by 'Genotype'. You can override using the `.groups` argument.
group_time_mean_sd
## # A tibble: 8 x 5
## # Groups: Genotype [2]
## Genotype Time mean sd se
## <chr> <int> <dbl> <dbl> <dbl>
## 1 mutant 0 0 0 0
## 2 mutant 2 10 6.04 2.70
## 3 mutant 4 20.8 3.42 1.53
## 4 mutant 8 21.4 5.03 2.25
## 5 WT 0 0 0 0
## 6 WT 2 21.2 2.59 1.16
## 7 WT 4 43.8 3.96 1.77
## 8 WT 8 83 6.08 2.72
最初に失敗例です。
x軸のデータがintegerだと以下のような残念なプロットになります。
read.csv("sample.csv")->yama #csvファイルを読み込み、yamaという名前で格納。
library(tidyverse)
library(reshape2)
#yamaのデータからGenotypeとTimeが同じデータにまとめる
#そのデータの中でCurvatureの平均と標準偏差、標準誤差を出す
group_time_mean_sd <-yama %>%
group_by(Genotype, Time) %>%
summarize(mean = mean(Curvature), sd = sd(Curvature), se = sd/sqrt(5))
## `summarise()` has grouped output by 'Genotype'. You can override using the `.groups` argument.
#group_time_mean_sdのデータセットに含まれるラベルGenotypeの表示順を指定順に並べ直す
group_time_mean_sd$Genotype <- factor(group_time_mean_sd$Genotype,
levels=c("WT", "mutant"))
#棒グラフを出力する
g <- ggplot(group_time_mean_sd, aes(x = Time,
y = mean,
fill = Genotype,
group = Genotype)
)
g <- g + geom_bar(stat = "identity",
position = position_dodge(width = 0.9)
)
#SEをエラーバーのつける
errors <- aes(ymax = mean + se, ymin = mean - se)
g <- g + geom_errorbar(errors, width = 0.1, position = position_dodge(width = 0.9))
#背景をclassicに
g <- g + theme_classic()
g <- g + theme(legend.position = c(0.2,0.8),#legendの位置指定
legend.title = element_blank(),#legendタイトルをなしに
axis.title.x = element_text(size = 20, family = "Arial"),
axis.title.y = element_text(size = 20, family = "Arial"),
axis.text.x = element_text(size = 20, colour = 1, family = "Arial"),
axis.text.y = element_text(size = 20, colour = 1, family = "Arial"),
legend.text = element_text(size = 10, color = "black",
face = c("italic")
)
)
g <- g + labs(y = "Curvature(degrees)", x = "Time(h)")
g <- g + scale_fill_grey()#グレースケールで出力
g
x軸のデータをcharacterにするために、read.csv(“sample.csv”,colClasses=c(“character”, “character”, “integer”))と打ちます。
読み込むcsvファイルのデータ中には、Genotype, Time, Curvatureという順でデータが並んでいるので、それぞれを“character”, “character”, "integerと設定します。
きちんと変換できているのかは、sapply(yama, class)で確認します。
read.csv("sample.csv",colClasses=c("character", "character", "integer"))->yama
sapply(yama, class)# yamaの中に含まれるデータの型を確認する
## Genotype Time Curvature
## "character" "character" "integer"
その結果が、以下のプロットです。 read.csv(“sample.csv”,colClasses=c(“character”, “character”, “integer”))->yama とした以外は、最初のプロットのコードと違いはありません。
Rの凡例の順序はデフォルトだとアルファベット順になっています。 この記事では、この凡例の順序をマニュアルでいじるやり方をメモしていきます。
library(tidyverse)
## ─ Attaching packages ──────────────────── tidyverse 1.3.0 ─
## ✓ ggplot2 3.3.3 ✓ purrr 0.3.4
## ✓ tibble 3.1.0 ✓ dplyr 1.0.5
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 1.4.0 ✓ forcats 0.5.1
## ─ Conflicts ───────────────────── tidyverse_conflicts() ─
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(reshape2)
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
今回は以下に示してあるsample.csvというcsvファイルに入っているデータを使います。 このcsvファイルはエクセル上で適当に数字を打って作りました。
read.csv("sample.csv")->yama #csvファイルを読み込み、yamaという名前で格納。
yama
## Genotype Time Curvature
## 1 WT 0 0
## 2 WT 0 0
## 3 WT 0 0
## 4 WT 0 0
## 5 WT 0 0
## 6 WT 2 20
## 7 WT 2 21
## 8 WT 2 22
## 9 WT 2 25
## 10 WT 2 18
## 11 WT 4 40
## 12 WT 4 42
## 13 WT 4 41
## 14 WT 4 47
## 15 WT 4 49
## 16 WT 8 80
## 17 WT 8 75
## 18 WT 8 90
## 19 WT 8 88
## 20 WT 8 82
## 21 mutant 0 0
## 22 mutant 0 0
## 23 mutant 0 0
## 24 mutant 0 0
## 25 mutant 0 0
## 26 mutant 2 10
## 27 mutant 2 5
## 28 mutant 2 4
## 29 mutant 2 19
## 30 mutant 2 12
## 31 mutant 4 16
## 32 mutant 4 20
## 33 mutant 4 23
## 34 mutant 4 25
## 35 mutant 4 20
## 36 mutant 8 29
## 37 mutant 8 20
## 38 mutant 8 22
## 39 mutant 8 21
## 40 mutant 8 15
上記のデータから、WTとmutantのデータの平均値とsd, seを時間ごとに求めます。 そのデータをgroup_time_mean_sdに格納します。
group_time_mean_sd <-yama %>%
group_by(Genotype, Time) %>%
summarize(mean = mean(Curvature), sd = sd(Curvature), se = sd/sqrt(5))
## `summarise()` has grouped output by 'Genotype'. You can override using the `.groups` argument.
group_time_mean_sd
## # A tibble: 8 x 5
## # Groups: Genotype [2]
## Genotype Time mean sd se
## <chr> <int> <dbl> <dbl> <dbl>
## 1 mutant 0 0 0 0
## 2 mutant 2 10 6.04 2.70
## 3 mutant 4 20.8 3.42 1.53
## 4 mutant 8 21.4 5.03 2.25
## 5 WT 0 0 0 0
## 6 WT 2 21.2 2.59 1.16
## 7 WT 4 43.8 3.96 1.77
## 8 WT 8 83 6.08 2.72
group_time_mean_sdから、WTとmutantのCurvatureの経時変化を折れ線グラフにプロットします。 デフォルトのプロットだとこんな感じで、mutant, WTの順に凡例が出力されます。
g <- ggplot(group_time_mean_sd, aes(x = Time,#x軸をTimeに
y = mean,
shape = Genotype,
group = Genotype,
linetype = Genotype,
color = Genotype) #y軸をCurvatureに
)
g <- g + scale_x_continuous(breaks = seq(0,8,2))#y軸の値を(最小値,最大値,間隔)で指定
g <- g + geom_line()
g <- g + geom_point(size = 4)
errors <- aes(ymax = mean + se, ymin = mean - se)
g <- g + geom_errorbar(errors, width = 0.1)
g <- g + theme_classic()#背景をclassicに
g <- g + theme(legend.position = c(0.2,0.8),#legendの位置指定
legend.title = element_blank(),#legendタイトルをなしに
axis.title.x = element_text(size = 18, family = "Arial"),
axis.title.y = element_text(size = 18, family = "Arial"),
axis.text.x = element_text(size = 15, colour = 1, family = "Arial"),
axis.text.y = element_text(size = 15, colour = 1, family = "Arial"),
)
g <- g + xlab("Time (h)")
g
以下のコードが凡例の順番をいじるのに効いてます。
group_time_mean_sd$Genotype <- factor(group_time_mean_sd$Genotype,
levels=c("WT", "mutant"))
それを含めてプロットすると凡例がWT, mutantの順になります。
group_time_mean_sd$Genotype <- factor(group_time_mean_sd$Genotype,
levels=c("WT", "mutant"))
g <- ggplot(group_time_mean_sd, aes(x = Time,#x軸をTimeに
y = mean,
shape = Genotype,
group = Genotype,
linetype = Genotype,
color = Genotype) #y軸をCurvatureに
)
g <- g + scale_x_continuous(breaks = seq(0,8,2))#y軸の値を(最小値,最大値,間隔)で指定
g <- g + geom_line()
g <- g + geom_point(size = 4)
errors <- aes(ymax = mean + se, ymin = mean - se)
g <- g + geom_errorbar(errors, width = 0.1)
g <- g + theme_classic()#背景をclassicに
g <- g + theme(legend.position = c(0.2,0.8),#legendの位置指定
legend.title = element_blank(),#legendタイトルをなしに
axis.title.x = element_text(size = 18, family = "Arial"),
axis.title.y = element_text(size = 18, family = "Arial"),
axis.text.x = element_text(size = 15, colour = 1, family = "Arial"),
axis.text.y = element_text(size = 15, colour = 1, family = "Arial"),
)
g <- g + xlab("Time (h)")
g
Rでプロットするためには以下みたいにデータをまとめないといけない。 catだと以下のように、1つ目と2つ目のファイルをまとめる時に被ってしまう。 以下はターミナルに打ち込んだときの結果。
cat *.csv
Genotype,Time,Curvature
A,0h,0
A,12h,10
A,24h,20
A,36h,30
A,48h,40
B,0h,0
B,12h,5
B,24h,10
B,36h,15
B,48h,20
C,0h,0
C,12h,3
C,24h,12
C,36h,19
C,48h,24
D,0h,0
D,12h,19
D,24h,24
D,36h,34
D,48h,40A,0h,0 #ここで被ってる
A,12h,10
A,24h,20
A,36h,30
A,48h,40
B,0h,0
B,12h,5
B,24h,10
B,36h,15
B,48h,20
C,0h,0
C,12h,3
C,24h,12
C,36h,19
C,48h,24
D,0h,0
D,12h,19
D,24h,24
D,36h,34
D,48h,40%
これを回避するためにはawk 1を使う。
awk 1 *.csv
Genotype,Time,Curvature
A,0h,0
A,12h,10
A,24h,20
A,36h,30
A,48h,40
B,0h,0
B,12h,5
B,24h,10
B,36h,15
B,48h,20
C,0h,0
C,12h,3
C,24h,12
C,36h,19
C,48h,24
D,0h,0
D,12h,19
D,24h,24
D,36h,34
D,48h,40
A,0h,0
A,12h,10
A,24h,20
A,36h,30
A,48h,40
B,0h,0
B,12h,5
B,24h,10
B,36h,15
B,48h,20
C,0h,0
C,12h,3
C,24h,12
C,36h,19
C,48h,24
D,0h,0
D,12h,19
D,24h,24
D,36h,34
D,48h,40
read.csv("0414270504.csv")->yama #csvファイルを読み込み、yamaという名前で格納。
library(tidyverse)
library(reshape2)
g <- ggplot(yama, aes(x = Time,#x軸をTimeに
y = Curvature, #y軸をCurvatureに
color = Genotype))#Genotypeごとに色分けする
g <- g + geom_boxplot(position = position_dodge(width = 0.9))#箱ひげ図でGenotypeを時間ごとに並べる
g <- g + theme_classic()#背景をclassicに
g <- g + theme(legend.position = c(0.15,0.8),#legendの位置指定
legend.title = element_blank()) #legendタイトルをなしに
g <- g + scale_y_continuous(breaks = seq(-40,60,20))#y軸の値を(最小値,最大値,間隔)で指定
g <- g + stat_summary(position = position_dodge(width = 0.9),
fun = "mean",#平均値を載せる
geom = "point",#funで指定された値をpointでプロット
shape = 22,#形を22(四角)
size = 2.,#プロットのサイズ
fill = "white")#プロットの色
g <- g + geom_point(position = position_dodge(width = 0.9),#散布図を箱ヒゲ図に重ねる
alpha=0.3,#透明度
size=1)#幅
g
こんな感じで出来上がり