Вставьте средние значения на участке geom_tile (ggplot в R)

#r #ggplot2 #tidyverse #geom-text #geom-tile

Вопрос:

Я использую этот код:

  library(tidyverse)
 library(reshape)
 mtcars <- melt(mtcars, id="vs")
 mtcars$vs <- as.character(mtcars$vs)
 ggplot(mtcars, aes(x=vs, y=variable, fill=value))   
      geom_tile()
 

Как я могу вставить средние значения в виде текста на каждую плитку? Я пытался geom_text(mtcars, aes(vs, variable, label=mean)) , но это не работает.

Кроме того, как я могу изменить порядок 0 и 1 на оси x?

Ответ №1:

Вы можете настроить stat_summary_2d() отображение текста на основе вычисленных переменных с after_stat() помощью . Порядок оси x можно определить, задав limits аргумент шкалы x.

 suppressPackageStartupMessages({
  library(tidyverse)
  library(reshape)
  library(scales)
})

mtcars <- melt(mtcars, id="vs")
mtcars$vs <- as.character(mtcars$vs)

ggplot(mtcars, aes(x=vs, y =variable, fill = value))  
  geom_tile()  
  stat_summary_2d(
    aes(z = value, 
        label = after_stat(number(value, accuracy = 0.01))),
    fun = mean,
    geom = "text"
  )  
  scale_x_discrete(limits = c("1", "0"))
 

Создано 2021-04-06 пакетом reprex (v1.0.0)

Также обратите внимание, что geom_tile() just отображает последнюю строку набора данных, принадлежащую категориям по осям x и y, поэтому, если это не предусмотрено, об этом следует знать.

Ответ №2:

Вы можете выполнить обработку за пределами ggplot, чтобы произвести:

 library(ggplot2)
library(dplyr)
library(tidyr)

df <- 
  mtcars %>%
  pivot_longer(-vs) %>% 
  group_by(vs, name) %>% 
  mutate(vs = factor(vs, levels = c(1, 0), ordered = TRUE),
         mean = round(mean(value), 2))


ggplot(df, aes(x=vs, y=name, fill=value))   
  geom_tile()  
  geom_text(aes(vs, name, label=mean), colour = "white", check_overlap = TRUE)  
 

Создано 2021-04-06 пакетом reprex (v1.0.0)

Комментарии:

1. Спасибо тебе, Питер. Потрясающе! 🙂