Используя следующие данные:

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)

Который я использую для создания следующего мозаичного сюжета:

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"))

enter image description here

Это работает, однако я хотел бы добавить текстовые метки к элементам на графике («Показано, что украдено, потеряно» и т. Д.)

Однако когда я это сделаю:

g + geom_text(x = Category, y = Subcategory, label = Weight)

Я получаю следующую ошибку:

Ошибка в UseMethod ("rescale"): нет применимого метода для "rescale", примененного к объекту класса "character"

Есть мысли о том, что здесь не так?

4
Henk Straten 31 Дек 2017 в 13:57

2 ответа

Лучший ответ

Вот моя попытка. Ось x находится в дискретной переменной (т. Е. Категории). Таким образом, вы не можете использовать его в geom_text(). Вам как-то нужно создать числовую переменную для оси. Точно так же вам нужно найти положение по оси Y для меток. Чтобы получить числовые значения для двух измерений, я решил получить доступ к фрейму данных, который находится за вашей графикой. Когда вы используете пакет ggmosaic, в этом случае за графиком находится один фрейм данных. Вы можете получить его, используя ggplot_build(). Вы можете вычислить значения x и y, используя информацию во фрейме данных (например, xmin и xmax). Это хорошие новости. Но у нас есть и плохие новости. Когда вы дойдете до данных, вы поймете, что нет информации о подкатегории, которая вам нужна для ярлыков.

Мы можем решить эту проблему, объединив фрейм данных выше с исходными данными. Когда я присоединил данные, я вычислил пропорцию как для исходных данных, так и для других данных. Значения намеренно преобразованы в символьные. 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) 

enter image description here

7
jazzurro 31 Дек 2017 в 12:59

Я думаю вы ищете что-то подобное

library(ggplot2)
library(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))
mydf <- data.frame(Category, Subcategory, Weight, Duration, Silence)

ggplot(data = mydf) +
    geom_mosaic(aes( x = product(Duration, Subcategory), fill=factor(Duration)), na.rm=TRUE) + 
    theme(axis.text.x=element_text(angle=-25, hjust= .1)) +
    labs(x="Subcategory", title='f(Duration, Subcategory | Category)')  + 
    facet_grid(Category~.) + 
    guides(fill=guide_legend(title = "Duration", reverse = TRUE))

Результат:

enter image description here

Это почти лучшее, что вы можете сделать с пакетом ggmosaic. Вам следует попробовать другие пакеты.

Удачи в работе над вашим проектом ;-)

1
Scipione Sarlo 31 Дек 2017 в 11:54