我有一个使用stat.funciton的基本情节:
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)
有没有办法根据y值改变绘图的线型?换句话说,如何更改此图,以便将上面的曲线上的值(例如y = 10)绘制为虚线而不是实线?注意我得到了我可以为x值制作单独的曲线,并分段定义函数,但我正在寻找一个更简单的解决方案。
编辑:跟随代码(分段定义的x)似乎也不起作用:
x1<-c(-5,4)
fun.1 <- function(x1) x1^2 + x1
x2<-c(4,5)
fun.2 <- function(x2) x2^2 + x2
p1<-ggplot(data.frame(x=x1),aes(x1)) +stat_function(fun = fun.1,geom="line")
p1<-p1+ggplot(data=data.frame(x2),aes(x2))+stat_function(fun = fun.2,geom="line",lty=2)
print(p1)
>Error: Don't know how to add o to a plot
然而,第二个情节在单独完成时有效:
x2<-c(4,5)
fun.2 <- function(x2) x2^2 + x2
p2<-ggplot(data=data.frame(x2),aes(x2))+stat_function(fun = fun.2,geom="line",lty=2)
print(p2)
请帮帮忙?
答案 0 :(得分:2)
您需要为高于/低于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
:< / p>
> diff(y >=10)
[1] 0 0 1 0 0 0 0 0 0 -1 0 0
我们希望每次曲线越过y==10
时增加到一个新组:
> 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
最后,我们将其转换为一个因子,否则linetype会将连续变量映射到linetype
时出错:
> 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..
的原因。