繁体   English   中英

ggplot2中的条件图线型

[英]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

数学函数将逻辑TRUEFALSE视为数值分别为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM