Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.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,我有一个使用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

我有一个使用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,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。。