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