ggplot2 中带有图例的颜色编码 PMF

Color-coded PMF with legend in ggplot2

我的目标是使用 ggplot2 生成两个重叠的二项式分布的 PMF,根据我指定的颜色进行颜色编码,底部有图例。

到目前为止,我认为我已经正确设置了数据框。

successes <- c(seq(0,10,1),seq(0,10,1))
freq <- c(dbinom(seq(0,10,1),10,0.2),dbinom(seq(0,10,1),10,0.8))
class <- c(rep('  A  ',11),rep('  B  ',11))
df1 <- data.frame(cbind(successes,freq,class))

然而,这给出了错误的结果。

library(ggplot2)
g <- ggplot(df1, aes(successes),y=freq)
g + geom_bar(aes(fill = class))

我觉得我是在仿效一个例子,但得到的结果却完全不同。这(几乎)做了我想要的:如果它给出相对频率,它将是准确的。

g <- ggplot(mpg, aes(class))
g + geom_bar(aes(fill = drv))

几个问题:

1) 我的代码块哪里出错了?

2) 是否有更好的方式在一张图中向 PMF 展示?我不确定要使用直方图还是条形图。

3) 我该如何设置才能让我选择颜色?

4) 如何对 x 轴上的值进行排序?它们不是类别。它们是数字 0-10,具有我想要保留的自然顺序。

谢谢!

更新

以下两个块有效。

successes <- c(seq(0,10,1),seq(0,10,1))
freq <- c(dbinom(seq(0,10,1),10,0.2),dbinom(seq(0,10,1),10,0.8))
class <- c(rep('  A  ',11),rep('  B  ',11))
df1 <- data.frame(successes,freq,class)
ggplot(df1, aes(successes ,y=freq, fill = class)) +
geom_bar(stat = "identity") +
scale_x_continuous(breaks = seq(0,10,1)) +
scale_fill_manual(values = c("blue", "green")) + theme_bw()

successes <- c(seq(0,10,1),seq(0,10,1))
freq <- c(dbinom(seq(0,10,1),10,0.2),dbinom(seq(0,10,1),10,0.8))
class <- c(rep('  A  ',11),rep('  B  ',11))
df1 <- data.frame(successes,freq,class)
ggplot(df1, aes(x=successes,y=freq),y=freq) + 
geom_col(aes(fill = class)) +
scale_x_continuous(breaks = seq(0,10,1)) +
scale_fill_manual(values = c("blue", "green")) + theme_bw()

这是您要找的吗?

library(ggplot2)
g <- ggplot(df1, aes(successes ,y=freq, fill = class))
g + geom_bar(stat = "identity") +
scale_fill_manual(values = c("blue", "green"))

当然,请记住,您确实会将数据框创建更改为:

successes <- c(seq(0,10,1),seq(0,10,1))
freq <- c(dbinom(seq(0,10,1),10,0.2),dbinom(seq(0,10,1),10,0.8))
class <- c(rep('  A  ',11),rep('  B  ',11))
df1 <- data.frame(successes,freq,class)

如评论中所建议。

我认为您的问题是当您创建 df1 时,successes 和 freq 被更改为 factors

也许这就是您的想法?

successes <- c(seq(0,10,1),seq(0,10,1))
freq <- c(dbinom(seq(0,10,1),10,0.2),dbinom(seq(0,10,1),10,0.8))
class <- c(rep('  A  ',11),rep('  B  ',11))
df1 <- data.frame(successes = as.numeric(successes), freq = as.numeric(freq), class)

ggplot(df1, aes(x = successes, y = freq)) +
  geom_bar(stat = "identity", aes(fill = class))

如果没有,很乐意回答任何进一步的问题!