在 R 中创建马赛克图
Creating mosaic plot in R
我尝试了很多方法,但无法使马赛克图起作用。
我从一个数据框开始:
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))
无论我怎么尝试,单元格中的数字都无法在图表上正确显示。我不知道我做错了什么...
您需要在图的定义中包含 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")
要更改栏的宽度,您可以尝试类似的操作:
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))
您可以使用 graphics 中的 mosaicplot
函数。但是,数据需要采用 "table" 或原始数据格式,而不是聚合。您的数据已汇总,因此我们需要 "deaggregate" 使用 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)
我尝试了很多方法,但无法使马赛克图起作用。 我从一个数据框开始:
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))
无论我怎么尝试,单元格中的数字都无法在图表上正确显示。我不知道我做错了什么...
您需要在图的定义中包含 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")
要更改栏的宽度,您可以尝试类似的操作:
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))
您可以使用 graphics 中的 mosaicplot
函数。但是,数据需要采用 "table" 或原始数据格式,而不是聚合。您的数据已汇总,因此我们需要 "deaggregate" 使用 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)