【问题标题】:R: Manipulate and ggplot2 moving density curve not workingR:操纵和ggplot2移动密度曲线不起作用
【发布时间】:2015-04-29 07:41:48
【问题描述】:

我想我会用一对设置良好的例子来问这个问题:

  • 第一个示例(第一个代码块)具有产品的正态分布,并且移动限制确定通过和失败,从而产生产量(这个有效,它通过移动 geom_vline 或红色垂直线来实现)。
  • 第二个示例(第二个代码块)具有变化均值的正态分布,并且限制在 0 处是固定的(我尝试使用操作移动 geom_density,但无法使其工作)

问题:如何使用 ggplot2 操作来移动密度曲线(并让我的第二个示例工作)?

第一个例子:

require(manipulate)
require(ggplot2)

set.seed(10)
data <- data.frame(dens=rnorm(1000, mean=20, sd=3))

# Moving the limit, Production always the same
manipulate(
{
    Pass <- sum(data>Limit)
    Fail <- sum(data<=Limit)
    Yield <- Pass/(Pass+Fail)*100
    labPass <- paste0("Pass=",toString(Pass))
    labFail <- paste0("Fail=",toString(Fail))
    labYield <- paste0("Yield=",formatC(Yield,format="f", digits=2),"%")

    ggplot(data) +
        geom_density(aes(x=dens), fill="white") +
        labs(title="Product Yield") +
        xlim(-5,30) +
        xlab("Normal Dist. mean=20, sd=3") +
        ylab("Density") +
        geom_vline(xintercept=Limit, linetype="longdash", colour="red") +
        annotate("text", x=Limit-3, y=0.10, label=labPass)+
        annotate("text", x=Limit-3, y=0.09, label=labFail)+
        annotate("text", x=Limit-3, y=0.08, label=labYield)
},
Limit=slider(5,20, initial=5))

第二个例子(移动 geom_density

require(manipulate)
require(ggplot2)

set.seed(10)
data <- data.frame(dens=rnorm(1000, mean=20, sd=3))

# Limit the same, Production mean moves
manipulate(
{
    Pass <- sum(data-20+MoveM>0)
    Fail <- sum(data-20+MoveM<=0)
    Yield <- Pass/(Pass+Fail)*100
    labPass <- paste0("Pass=",toString(Pass))
    labFail <- paste0("Fail=",toString(Fail))
    labYield <- paste0("Yield=",formatC(Yield,format="f", digits=2),"%")

    ggplot(data) +
        geom_density(aes(x=dens-20+MoveM), fill="white") +
        labs(title="Product Yield") +
        xlim(-5,30) +
        xlab("Normal Dist. mean=variable, sd=3") +
        ylab("Density") +
        geom_vline(xintercept=0, linetype="longdash", colour="red") +
        annotate("text", x=-3, y=0.10, label=labPass)+
        annotate("text", x=-3, y=0.09, label=labFail)+
        annotate("text", x=-3, y=0.08, label=labYield)
},
MoveM=slider(0,20, initial=20))

第一个例子的图片:

【问题讨论】:

  • 我尝试为操作包添加“manipulate”标签,但不能。
  • 我建议像 ggplot(transform(data, dens = dens-20+MoveM)) + geom_density(aes(x=dens)) 一样事先更改 dens 或添加 MoveM 作为另一个 data 列。顺便说一句,有趣的包。
  • 感谢您的解决方案,将额外的列添加到数据框中非常有效!

标签: r ggplot2


【解决方案1】:

根据来自 lukeA 的评论的解决方案,这里是用平均值移动密度曲线的代码。

R 中的收益率曲线通过移动分布的平均值,并具有固定的接受极限:

require(manipulate)
require(ggplot2)

set.seed(10)
data <- data.frame(dens=rnorm(1000, mean=20, sd=3))

# Limit the same, Production mean moves
manipulate(
{
    Pass <- sum(data$dens-20+MoveM>0)
    Fail <- sum(data$dens-20+MoveM<=0)
    Yield <- Pass/(Pass+Fail)*100
    labPass <- paste0("Pass=",toString(Pass))
    labFail <- paste0("Fail=",toString(Fail))
    labYield <- paste0("Yield=",formatC(Yield,format="f", digits=2),"%")
    # ANSWER to Question: Use extra column in dataframe
    data$shiftDens <- data$dens - 20 + MoveM

    ggplot(data) +
        geom_density(aes(x=shiftDens), fill="white") +
        labs(title="Product Yield") +
        xlim(-5,30) +
        xlab("Normal Dist. mean=variable, sd=3") +
        ylab("Density") +
        geom_vline(xintercept=0, linetype="longdash", colour="red") +
        annotate("text", x=-3, y=0.10, label=labPass)+
        annotate("text", x=-3, y=0.09, label=labFail)+
        annotate("text", x=-3, y=0.08, label=labYield)
},
MoveM=slider(0,20, initial=20))

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 2015-06-16
    • 2018-06-21
    • 1970-01-01
    • 2019-02-06
    • 2015-10-26
    • 1970-01-01
    • 2016-02-05
    • 2016-12-17
    相关资源
    最近更新 更多