Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R ggplot2:根据值为步骤图着色_R_Ggplot2 - Fatal编程技术网

R ggplot2:根据值为步骤图着色

R ggplot2:根据值为步骤图着色,r,ggplot2,R,Ggplot2,如何配置ggplot2步骤图,以便当绘制的值超过某个级别时,它是一种颜色,当它低于某个级别时,它是另一种颜色?(最后,我想详细说明使用的颜色。) 我的第一个想法是,这将是一个简单的问题,只需要在现有数据帧中添加一列,并将该列映射到geom_step()的aes()。这在一定程度上起作用:我得到了两种颜色,但它们重叠,如图所示: 在过去的几个小时里,我一直在搜索,发现了许多相似但不完全相同的问题。然而,尽管在不同的层中尝试了各种各样的组合,我仍然无法解决这个问题。代码如下。非常感谢您的帮助 re

如何配置ggplot2步骤图,以便当绘制的值超过某个级别时,它是一种颜色,当它低于某个级别时,它是另一种颜色?(最后,我想详细说明使用的颜色。)

我的第一个想法是,这将是一个简单的问题,只需要在现有数据帧中添加一列,并将该列映射到geom_step()的aes()。这在一定程度上起作用:我得到了两种颜色,但它们重叠,如图所示:

在过去的几个小时里,我一直在搜索,发现了许多相似但不完全相同的问题。然而,尽管在不同的层中尝试了各种各样的组合,我仍然无法解决这个问题。代码如下。非常感谢您的帮助

require(ggplot2)

tmp <- structure(list(date = structure(c(1325635200, 1325635800, 1325636400, 
1325637000, 1325637600, 1325638200, 1325638800, 1325639400, 1325640000, 
1325640600, 1325641200, 1325641800, 1325642400, 1325643000, 1325643600, 
1325644200, 1325647800, 1325648400, 1325649000, 1325649600, 1325650200, 
1325650800, 1325651400, 1325652000, 1325652600, 1325653200, 1325653800, 
1325654400, 1325655000, 1325655600, 1325656200, 1325656800), tzone = "", tclass = c("POSIXct", 
"POSIXt"), class = c("POSIXct", "POSIXt")), Close = c(739.07, 
739.86, 740.41, 741.21, 740.99, 741.69, 742.64, 741.34, 741.28, 
741.69, 741.6, 741.32, 741.95, 741.86, 741.02, 741.08, 742.08, 
742.88, 743.19, 743.18, 743.78, 743.65, 743.66, 742.78, 743.34, 
742.81, 743.31, 743.81, 742.91, 743.09, 742.47, 742.99)), .Names = c("date", 
"Close"), row.names = c(NA, -32L), class = "data.frame")
prevclose <- 743
tmp$status <- as.factor(ifelse (tmp$Close> prevclose, "Above", "Below"))

ggplot() +
    geom_step(data = tmp,aes(date, Close, colour = status))
require(ggplot2)

tmp您需要
aes中的
group=1

# top panel
ggplot(tmp, aes(date, Close, colour = status, group = 1)) + 
  geom_step() + scale_colour_manual(values = c("pink", "green"))
也许你想做这样的事情:

# make sure that data is sorted by date
tmp2 <- arrange(tmp, date)

# add intermittent column between below/above
tmp3 <- tmp2[1, ]
for (i in seq(nrow(tmp2))[-1]) {
    if (tmp2[i-1, ]$status != tmp2[i, ]$status) {
        tmp3 <- rbind(tmp3,
                      transform(tmp2[i, ], Close = prevclose, status = tmp2[i-1, ]$status),
                      transform(tmp2[i, ], Close = prevclose))
    }
    tmp3 <- rbind(tmp3, tmp2[i, ])
}

# bottom panel
ggplot(tmp3, aes(date, Close, colour = status, group = 1)) + geom_step() +
  scale_colour_manual(values = c("pink", "green"))
#确保数据按日期排序

tmp2感谢kohske(和hadley),非常感谢详细的回答。我知道我遗漏了一件事,并认为这与设置vs映射或诸如此类的事情有关,但小组就是这样……顺便说一句,我注意到,使用您的解决方案,如果当天的值都低于前一天(即状态列均为“下方”),则会将步骤行的颜色改为“上方”而不是“下面”。这是奇怪的,因为状态列的值是正确的-它们确实都是“低于”。与ggplot处理值/中断/标签的方式相关的一些怪癖?