ggplot2の備忘録

毎回,グラフを作るときに忘れてしまうので,メモとして書き残しておこう。

まずは,サンプルデータで,基本的な折れ線グラフを書く。

library(ggplot2)
data.frame(day = 1:10, access =c(1,2,4,6,8,10,12,14,16,18))
ggplot(dat,aes(x=day, y=access))+geom_line()

見た目の変更1

ggplot(dat,aes(x=day, y=access))+geom_line()+ylim(0,30)+xlim(0,10)+labs(x="日付", y="アクセス数", title="アクセス記録分析")+theme_bw()

見た目の変更2

ggplot(dat, aes(x=day, y=access)) + geom_line()+ylim(0,30)+xlim(0,10)+labs(x="日付", y="アクセス数", title="アクセス記録分析")+theme_bw()+theme(panel.grid.major = element_line(colour = "#AAAAAA"), text=element_text(size=12, family="mincho"), axis.text.x = element_text(size=12),axis.text.y = element_text(size=12))

ポイント

theme(panel.grid.major = element_line(colour = “#AAAAAA”), text=element_text(size=12, family=”mincho”), axis.text.x = element_text(size=12),axis.text.y = element_text(size=12))

theme(panel.grid.major = element_line(colour = "#AAAAAA"), #補助線の目盛りのある方(major)の色を少し濃い目のグレーにする
text=element_text(size=12, family="mincho"), #図に中の文字フォントのサイズとフォントを変更
axis.text.x = element_text(size=12),#x軸の目盛りの数字を大きく
axis.text.y = element_text(size=12))#y軸の目盛りの数字を大きく

集計データを使って信頼区間付きのグラフを描く

タイトル通りで、95%信頼区間付きのグラフを描くのだけれど、今回は、集計したデータが手元にあって、それをggplot2を用いてグラフにする。エラーバーとかも同じ方法でよい…と言うか、エラーバーを95%信頼区間にしているだけ。

データとして、以下のような感じで平均点と[95%信頼区間]が与えられているとする。

  事前テスト平均点 事後テスト平均点
A群 30 [28, 32] 40 [38,42]
B群 50 [48, 52] 65 [63, 67]
C群 70 [68, 72] 85 [83, 87]

 

まずは、データの読み込み

x = data.frame (
time =c(1,2,1,2,1,2), #事前と事後
group =c("A", "A", "B", "B", "C", "C"),#群
means =c (30, 40, 50, 65, 70, 85),#平均点
lower =c (28, 38, 48, 63, 68, 83),#信頼区間の上限
upper =c (32, 42, 52, 67, 72, 87) #信頼区間の下限
)

それをグラフにする。

g = ggplot(x, aes(x = time, y = means, group = group))+ #データの読み込み
geom_line(aes(linetype=group),size=1)+ #折れ線グラフの作成。線種は群ごと。
geom_point(aes(shape=group),size=3)+ #折れ線の先に印を付ける。印の種類は群ごと
scale_x_continuous(breaks=seq(1,2,1), labels= c("事前", "事後")) + #x目盛りの制御
ylim(0,100) + #y軸の範囲指定
scale_linetype_manual(values=c("solid","twodash", "dotted")) + #線種の指定
theme_classic() + #全体のテーマ
geom_errorbar(aes(ymin = lower, ymax = upper,linetype=group), width = 0.8, size =1,) #信頼区間の付加

それを描画する。

plot(g)

リッカートスケールで得たアンケート・データの視覚化:likert Package + HH package (その2)

以前のブログ記事で,likert packageを使った視覚化について書いたけれど,今度はHH packageも使う方法。データとしては以前と同じ,以下のイメージ。質問項目は,Q1からQ5まであって,例えば,1が「全く良くない」で,5が「とても良い」のような5件法だとする。データのcsvはこちら

Q1Q2Q5
145
533
….
library(HH)
library(likert)
library(plyr)
dat=read.csv("likert_test.csv", header= T) #データの読み込み
  dat2=data.frame(lapply(dat, factor, levels=1:5)) 
#datの中身をfactor(文字列)に変換。その際に,五件法なので範囲を1から5までとする。つまり,ある設問への反応として1が含まれていない場合などでも,1が0回とするための処置。その上で,データ・フレームにする
  HH::plot.likert(  #HHでPlotを出す
  likert::likert(dat2), #likert packageで集計する
  col=rev(grey(seq(0,1,0.25))), #1を白,5を黒,中間がグレーの指定。revをしているので,これを外すと5が黒,1が白。また,1から5段階なので,0.25ずつグラデーションにする。
  main ="TEST1" タイトルはTEST1とする
  )

Itemの順番がQ5からQ1になっているのが気になるのと,1が白字なので,枠線がないと見えない。これらを解消。

HH::plot.likert(
  likert::likert(dat2),
  col=rev(grey(seq(0,1,0.25))),
  main ="TEST2", 
  reverse=F,  #Itemの順番を上からQ1の順に
  border = c("#111111", "#111111", "#111111", "#111111", "#111111") #グラフの周りを黒枠で囲む
  )

グラフの中に%で数値を入れたい。

以下のFunctionはStakFlowのこちらの答えから引用し,変更したもの。グラフ内に数値%を表示する。

myPanelFunc = function(...){
  panel.likert(...)
  vals <- list(...)
  DF <- data.frame(x=vals$x, y=vals$y, groups=vals$groups)
  
  ### some convoluted calculations here...
  grps <- as.character(DF$groups)
  for(i in 1:length(origNames)){
    grps <- sub(paste0('^',origNames[i]),i,grps)
  }
  
  DF <- DF[order(DF$y,grps),]
  
  DF$correctX <- ave(DF$x,DF$y,FUN=function(x){
    x[x < 0] <- rev(cumsum(rev(x[x < 0]))) - x[x < 0]/2
    x[x > 0] <- cumsum(x[x > 0]) - x[x > 0]/2
return(x)
}) subs <- sub(' Positive ,'',DF$groups) collapse <- subs[-1] == subs[-length(subs)] & DF$y[-1] == DF$y[-length(DF$y)] DF$abs <- abs(DF$x) DF$abs[c(collapse,FALSE)] <- DF$abs[c(collapse,FALSE)] + DF$abs[c(FALSE,collapse)] DF$correctX[c(collapse,FALSE)] <- 0 DF <- DF[c(TRUE,!collapse),] DF$perc <- round(ave(DF$abs,DF$y,FUN=function(x){x/sum(x) * 100})) ### panel.text(x=DF$correctX, y=DF$y, label=paste0(DF$perc,'%'), cex=1.0,col=c("black","black","black","white","white")) } #ここは数値と%の表示色を決める。今回は白字とグレーと黒なので,それに合わせて変更している。

以下がPackageを使用したスクリプト

origNames=rownames(dat) #Functionで使うデータの定義
HH::plot.likert(
  likert::likert(dat2), 
  col=rev(grey(seq(0,1,0.25))),
  main ="TEST3", 
  reverse=F, 
  border = c("#111111", "#111111", "#111111", "#111111", "#111111"), 
 panel =myPanelFunc #上で定義したFunctionを使う。
 )

リッカートスケールで得たアンケート・データの視覚化:likert package (その1)

Google formでアンケートデータを取ることが増えているので,その視覚化のための備忘録。使うパッケージはlikert
データとしては,以下のイメージ。質問項目は,Q1からQ5まであって,例えば,1が「全く良くない」で,5が「とても良い」のような5件法だとする。

Q1 Q2 Q5
1 4 5
5 3 3
….
library(likert)
library(plyr)

dat=read.csv("likert_test.csv",na.strings=c("", "NULL")) #データの読み込み。実際のデータでは,空白,つまり無回答ということもあるので,空白をNAと判定させる。
dat2 <- data.frame(lapply(dat, factor, levels=1:5)) #datの中身をfactor(文字列)に変換。その際に,五件法なので範囲を1から5までとする。つまり,ある設問への反応として1が含まれていない場合などでも,1が0回とするための処置。その上で,データ・フレームにする。
dat2 <- na.omit(dat2) #念のため,NAデータを削除

dat3 <- likert(dat2) #各設問への反応をまとめる
likert.bar.plot(dat3, #対象データファイル
        ordered=FALSE, #反応の順番。1から5の順。
        group.order=c("Q1","Q2","Q3","Q4","Q5"), #今回の場合,指定しないと反応1が少ない順に並べられる。ここでの指定では,Q1からQ5への並べる 
        plot.percent.high=FALSE,#指定しないと,高い反応(4と5)の割合(%)を表示
        plot.percent.low=FALSE, #指定しないと,低い反応(1と2)の割合(%)を表示
        plot.percent.neutral=FALSE, #指定しないと,中間の反応(3)の割合(%)を表示
        plot.percent=TRUE #指定すると,各反応の割合を表示
)
+theme_bw() #プロットの背景色などのスタイルを指定。今回は白黒。
+theme(legend.position = "bottom", #凡例をプロットの下に表示。
legend.direction = "horizontal" #水平に配置。
)

Radar Chartを描く(plotrix) その3

備忘録その3ですが,その2の落穂拾い。凡例をつけて見やすくする。なので,データ例は,その2と同じ。

library(dplyr)
library(plotrix)

dat=read.csv("test2.csv") #データ読み込み

dat2 = dat %>% #datを対象とした以下の処理をして,それをdat2へ入れる
   gather(Section_Year,Score, -ID) %>% #縦長のデータにする。Section_Yearという新しい変数を作り,SectionX_20xxデータを並べる。Scoreはの横に配置。IDは入れない。
   separate(col="Section_Year", sep="_", into=c("Section", "Year"))%>% #Section_Yearを_を区切りに分けて,SectionとYearを別々の列とする 
   group_by(Section,Year) %>% #SectionとYearでグループ化する
   summarize(mean=mean(Score)) %>%  #Scoreの平均を出す
   spread(Section, mean) #横向きデータに変更

 dat3 = select_if(dat2, is.numeric) #数値しか入れられないので,数値以外は削除。

 radial.plot(dat3, #データ入力
       rp.type = "p",  #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
       start = pi/2, #グラフを始める位置。Section1を12時にする。
       radial.lim=c(40,60), #軸の範囲。
       labels=colnames(dat3), #項目名
       line.col=1:2, #線の色。ここでは1(黒)と2(赤)。
       lwd=2, #線の太さ。
       lty=1:2 #線の種類。ここでは1(実線)と2(点線)。
              show.grid.labels =FALSE #軸のラベル(数値)が邪魔な場合はFALSEで表示させない。

)
legend("bottomright", #表示させる位置
    legend=c("2016", "2017"), #表示させるもの 
    col=1:2, #線の色(グラフ本体と合わせる)
    lty=1:2  #線のスタイル(グラフ本体と合わせる)
)

Radar Chartを描く(plotrix) その2

備忘録その2。よくもらうデータのタイプとしては,以下のようなものもある。

ID Section1_2016 Section4_2016 Section4_2017
1 49 71 8
2 98 28 5
3 55 51 30
4 91 2 47
5 60 20 56
30 90 17 44
library(dplyr)
library(tidyverse)
library(plotrix)

dat=read.csv("test2.csv") #データ読み込み

dat2 = dat %>% #datを対象とした以下の処理をして,それをdat2へ入れる
      gather(Section_Year,Score, -ID) %>% #縦長のデータにする。Section_Yearという新しい変数を作り,SectionX_20xxデータを並べる。Scoreはの横に配置。IDは入れない。
      separate(col="Section_Year", sep="_", into=c("Section", "Year"))%>% #Section_Yearを_を区切りに分けて,SectionとYearを別々の列とする 
      group_by(Section,Year) %>% #SectionとYearでグループ化する
      summarize(mean=mean(Score)) %>%  #Scoreの平均を出す
      spread(Section, mean) #横向きデータに変更
 
dat3 = select_if(dat2, is.numeric) #数値しか入れられないので,数値以外は削除。

radial.plot(dat3, #データ入力
     rp.type = "p",  #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
     start = pi/2, #グラフを始める位置。Section1を12時にする。
     radial.lim=c(40,60), #軸の範囲。
     labels=colnames(dat3), #項目名
     line.col=1:2, #線の色。ここでは1(黒)と2(赤)。
     lwd=2, #線の太さ。
     lty=1:2 #線の種類。ここでは1(実線)と2(点線)。
)

うーん、もっとスマートな整形の仕方はないものか。

Radar Chartを描く(plotrix) その1

Radar Chartを描く方法をいくつか試したので、備忘録的に書いておく。
今回は,plotrixを使用した。

データとしては、個人的にエクセルでもらうことの多い、以下のような形式。ファイル名は取り合えず、test.csvとしておく。

ID Section1 Section2 Section3 Section4
1 40 30 50 79
2 72 65 24 77
3 24 15 10 31
30 26 14 97 53

 

library(dplyr)
library(plotrix)

dat=read.csv("test.csv")
dat$ID=as.factor(dat$ID) #IDはfactorに変換

dat2=dat %>% summarize_if(is.numeric, funs(mean)) #dplyrのsummarizeで、numericの列だけ平均を出す。

radial.plot(dat2, #データの入力
     rp.type="p", #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
     start = pi/2, #グラフを始める位置。Section1を12時にする。
     radial.lim = c(50,56), #軸の範囲。
     labels = colnames(dat2), #項目名
     clockwise = TRUE #時計回りに表示
)