[英]conditional plot linetype in ggplot2
我有一个使用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值绘制单独的曲线,并分段定义函数,但是我正在寻找一个更简单的解决方案。
编辑:followibng代码(逐段定义的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)
请帮忙?
您需要为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
我们希望每次曲线越过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..
y
..y..
是..y..
内部计算得出的y
值的向量,以绘制函数,因此这就是为什么我们在ggplot中使用..y..
原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.