R ggplot2中的条件打印线型
我有一个使用stat.function的基本绘图:R ggplot2中的条件打印线型,r,ggplot2,R,Ggplot2,我有一个使用stat.function的基本绘图: x<-c(-5,5) fun.1 <- function(x) x^2 + x p<-ggplot(data.frame(x=x),aes(x)) +stat_function(fun = fun.1,geom="line") print(p) x您需要为高于/低于10的每段曲线创建一个单独的组 ggplot(data.frame(x=x),aes(x)) + stat_function(fun = fun.1,geo
x<-c(-5,5)
fun.1 <- function(x) x^2 + x
p<-ggplot(data.frame(x=x),aes(x)) +stat_function(fun = fun.1,geom="line")
print(p)
x您需要为高于/低于10的每段曲线创建一个单独的组
ggplot(data.frame(x=x),aes(x)) +
stat_function(fun = fun.1,geom="line", n=400,
aes(group=factor(c(0,cumsum(diff(..y.. >= 10) != 0))),
linetype=factor(c(0,cumsum(diff(..y.. >= 10) != 0))))) +
scale_linetype_manual(values=c(2,1,2)) +
guides(linetype=FALSE)
下面是关于如何创建组的更多详细信息。首先,我们从一个简单的y
向量开始进行说明:
> y = c(7:13,12:7)
> y
[1] 7 8 9 10 11 12 13 12 11 10 9 8 7
现在让我们找出曲线高于或低于10的位置:
> y >= 10
[1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
数学函数将逻辑TRUE
和FALSE
视为分别具有1和0的数值,因此我们现在可以找到曲线穿过y==10的特定值:
> diff(y >=10)
[1] 0 0 1 0 0 0 0 0 0 -1 0 0
> diff(y >=10) != 0
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
> cumsum(diff(y >=10) != 0)
[1] 0 0 1 1 1 1 1 1 1 2 2 2
每次曲线穿过y==10时,我们希望增加到一个新组:
> diff(y >=10)
[1] 0 0 1 0 0 0 0 0 0 -1 0 0
> diff(y >=10) != 0
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
> cumsum(diff(y >=10) != 0)
[1] 0 0 1 1 1 1 1 1 1 2 2 2
现在我们有三个不同的小组。但是diff
返回的向量比原始向量短一个。因此,我们将0
添加到分组向量的开头,使其与数据向量的长度相同
> c(0, cumsum(diff(y >=10) != 0))
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2
最后,我们将其转换为一个因子,否则线型将给我们一个将连续变量映射到线型的错误:
> factor(c(0, cumsum(diff(y >=10) != 0)))
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2
Levels: 0 1 2
另外,.y..
是ggplot内部计算的y
值的向量,用于绘制函数,因此我们在ggplot内部使用.y..
。谢谢。为什么无法访问..y。。直接的?假设我只想把一面点起来,为什么aes(group=factor(c(…y…<10,…y…>=10))不起作用?可以直接访问.y…
,但是c(…y…<10,…y…>=10)
是一个长度等于数据长度两倍的向量,会导致错误。例如,假设您有一个向量y=1:5
,然后执行c(y>10,y)以在我的答案中只获得一个带有代码的虚线段,您可以执行scale\u linetype\u manual(value=c(2,1,1))
xYes,因为.y。。