ggplot reference
dataframeを準備
異なる種類のデータを統合するときはこのdata frame作成時にやる。
カラム名がggplot()内部での変数名となるので、注意!
df <- data.frame(
i=as.vector(cov),
c=as.vector(mapply(func,delta,watermark[1],watermark[2],watermark[3],watermark[4],watermark[5],watermark[6],watermark[7])),
t=as.Date(index(cov)))
ggplot作成の第一歩
データフレームおよび基礎データの指定
データとして使用するデータフレームを指定する。
aes()でいろいろな見た目パラメータを指定する。ここではfillで塗りつぶし色を決定する基準を指定している。
離散量で指定したいときはfactor()を使用する。
その中で順序を指定したい時はlevels パラメターを使用する。そこでoriginalが取りうる値とその相互の順序を指定する。
xlables <- factor(original,levels=c("2-F--64", "2-F-65-", "2-M--64", "2-M-65-", "2-U--64", "2-U-65-", "2-U-UNK","1-F--64", "1-F-65-", "1-M--64", "1-M-65-", "1-M-UNK", "1-U--64", "1-U-65-", "1-U-UNK"))
連続量を使うときはnumericなどの型のデータをそのまま指定すれば良い。
y軸と違いx軸は大概の場合、常に共通なので、aes(x=<column name of data frame>) を使ってここで指定すると良い。
以降はオブジェクト p に対して更新を行う。
p <- ggplot(df, aes(x=i,fill=factor(c)))
グラフの種類およびyデータの指定
ぞれぞれ棒グラフの作成、分散図の作成、線グラフの作成する。
aes(y=<column name of data fram>,,,)の形でデータフレームのカラム名のうち適当なものをy軸のデータとして指定する。
色を付けたい場合はaes(fill=<column name of data frame>)などとする。
geom_segment()は任意の2つの座標の間に線分を引く
p <- p + geom_bar(aes(y=r),stat = "identity",fill='pink',colour="black") # need identity to draw value itself.
p <- p + geom_point(aes(y=i),stat="identity", position="identity",colour="green",size=0.8)
p <- p + geom_path(aes(y=i),stat="identity", position="identity",colour="black",linetype="dotted")
p <- p + geom_segment(x=as.Date("1985-01-01"),y=log(168),xend=as.Date("2019-09-01"),yend=log(3000),color='white',size=0.02,linetype=2)
棒グラフに色をつけたい場合。
この例ではfillとcolor(colour)双方をつかっている。詳細はscale_color_brewer()とscale_fill_brewer()で追加の設定を行う。
p <- p + geom_bar(aes(y=r,fill=clidelta),stat = "identity",colour="black") # need identity to draw value itself.
p <- p + geom_point(mapping=aes(y=i,colour=clidelta),stat="identity", position="identity",size=0.8)
色指定したいデータについて使用するパレットとそれぞれの色値に対する説明を入力する。fillの場合はこのscale_fill_brewer()を使う。 scale_fill_discrete()とかscale_colour_discrete()あるがよくわからないことがまだ多いので、注意して使うこと。
legendlable <- c(paste("more than ",as.character(round(watermark,digits=2)),sep=""),"Less than above","NA")
p <- p +scale_fill_brewer(palette="Spectral",na.value = "grey50",name = "CLI Delta", labels = legendlable)
ヒストグラムの色々
目的に応じて、"identity","stack","fill" それぞれのパラメータを指定する。
ヒストグラムのx軸に連続量を指定する場合、離散量を指定する場合で結果が全く異なるので注意すること。
p <- p + geom_histogram(aes(fill=sign),position = "identity", alpha = 0.3,bins=120)
p <- p + geom_histogram(bins=50,position = "fill", alpha = 0.9)
p <- p + geom_histogram(bins=80,position = "stack", alpha = 0.9)
X軸の間隔指定
Date型のときに使用する。
p <- p + scale_x_date(date_breaks = "2 year", date_labels = "%Y")
時間量に応じてグラデーションで色を変えたいときに使用する。
p <- p + scale_fill_date(low = "green3" , high = "darkgreen")
グラフを重ねて書きたい場合
最初にNULLでggplotオブジェクトを作成しそこに順次各種グラフを追加していく。
p <- ggplot(NULL)
df <- data.frame(
t=last(index(tokyo_death),length_graph),
value=last(tokyo_death[,1],length_graph))
p <- g+geom_bar(data=df, aes(x = t, y = value),stat = "identity",alpha=0.5,colour="red",fill="red")
df <- data.frame(t=last(index(v),length_graph), value=last(mapply(func,v[,1],v[,2],v[,3],v[,4],v[,5],v[,6],v[,7],v[,8]),length_graph))
p <- g+geom_line(data=df, aes(x = t, y = value))
plot(g)
タイトルおよび凡例
全体タイトルとレジェンドのタイトルを指定する。共通なタイトルを指定するとレジェンドを一つに統合できる。一方、パレットを使用しないスケールの場合はhueを指定する。
p <- p + labs(title = "SPX + Theory + Residual + CLI Delta",fill="CLI Delta",colour = "CLI Delta")
p <- p + scale_color_brewer(palette="Spectral",na.value = "black",name = "CLI Delta", labels = c("High","mid High","mid Low","Low","NA"))
p <- p + scale_fill_brewer(palette="Spectral",na.value = "black",name = "CLI Delta", labels = c("High","mid High","mid Low","Low","NA"))
p <- p + scale_fill_hue(name='regions')
任意の線を引く
水平線を引く。
p <- p + geom_vline(xintercept=seq(as.Date(paste(substr(index(head(spx_mean,1)),1,7),"-01",sep="")),as.Date("2019-01-01"),by='years'), colour="white",size=0.4,alpha=0.5)
垂直線を引く。
p <- p + geom_vline(xintercept=seq(as.Date(paste(substr(index(head(spx_mean,1)),1,7),"-01",sep="")),as.Date("2019-01-01"),by='years'), colour="white",size=0.4,alpha=0.5)
任意の直線を引く
p <- p + geom_segment(x=as.Date("1985-01-01"),y=log(168),xend=as.Date("2019-09-01"),yend=log(3000),color='white',size=0.02,linetype=2)
回帰線
p <- p + stat_smooth(aes(x=t,y=i),method="loess",color='white',size=0.3)
テーマ
x-y軸のタイトル消去
p <- p + theme(axis.title.x=element_blank(),axis.title.y=element_blank())
台紙の色指定
p <- p + theme(rect = element_rect(fill = "grey88",
colour = "black",
size = 0,
linetype = 1))
パネルの色指定およびグリッドの消去
p <- p + theme(panel.background = element_rect(fill = "grey88",
colour = "lightblue"),
panel.grid = element_blank())
その他
コメント入力
p <- p + annotate("text",label=as.character(s),x=as.Date("2000-01-01"), y=log(s*1.03),colour='white')
未検証
p <- p + theme(axis.text = element_text(colour = "red", size = rel(1.5)))
パレットの検証
library(RColorBrewer)
display.brewer.all()
過去に使用した関数
p <- p + geom_bar
p <- p + geom_path
p <- p + labs
p <- p + scale_fill_date
p <- p + scale_x_date
p <- p + geom_bar
p <- p + geom_histogram
p <- p + geom_hline
p <- p + geom_path
p <- p + geom_point
p <- p + geom_vline
p <- p + labs
p <- p + scale_color_brewer
p <- p + scale_fill_brewer
p <- p + scale_x_date
p <- p + theme
p <- p + scale_fill_hue
日本語を使う
df <- data.frame(case_per_capita=as.vector(apply(mdf[,-48],2,sum) / pref_db$x2017),pop_density=pref_db$x2017/pref_db$size,sign=pref_db$x2017,r=pref_db[,1])
x1 <- df[,2]
y1 <- df[,1]
df <- cbind(df,lm=predict(nls(y1~a*x1^(1/4)+b,start=c(a=1,b=1),trace=TRUE)))
p <- ggplot(df, aes(x=pop_density))
p <- p + xlab("人口密度") + ylab("人口あたり件数") # 日本語
p <- p + geom_point(aes(y=case_per_capita,size=sign,color=r),alpha=1)
p <- p+annotate("text",label=pref_db[,1],x=df[,2], y=df[,1]+0.1,colour='black',family = "HiraKakuProN-W3",size=3) # 日本語
p <- p + geom_line(aes(y=lm))
p <- p + theme_gray (base_family = "HiraKakuPro-W3") # 日本語
p <- p + scale_color_hue(name="都道府県",labels=pref_db[,1]) # 日本語
p <- p + guides(size = guide_legend(title="人口")) # 日本語
# don't forget to set "color=". otherwise fails to show up.
p <- p + geom_smooth(aes(x=pop_density,y=case_per_capita),method = "lm",se=F,color="red",size=0.5)
plot(p)
JSON ファイルの使用
curl <- "https://vrs-data.cio.go.jp/vaccination/opendata/latest/prefecture.ndjson"
cdestfile <- "~/R/R2/covid/prefecture.ndjson"
download.file(curl,cdestfile)
js <- jsonlite::stream_in(gzfile(cdestfile) )
last(js)