метки ggplot для расплавленных фреймов данных - PullRequest
0 голосов
/ 25 октября 2018

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

Например, я сделаю это:

mtcars$id<-rownames(mtcars)
tt<-melt(mtcars,id.vars = "id",measure.vars = c("cyl","vs","carb"))
ggplot(tt,aes(variable,value))+geom_bar(stat="identity")+
    geom_text(aes(label=value),color='blue')

Результатом является график, в котором метка для каждого столбца повторяется для каждого случая (кажется): overlapping labels

То, что я хочу иметь, - это одна метка длякаждый столбец, например:

enter image description here

Распространенным решением является создание агрегированных значений для размещения на графике, например:

aggr<-tt %>% group_by(variable) %>% summarise(aggrLABEL=mean(value))

ggplot(tt,aes(variable,value))+geom_bar(stat="identity")+
    geom_text(aes(label=aggr$aggrLABEL),color='blue')

или

ggplot(tt,aes(variable,value))+geom_bar(stat="identity")+
    geom_text(label=dplyr::distinct(tt,value),color='blue')

Однако эти попытки приводят к ошибкам соответственно:

Для решение 1: Ошибка: эстетика должна быть либо длины 1, либо одинаковойв качестве данных (96): метка, х, у

для решение 2: ошибка в [<-.data.frame (*tmp*, aes_params, значение = список (метка = список (: замена)элемент 1 представляет собой матрицу / фрейм данных из 7 строк, необходимо 96

Итак, что делать? Установка geom_text в stat="identity" тоже не помогает.

1 Ответ

0 голосов
/ 26 октября 2018

Что бы я сделал, это создал еще один фрейм данных со сводными значениями ваших столбцов.Затем я бы сослался на этот фрейм данных в строке geom_text.Как это:

library(tidyverse) # need this for the %>%

tt_summary <- tt %>%
 group_by(variable) %>%
 summarize(total = sum(value))

ggplot(tt, aes(variable, value)) +
geom_col() +
geom_text(data = tt_summary, aes(label = total, y = total), nudge_y = 1) # using nudge_y bc it looks better.

enter image description here

...