ggplotの作図の凡例を縦に並べる方法

ggplot で作成したチャートの凡例を縦に並べる方法です。

始めに 系列名の文字数が多い 凡例のサンプル( sampledf )を作成します。

library(dplyr)
library(ggplot2)
n <- 100
x <- seq(n)
y1 <- rnorm(n) %>% cumsum()
y2 <- rnorm(n) %>% cumsum()
sampledf <- data.frame(x, y1, y2) %>%
  {
    colnames(.)[2:3] <- c("いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす ん", "あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも やゆよ らりるれろ わを ん")
    .
  }
colnames(sampledf) %>% matrix()
     [,1]                                                                                                      
[1,] "x"                                                                                                       
[2,] "いろはにほへと ちりぬるを わかよたれそ つねならむ うゐのおくやま けふこえて あさきゆめみし ゑひもせす ん"
[3,] "あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも やゆよ らりるれろ わを ん"  

ggplot を利用して線グラフのチャートを作成します。その際、凡例はチャート上部に配置します。

tidydf <- sampledf %>% tidyr::gather(key = "系列", value = "value", colnames(.)[-1])
g <- tidydf %>% ggplot(mapping = aes(x = x, y = value, col = 系列)) +
  geom_line() +
  theme(legend.position = "top")
g
Figure 1

系列名称が長いため凡例がチャート内に収まっていません。

関数 guides {ggplot2} を利用して、凡例を 縦方向2列 で配置します。

n.row <- 2
g + guides(color = guide_legend(nrow = n.row))
Figure 2

凡例が収まりました。

続いて 棒グラフ の場合です。

tidydf %>% ggplot(mapping = aes(x = x, y = value, fill = 系列)) +
  geom_bar(stat = "identity") +
  theme(legend.position = "top") +
  guides(fill = guide_legend(nrow = n.row))
Figure 3

最後は 点グラフ の場合です。

tidydf %>% ggplot(mapping = aes(x = x, y = value, shape = 系列)) +
  geom_point(size = 2) +
  theme(legend.position = "top") +
  guides(shape = guide_legend(nrow = n.row))
Figure 4

以上です。