アキタの雑記

博士後期課程の雑記ブログ。 読んだ本、コンピューター系のメモ、愛猫の写真、勉強のこととか。

カテゴリ:computer > R

濃度を振って薬剤処理をした実験のデータをグラフにした時にグレースケールを使って、薬剤なし(mock)を白に、一番濃い濃度のものを黒にしたい。

そんなときは、離散値なら
scale_fill_grey()
scale_color_grey()
を使う。
デフォルトだと始めと終わりの値を決められない。

それは、
fill <- scale_fill_grey(start = 1, end = 0)
color <- scale_color_grey(start = 1, end = 0)

とすると、最初の値が白で、終わりが黒になり間はいい感じにグレースケールにしてくれる。

ggplot2で棒グラフを作る時はx軸のデータをcharacterにしとく

ggplot2で棒グラフを作る時はx軸のデータをcharacterにしとく

上記の通り、データの型変換についてのメモです。 棒グラフを作る時は、データの型が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だと

最初に失敗例です。

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
plot_box

x軸のデータをcharacterにすると

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 とした以外は、最初のプロットのコードと違いはありません。

barplot

目的:グラフの凡例の順序をマニュアルでいじる

Rの凡例の順序はデフォルトだとアルファベット順になっています。 この記事では、この凡例の順序をマニュアルでいじるやり方をメモしていきます。

libraryの読み込み

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 
m_WT

凡例の順番をいじった折れ線グラフの出力

以下のコードが凡例の順番をいじるのに効いてます。

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
WT_m

ggplot2を使ったboxplotと散布図を重ねたグラフを作る

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
こんな感じで出来上がり
bitmap

↑このページのトップヘ