将文本标签添加到ggplot2镶嵌图中

Hen*_*ten 3 r ggplot2 ggmosaic

使用以下数据:

Category <- c("Bankpass", "Bankpass", "Bankpass", "Moving", "Moving")
Subcategory <- c("Stolen", "Lost", "Login", "Address", "New contract")
Weight <- c(10,20,13,40,20)
Duration <- as.character(c(0.2,0.4,0.5,0.44,0.66))
Silence <- as.character(c(0.1,0.3,0.25,0.74,0.26))
df <- data.frame(Category, Subcategory, Weight, Duration, Silence)
Run Code Online (Sandbox Code Playgroud)

我用它来创建以下马赛克图:

library (ggplot2)
library (ggmosaic)

g <- ggplot(data = df) +
  geom_mosaic(aes(weight = Weight, x = product(Category), fill = Duration), 
              offset = 0, na.rm = TRUE) +  
  theme(axis.text.x = element_text(angle = -25, hjust = .1)) +
  theme(axis.title.x = element_blank()) +
  scale_fill_manual(values = c("#e8f5e9", "#c8e6c9", "#a5d6a7", "#81c784", "#66bb6a"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是有效的,但我想在图表上的元素上包含文字标签("显示fe被盗,丢失"等)

但是,当我这样做时:

g + geom_text(x = Category, y = Subcategory, label = Weight)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

UseMethod中的错误("rescale"):没有适用于"rescale"的方法应用于类"character"的对象

对这里出了什么问题的想法?

jaz*_*rro 6

这是我的尝试.x轴是离散变量(即,类别).所以你不能使用它geom_text().你不知何故需要为轴创建一个数字变量.同样,您需要在y轴上找到标签的位置.为了获得两个维度的数值,我决定访问保留在图形后面的数据框.使用ggmosaic包时,在这种情况下,图形后面有一个数据框.你可以使用它ggplot_build().您可以使用数据框中的信息(例如,xmin和xmax)计算x和y值.这是个好消息.但是,我们也有坏消息.当您到达数据时,您意识到标签不需要有关子类别的信息.

我们可以克服这一挑战,将上述数据框与原始数据相结合.当我加入数据时,我计算了原始数据和其他数据的比例.这些值有意转换为字符.temp是添加标签所需的数据集.

library(dplyr)
library(ggplot2)
library(ggmosaic)

# Add proportion for each and convert to character for join

df <- group_by(df, Category) %>%
      mutate(prop = as.character(round(Weight / sum(Weight),3)))

# Add proportion for each and convert to character.
# Get x and y values for positions
# Use prop for join

temp <- ggplot_build(g)$data %>%
        as.data.frame %>%
        transmute(prop = as.character(round(ymax - ymin, 3)),
                  x.position = (xmax + xmin) / 2,
                  y.position = (ymax + ymin) / 2) %>%
        right_join(df)

g + geom_text(x = temp$x.position, y = temp$y.position, label = temp$Subcategory) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述