Создание Mosai c Участок в R - PullRequest
0 голосов
/ 27 марта 2020

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

df = data.frame(effect = c("no","no", "yes", "yes"),
            sex = c("f","m","f","m"),
            n = c(8,3,8,12))

df$effect <- factor((df$effect), levels=c("yes", "no"))
df$sex <- factor(df$sex)

Я попробовал ggplot:

windows(width=3.5, height=3.5 )
ggplot(df) +
geom_bar(aes(effect, fill = sex))

Я попробовал другой ggplot:

library(ggmosaic)
windows(width=3.5, height=3.5 )
ggplot(df) + 
geom_mosaic(aes(x = product(effect), fill = sex)) + 
labs(x = "effect", y = "number")

Я попробовал другой подход:

library("graphics")
windows(width=3.5, height=3.5 )
with(df,
mosaicplot(table(effect, sex), color=TRUE))

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

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Вы можете использовать функцию mosaicplot из графика . Однако данные должны быть в «табличном» или необработанном формате, а не агрегированными. Ваши данные агрегируются, поэтому нам необходимо «деагрегировать» их, используя xtabs:

xtab <- xtabs(n~sex+effect, data=df)
   effect
sex yes no
  f   8  8
  m  12  3

. Тогда будет работать любое из следующих действий.

mosaicplot(xtab, main="Sex v Effect", col=TRUE)
mosaicplot(~sex+effect, data=xtab, main="Sex v Effect", col=TRUE)

enter image description here

1 голос
/ 27 марта 2020

Вам необходимо включить значение n в определение графика. Кроме того, поскольку вы суммируете значения, geom_col() более подходит, чем geom_barr(). Чтобы столбцы заполняли любую область, добавьте position = "fill" в определение геометрии.

df = structure(list(effect = structure(c(2L, 2L, 1L, 1L), .Label = c("yes", 
     "no"), class = "factor"), sex = structure(c(1L, 2L, 1L, 2L), 
      .Label = c("f",  "m"), class = "factor"), n = c(8, 3, 8, 12)), 
      row.names = c(NA, -4L), class = "data.frame")

ggplot(df, aes(effect, y=n, fill = sex)) +
  geom_col(position="fill")

enter image description here

Чтобы изменить столбцы ширины вы можете попробовать что-то вроде:

library(dplyr)
widths<-df %>% group_by(effect) %>% summarize(value=sum(n)) %>% mutate(value=value/sum(value))
ggplot(df, aes(effect, y=n, fill = sex)) +
  geom_col(position="fill", width=1.8*rep(widths$value, each=2))
...