R&ggplot2-如何通过二进制变量绘制分类拆分的相对频率

时间:2020-04-14 10:34:56

标签: r ggplot2 frequency categorical-data

我可以轻松地绘制一个相对频率图,其中一个“基本”类别沿x轴,另一个类别的频率为y:

library(ggplot2)
ggplot(diamonds) +
  aes(x = cut, fill = color) +
  geom_bar(position = "fill")

现在说我将分类变量以某种方式由二进制变量拆分:

diamonds <- data.frame(diamonds)
diamonds$binary_dummy <- sample(c(0,1), nrow(diamonds), replace = T)

如何绘制原始分类,但现在显示了color('color')变量中的拆分。优选地,这将由原始颜色的两种不同的阴影来表示。

基本上,我正在尝试重现此情节: Freq_plot_example

从图例中可以看到,每个类别都由“ NonSyn” /“ Syn”拆分,并且每个拆分都被着色为另一种不同颜色的深/浅色(例如,“调节蛋白NonSyn” =深粉红色,调节蛋白Syn“ =浅粉色)。

1 个答案:

答案 0 :(得分:2)

如果您不介意手动设置调色板,则可以执行以下操作:

library(ggplot2)
library(colorspace)

df <- data.frame(diamonds)
df$binary_dummy <- sample(c(0,1), nrow(df), replace = T)

pal <- scales::brewer_pal(palette = "Set1")(nlevels(df$color))
pal <- c(rbind(pal, darken(pal, amount = 0.2)))

ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
  geom_bar(position = "fill") +
  scale_fill_manual(values = pal)

reprex package(v0.3.0)于2020-04-14创建

编辑:要修复交互颜色关系,您可以设置一个命名的调色板,例如:

pal <- setNames(pal, levels(interaction(df$binary_dummy, df$color)))

# Miss a level
df <- df[!(df$binary_dummy == 0 & df$color == "E"),]

ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
  geom_bar(position = "fill") +
  scale_fill_manual(values = pal)

或者,您也可以设置刻度的间隔:

ggplot(df, aes(x = cut, fill = interaction(binary_dummy, color))) +
  geom_bar(position = "fill") +
  scale_fill_manual(values = pal, breaks = levels(interaction(df$binary_dummy, df$color)))