Упаковка Directlabels в R - метки не помещаются в области сюжета

Я хочу изучить пакет directlabels с ggplot. Я пытаюсь нанести метки на конечную точку простой линейной диаграммы; однако метки обрезаются панелью графика.

Я думаю, что может быть другое решение, использующее annotate или некоторые другие драгоценные камни. Но я хотел бы решить с DirectLabels. Пожалуйста, смотрите код и изображение ниже. Благодарю.

library(ggplot2)
library(directlabels)
library(tidyr)

#generate data frame with random data, for illustration and plot:
x <- seq(1:100)
y <- cumsum(rnorm(n = 100, mean = 6, sd = 15))
y2 <- cumsum(rnorm(n = 100, mean = 2, sd = 4))
data <- as.data.frame(cbind(x, y, y2))
names(data) <- c("month", "stocks", "bonds")
tidy_data <- gather(data, month)
names(tidy_data) <- c("month", "asset", "value")
p <- ggplot(tidy_data, aes(x = month, y = value, colour = asset)) + 
geom_line() + 
geom_dl(aes(colour = asset, label = asset), method = "last.points") + 
theme_bw()

линейный график с конечными метками

Спасибо Ник (за ответ ниже). Ваше решение с xlim работает.

Тем не менее, я думаю, что по принципу визуализации данных я бы хотел избежать расширения оси X для подгонки меток - это будет означать наличие пространства данных без данных. Скорее, я бы хотел, чтобы метки простирались в сторону пустого пространства за рамкой / панелью графика (если это имеет смысл).

Для дополнительного контекста я намерен построить около 10 финансовых временных рядов в одном графике, и я подумал, что directlabels будет лучшим решением, не так ли?

2 ответа

Решение

На мой взгляд, прямой лейбл - это путь. Действительно, я бы расположил метки в начале и в конце строк, создав пространство для меток, используя expand(), Также обратите внимание, что с надписями нет необходимости в легенде.

Это похоже на ответы здесь и здесь.

library(ggplot2)
library(directlabels)
library(grid)
library(tidyr)

x <- seq(1:100)
y <- cumsum(rnorm(n = 100, mean = 6, sd = 15))
y2 <- cumsum(rnorm(n = 100, mean = 2, sd = 4))
data <- as.data.frame(cbind(x, y, y2))
names(data) <- c("month", "stocks", "bonds")
tidy_data <- gather(data, month)
names(tidy_data) <- c("month", "asset", "value")

ggplot(tidy_data, aes(x = month, y = value, colour = asset, group = asset)) + 
     geom_line() + 
     scale_colour_discrete(guide = 'none')  + 
     scale_x_continuous(expand = c(0.15, 0)) +
     geom_dl(aes(label = asset), method = list(dl.trans(x = x + .3), "last.bumpup")) +
     geom_dl(aes(label = asset), method = list(dl.trans(x = x - .3), "first.bumpup")) + 
     theme_bw() 

Если вы предпочитаете вставлять метки в поле графика, прямые метки сделают это. Но поскольку метки расположены вне панели графика, обрезка должна быть отключена.

p1 <- ggplot(tidy_data, aes(x = month, y = value, colour = asset, group = asset)) + 
     geom_line() + 
     scale_colour_discrete(guide = 'none')  + 
     scale_x_continuous(expand = c(0, 0)) +
     geom_dl(aes(label = asset), method = list(dl.trans(x = x + .3), "last.bumpup")) +
     theme_bw() +
     theme(plot.margin = unit(c(1,4,1,1), "lines")) 

# Code to turn off clipping
gt1 <- ggplotGrob(p1)
gt1$layout$clip[gt1$layout$name == "panel"] <- "off"
grid.draw(gt1)

Этот эффект также может быть достигнут с помощью geom_text (и, вероятно, также annotate), то есть без необходимости прямых меток.

p2 = ggplot(tidy_data, aes(x = month, y = value, group = asset, colour = asset)) +
  geom_line() + 
  geom_text(data = subset(tidy_data, month == 100), 
      aes(label = asset, colour = asset, x = Inf, y = value), hjust = -.2) +
  scale_x_continuous(expand = c(0, 0)) +
  scale_colour_discrete(guide = 'none')  +  
  theme_bw() +  
  theme(plot.margin = unit(c(1,3,1,1), "lines"))  

# Code to turn off clipping
gt2 <- ggplotGrob(p2)
gt2$layout$clip[gt2$layout$name == "panel"] <- "off"
grid.draw(gt2)

Поскольку вы не предоставили воспроизводимый пример, трудно сказать, какое решение лучше. Тем не менее, я бы посоветовал попробовать вручную отрегулировать x-шкалу. Используйте "буфер" для увеличения площади сюжета.

#generate data frame with random data, for illustration and plot:
p <- ggplot(tidy_data, aes(x = month, y = value, colour = asset)) + 
geom_line() + 
geom_dl(aes(colour = asset, label = asset), method = "last.points") + 
theme_bw() +
xlim(minimum_value, maximum_value + buffer)

Использование scale_x_discrete() или scale_x_continuous(), вероятно, также будет хорошо работать здесь, если вы хотите использовать пакет прямых меток. Кроме того, аннотирование или простой geom_text также будет хорошо работать.

Другие вопросы по тегам