犬猫動物病院数の推移

犬猫の動物病院の数は、どこの都道府県でも増加傾向にあるようです。

動物病院の登録数は、以下の農林水産省ホームページで公開されています。

https://www.maff.go.jp/j/tokei/kouhyou/animal/

動物病院数を都道府県別に表示し、さらに年ごとに表示して推移を把握したいと思いました。どこかでグラフのアニメーションで、年が変わるとバーチャートの順位が変わるのを見かけたました。どうやったらいいか、調べたところ以下のサイトで実装方法が書かれていました。

R-bloggers – How to create Bar Race Animation Charts in R

これに沿って、Rで実行したところ、以下のようなグラフを作成することができました。tidyverseとgganimateというパッケージを使います。gganimateをインストールした際に追加でgifskiというパッケージをインストールして使えるようになりました。


産業動物診療所は、北海道以外少なくなっていることがわかります。

私の用意したデータは以下のような形をしています。

コードは以下に乗せておきます。

library(tidyverse)
library(reshape2)
library(stringr)
library(gganimate)
library(doParallel)
cl <- makePSOCKcluster(4) 
registerDoParallel(cl)

df <- read.csv("C:\\Users\\small.csv") 
df2 <- melt(df, id.vars = c("prefecture"))
df2$variable <- str_remove(df2$variable,"X")
colnames(df2) <- c("pref","year","N_of_clinic")
df2$N_of_clinic <- as.numeric(df2$N_of_clinic)
df2$year <- as.numeric(df2$year)

df2_r <- df2 %>% 
  group_by(year) %>% 
  mutate(rank = rank(N_of_clinic))

small <- df2_r %>% 
ggplot(aes(x=rank,group=pref))+
  geom_tile(aes(y=N_of_clinic/2,
                height = N_of_clinic,
                fill=pref,
                width=0.9))+
  geom_text(aes(y=0,
                label=pref,
                hjust = 1,
                color=pref))+
  geom_text(aes(x=2,
                y=1700,
                label=as.character(year)),
            color="#808080",
            size=20)+
  coord_flip()+
  theme(legend.position = "")+
  ylim(-200,2000)+
  theme(axis.line=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.y=element_blank(),
        axis.title.x = element_blank(),
        legend.position="none",
        panel.background=element_blank(),
        panel.border=element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.grid.major.x = element_line( size=.1, color="grey" ),
        panel.grid.minor.x = element_line( size=.1, color="grey" ),
        plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=0.5),
        plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
        plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
        plot.background=element_blank())+
  transition_states(year)+
  labs(title = '犬猫等動物病院数')

animate(small, duration=15, renderer = gifski_renderer("small.gif"))

逐次説明

df <- read.csv(“C:\Users\small.csv”)
df2 <- melt(df, id.vars = c(“prefecture”))
1列目:prefecture列、2列目:年、3列目:その年の数値。
df2$variable <- str_remove(df2$variable,”X”)
エクセルファイルで数字から始まる列名の先頭にXがついているので、のぞく。
colnames(df2) <- c(“pref”,”year”,”N_of_clinic”)
列名が分かりやすいので、直す。
df2$N_of_clinic <- as.numeric(df2$N_of_clinic)
df2$year <- as.numeric(df2$year)
reshape後は、charactorになってしまうのでnumberに戻す。

df2_r <- df2 %>%
group_by(year) %>%
mutate(rank = rank(N_of_clinic))
都道府県における動物病院数について、全国におけるその年の順位が入っている列を追加する。

geom_text(aes(y=0, label = pref, hjust = 1, color=pref))+
都道府県の名前のラベルを付ける
geom_text(aes(x=2, y=1700, label=as.character(year)), color=”#808080″, size=20)
グラフの右下に多く年号を表示する。

transition_states(year)
どの変数を使って、アニメーションのフレームを移動させるかを指定する。

animate(small, duration=15, renderer = gifski_renderer(“small.gif”))
アニメーションを保存する。duration、fps、nframeを設定できる。

category