r - geom_ribbon 中 y-lim 上方的颜色区域
问题描述
如何将 y=0 和数据点之间的区域着色为绿色?目前它正在为整个 y [0:1] 着色
Variable <- c(1,2,3,4,5,6,7)
value <- c(-0.26, -0.10,0.98,0.52, 0.31, -0.63, -0.70)
df <- data.frame(Variable, value)
ggplot(df, aes(x = Variable, y = value)) +
geom_ribbon(aes(ymin=pmin(value,1), ymax=0), fill="red", col="red", alpha=0.5) +
geom_ribbon(aes(ymin=0, ymax=pmax(df$value,1)), fill="green", col="green", alpha=0.5) +
geom_hline(aes(yintercept=0), color="black") +
theme_bw() +
geom_point()
解决方案
据我所知,在 ggplot2 中确实没有直接的方法可以做到这一点。如果您不想要透明度,那么只需在背景中绘制一个矩形然后在顶部绘制丝带就很容易了。
ggplot(df, aes(x = Variable, y = value)) +
geom_rect(aes(xmin=min(Variable), xmax=max(Variable), ymin=0, ymax=1), fill="green") +
geom_ribbon(aes(ymin=pmin(value,1), ymax=0), fill="red", col="red") +
geom_hline(aes(yintercept=0), color="black") +
theme_bw(base_size = 16) +
geom_point()
但是,如果您需要透明度,您将需要计算该区域的边界,因为线与轴相交的点不在您的数据中,所以您需要计算这些点。这是一个查找区域与轴相交的位置并跟踪顶点的函数
crosses <- function(x, y) {
outx <- x[1]
outy <- max(y[1],0)
for(i in 2:length(x)) {
if (sign(y[i-1]) != sign(y[i])) {
outx <- c(outx, -y[i-1]*(x[i]-x[i-1])/(y[i]-y[i-1])+x[i-1])
outy <- c(outy, 0)
}
if (y[i]>0) {
outx <- c(outx, x[i])
outy <- c(outy, y[i])
}
}
if (y[length(y)]<0) {
outx <- c(outx, x[length(x)])
outy <- c(outy, 0)
}
data.frame(x=outx, y=outy)
}
基本上它只是做一些两点线公式的东西来计算交点。
然后使用它为顶部功能区创建一个新的点数据框
top_ribbon <- with(df, crosses(Variable, value))
并绘制它
ggplot(df, aes(x = Variable, y = value)) +
geom_ribbon(aes(ymin=pmin(value,1), ymax=0), fill="red", col="red", alpha=0.5) +
geom_ribbon(aes(ymin=y, ymax=1, x=x), fill="green", col="green", alpha=0.5, data=top_ribbon) +
geom_hline(aes(yintercept=0), color="black") +
theme_bw(base_size = 16) +
geom_point()
推荐阅读
- networking - 通过套接字(UDP)将浮点数从服务器发送到客户端
- javascript - 为 str.charAt() 设置新值
- javascript - Angular JS 动态设置 tabindex 属性
- python - 解决断言错误和Value错误的解决方案?
- python-3.x - 从 Keras 中的同一目录生成训练、测试和验证集
- python - pyenv mkvirtualenv 无法使用 pypy3
- python - Python Turtle 在计时器上的坐标列表中移动
- c# - WhenAny vs WhenAll vs WaitAll vs none,假设结果立即被使用
- python - 无法从不同包中的模块导入模块
- python - 如何从 Spotify 获取 Oauth 令牌