【R言語】動くグラフをggplot2で作ってみたよ
こんにちは。プログラミングを今年の2月から勉強し始めて早くも5ヶ月が経とうとしています。
私自身は生命科学系の研究者なので、日々の実験データの解析の質を論文レベルにすべくR言語を勉強し始めました。
せっかくnoteをやっていて、毎日更新している「日日是勉強」マガジンのPVや記事数の変動のグラフを描いてみたいと思い立って、一週間かけて動くグラフを描いてみました。
思い立った時のnoteの記事はこちら↓
PVの数と記事の数に相関があるのかどうか?をグラフで示してみようと思います。
「日日是勉強」マガジンは5つのカテゴリー分けをして記事を書いています。この5つのカテゴリーごとの記事の全記事に対する割合と、獲得したPVの割合の相関を見てみます。
作ったグラフはこちら。1週間ごとの変化をグラフをgifにしました。
一週間かけて書いたRのコードを少しご紹介したいと思います。
CSVファイルを読み込んでデータを作る
色々調べながら書いたので、参考にしたサイトは数えきれないくらい。
「動くグラフがggplot2で描けるんだ!よしやってみよう!」と後押ししてしてくれたのは、こちらのサイトです。
さて、生データをCSVファイルをRStudio Cloudに移動させてコードを書いてみようと思います。元々のデータはこんな感じ。(生データです)
このデータから、動くggplolt2を作っていくためのデータを作っていきます。
目指すデータの形は、
catは「カテゴリー」、psumは「全体のPVに対する各カテゴリーの獲得したPVの割合」、pcountは「全体の記事に対する各カテゴリーの記事の割合」、weekは「何週目か」、corは「PVの割合と記事の割合との相関係数(ピアソンの相関係数)」、Catは「カテゴリーを英語にしたもの」です。(RStudio Cloudは日本語だと文字化けしてしまうので...)
やったことは、
・元のデータから不要なものを削除する
・PVの割合と記事の割合、相関係数を計算した列を挿入する
・カテゴリーを英語にしたものを挿入する
もう、dplyrさまさまでした。
####load the data####
data<-read.csv("20200802_note.csv", header=T, skip=1, sep=",")
#create analysis data frame
library(dplyr)
#不要な列を削除する
data1<- data %>%
select (-投稿日, -タイトル)
#PVの割合と記事の割合、相関係数を計算した列を挿入する
data.list<- list()
for (i in 1:(ncol(data1)-1)){
cat<- data1[,1]
d1<- data1[,i+1]
df<- data.frame(cat=cat, pv=d1)
df<- df %>%
tidyr::drop_na() %>%
dplyr::group_by(cat) %>%
dplyr::summarise(sum=sum(pv), count=n())
as<- as.numeric(sum(df$sum))
ac<- as.numeric(sum(df$count))
df <- df %>%
mutate(psum= sum/as, pcount=count/ac, week=i) %>%
select(-sum, -count)
r<- cor(df$psum, df$pcount) #Pearson product-moment correlation coefficient
df <- df %>%
mutate(cor=r)
data.list[[i]]<-df
}
data2<- do.call(rbind, data.list)
#カテゴリーを英語表記にした列を挿入する
data2 <- data2 %>%
mutate(Cat=if_else(cat=="はじめて会った言葉たち", "words",
if_else(cat=="子どもとの学び", "kids",
if_else(cat=="科学の学び", "science",
if_else(cat=="自分を知る", "life","art")))))
ggplot2でグラフを動かす”gganimate”をインストールして使ってみる
ggolot2で描いたグラフを動かすパッケージが”gganimate”。CRANのパッケージなので、”install.packages()”でインストールできます。GitHubのページもあります。
今現在、”gganimate”を使ったコードを公開して下さっている方々はアップデート前のもののコードなのでそのままコピペして使用するとエラーが出てしまいます。
GitHubでどういう風にコードを書けば良いのか載っていたので、それを参考にコードを書きました。
library(gganimate)
library(ggplot2)
library(gifski)
test<- ggplot(data2)+
geom_point(aes(x=pcount, y=psum, color=Cat),
size=5)+
geom_label(aes(x=pcount, y=psum ,label=Cat),
hjust = 0, nudge_x = 0.01)+
geom_text(aes(x=0.05, y=0.6, label=paste0("r=",as.character(round(cor,digits = 4)))),
size=10,
hjust=0,
color="gray")+
scale_y_continuous(expand = c(0,0))+
scale_color_manual(values=c("#CC4125","#FFD966","#6AA84F","#B4A7D6","#C27BA0"),
name="Category")+
theme_bw()+
# gganimate specific bits:
labs(title = 'week: {frame_time}', x = 'PV (%)', y = 'article number (%)') +
transition_time(week) +
ease_aes('cubic-in-out')
# Save at gif:
anim_save("20200802_note.gif", animation=last_animation())
一週間、色々調べてエラーがいっぱい出て大変だったので一記事にしてしまうのはかなりもったいない試行錯誤の積み重ねだったのですが...
一つ一つの試行錯誤を記事にしていると時間がかかってしまうので、今回は一気にコードを公開してしまいました。
早速明日のまとめ記事にも使ってみようと思います。
それでは、また!
最後までお読みいただきありがとうございます。よろしければ「スキ」していただけると嬉しいです。 いただいたサポートはNGS解析をするための個人用Macを買うのに使いたいと思います。これからもRの勉強過程やワーママ研究者目線のリアルな現実を発信していきます。