Пользовательская легенда ggplot вместо по умолчанию - PullRequest
0 голосов
/ 15 апреля 2020

Я искал и попробовал несколько предложений, чтобы можно было отображать пользовательскую легенду вместо стандартной по умолчанию в сгруппированном ggplot разброса. Я пробовал это и это и следующие это среди других.

Например, допустим, у меня есть df как этот:

df = data.frame(id = c("A", "A", "B", "C", "C", "C"), 
                value = c(1,2,1,2,3,4), 
                ref = c(1.5, 1.5, 1, 2,2,2), 
                min = c(0.5, 0.5, 1,2,2,2))

, и я хочу отобразить value с каждого id в виде круглых точек, но также поместите ref значения erence и min значения imum для каждого id в виде точки разной формы следующим образом:

p = ggplot(data = df) +
  geom_point(aes(x = id, y = value, color = factor(id)), shape = 19, size = 6) +
  geom_point(aes(x = id, y = ref, color = factor(id)), shape = 0, size = 8) +
  geom_point(aes(x = id, y = min, color = factor(id)), shape = 2, size = 8) +
  xlab("") +
  ylab("Value")
#print(p) 

Теперь все в порядке, но моя легенда ничего не добавляет интерпретации сюжета, так как оси X и цвета достаточно, чтобы понять это. Я знаю, что могу удалить легенду через theme(legend.position = "none"). Вместо этого я хотел бы иметь легенду о том, что представляют собой фактические формы каждой точки (например, заполненная круглая точка = value, треугольник = min, квадрат = ref).

Среди попыток вручную установить значения шкалы с помощью scale_fill_manual и что-то в этом духе

override.shape = shapes$shape
override.linetype = shapes$pch
guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype)))...
....

Я также пытался создать вторичный график, но не отображать его, используя что-то, предложенное в одном из ссылок, вставленных выше:

shapes  = data.frame(shape = c("value", "reference", "minimum"), pch = c(19,0,2), col = c("gray", "gray", "gray"))
p2 = ggplot(shapes, aes(shape, pch)) + geom_point()  
#print(p2)

g_legend <- function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)
}
legend <- g_legend(p2)
library(gridExtra)
pp <- arrangeGrob(p1 ,legend,
                  widths=c(5/4, 1/4),
                  ncol = 2)

но тогда я получаю ошибку:

> legend <- g_legend(p2)
Error in tmp$grobs[[leg]] : 
  attempt to select less than one element in get1index

, для которой я не нашел рабочее решение .. так что да .. любое предложение о том, как Я мог только показать легенду, связанную с различными точечными формами. Спасибо

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете сначала привести в порядок свои данные, используя tidyr , а затем сопоставить aes shape с новой переменной

library(tidyr)
df2 <- pivot_longer(df, -id)

ggplot(data = df2) +
  geom_point(aes(x = id, y = value, shape = name), size = 6) +
  xlab("") +
  ylab("Value")

enter image description here

1 голос
/ 15 апреля 2020

Вы можете вручную создать легенду формы, используя scale_shape_manual:

library(ggplot2)

ggplot(data = df) +
  geom_point(aes(x = id, y = value, color = factor(id), shape = 'value'), size = 6) +
  geom_point(aes(x = id, y = ref, color = factor(id), shape = 'ref'), size = 8) +
  geom_point(aes(x = id, y = min, color = factor(id), shape = 'min'), size = 8) +
  scale_shape_manual(values = c('value' = 19, 'ref' = 0, 'min' = 2)) +
  xlab("") +
  ylab("Value")

Создано в 2020-04-15 с помощью пакета Представить (v0.3.0)

Но лучшим способом сделать это было бы преобразование df в длинный формат и сопоставление каждого aes с переменной:

library(dplyr)
library(tidyr)

df %>% 
  pivot_longer(-id) %>% 
  ggplot() +
  geom_point(aes(x = id, y = value, color = factor(id), shape = name, size = name)) +
  scale_shape_manual(values = c('value' = 19, 'ref' = 0, 'min' = 2)) +
  scale_size_manual(values = c('value' = 6, 'ref' = 8, 'min' = 8)) + 
  xlab("") +
  ylab("Value")

Создано в 2020-04-15 с помощью представительного пакета (v0.3.0)

К удалите легенду об использовании цвета guide_none():

library(tidyr)
library(ggplot2)
df %>% 
  pivot_longer(-id) %>% 
  ggplot() +
  geom_point(aes(x = id, y = value, color = factor(id), shape = name, size = name)) +
  scale_shape_manual(values = c('value' = 19, 'ref' = 0, 'min' = 2)) +
  scale_size_manual(values = c('value' = 6, 'ref' = 8, 'min' = 8)) + 
  guides(color = guide_none()) +
  xlab("") +
  ylab("Value")

Создано в 2020-04-16 пакетом Представить ( v0.3.0)

Данные:

df = data.frame(id = c("A", "A", "B", "C", "C", "C"), 
                value = c(1,2,1,2,3,4), 
                ref = c(1.5, 1.5, 1, 2,2,2), 
                min = c(0.5, 0.5, 1,2,2,2))
...