R 适用于可变级别的geom_功能区
我正在绘制一些分析结果,在本例中,我试图用颜色填充黑线下方的区域,这是一个可变阈值。我在R 适用于可变级别的geom_功能区,r,ggplot2,R,Ggplot2,我正在绘制一些分析结果,在本例中,我试图用颜色填充黑线下方的区域,这是一个可变阈值。我在geom_ribbon上做了类似的事情,但考虑到了一个固定的阈值 这是我正在使用的数据: df <- data.frame(month= seq(560,624,1), US= c(0.67,0.71,1.49,3.47,8.13,12.13,10.52,9.33,5.48,2.72,1.74, 0.16,
geom_ribbon
上做了类似的事情,但考虑到了一个固定的阈值
这是我正在使用的数据:
df <- data.frame(month= seq(560,624,1),
US= c(0.67,0.71,1.49,3.47,8.13,12.13,10.52,9.33,5.48,2.72,1.74,
0.16,0.04,0.15,0.76,0.94,10.60,26.50,15.09,17.93,
15.68,11.69,7.00,3.68,0.46,0.55,1.21,4.14,12.73,
10.24,10.89,22.13,18.76, 18.99,9.76,2.24,0.92,0.29,
0.38,4.92,4.17,2.29,1.92,1.69, 14.87,12.32,2.00,0.67,
0.12,0.06,0.80,4.41,6.70,18.61,7.21,43.62,23.64,12.83,
6.00,2.16,0.69,0.16,3.18,8.87,16.45),
lim= c(0.63,0.41,1.20,3.11,4.21,5.75,4.88,6.21,8.33,4.34,2.07,
1.16,0.63,0.41,1.20,3.11,4.21,5.75,4.88,6.21,8.33,4.34,
2.07,1.16,0.63,0.41,1.20,3.11,4.21,5.75,4.88,6.21,8.33,
4.34,2.07,1.16,0.63,0.41,1.20,3.11,4.21,5.75,4.88,6.21,
8.33,4.34,2.07,1.16,0.63,0.41,1.20,3.11,4.21,5.75,4.88,
6.21,8.33,4.34,2.07,1.16,0.63,0.41,1.20,3.11,4.21))
ggplot(df,aes(x=month,y=US)) +
geom_line(col='deepskyblue4')+
geom_line(aes(y=df[,'lim']))+
theme_bw()
df您可以使用geom_ribbon
,但首先需要稍微处理数据
library(tidyverse)
#set US to lim if lim > US
df2 <- df %>%
mutate(US = if_else(lim > US, US, lim))
ggplot(df,aes(x=month,y=US)) +
geom_ribbon(data = df2, aes(x = month, ymin = US, ymax = lim), fill = "pink") +
geom_line(col='deepskyblue4')+
geom_line(aes(y=lim))+
labs(title=paste('Station',sep=' '),x="Nº months", y = "Hm3",size=2)+
theme_bw()
库(tidyverse)
#如果lim>US,则将我们设置为lim
df2%
变异(US=if_-else(lim>US,US,lim))
ggplot(df,aes(x=月,y=美))+
geom_ribbon(数据=df2,aes(x=month,ymin=US,ymax=lim),fill=“pink”)+
geom_线(col='deepskyblue4')+
几何线(aes(y=lim))+
实验室(标题=粘贴('Station',sep=''),x=“Nºmonths”,y=“Hm3”,大小=2)+
主题_bw()
您可以使用geom_ribbon
,但首先需要稍微处理数据
library(tidyverse)
#set US to lim if lim > US
df2 <- df %>%
mutate(US = if_else(lim > US, US, lim))
ggplot(df,aes(x=month,y=US)) +
geom_ribbon(data = df2, aes(x = month, ymin = US, ymax = lim), fill = "pink") +
geom_line(col='deepskyblue4')+
geom_line(aes(y=lim))+
labs(title=paste('Station',sep=' '),x="Nº months", y = "Hm3",size=2)+
theme_bw()
库(tidyverse)
#如果lim>US,则将我们设置为lim
df2%
变异(US=if_-else(lim>US,US,lim))
ggplot(df,aes(x=月,y=美))+
geom_ribbon(数据=df2,aes(x=month,ymin=US,ymax=lim),fill=“pink”)+
geom_线(col='deepskyblue4')+
几何线(aes(y=lim))+
实验室(标题=粘贴('Station',sep=''),x=“Nºmonths”,y=“Hm3”,大小=2)+
主题_bw()
如果将ymin
或ymax
中的一个设置为NA
,您可以使用geom_ribbon
,用于那些x
-您不希望填充的值:
ggplot(df, aes(x = month,
ymin = ifelse(lim>US, lim, NA),
ymax = US,
y = US)) +
geom_ribbon(fill = "pink") +
geom_line(color = "deepskyblue4")+
geom_line(aes(y = lim))+
theme_bw()
编辑:
如果要填补空白,可以插值数据以获得更好的绘图:
df_itpl <- data.frame(month = seq(min(df$month), max(df$month), .1))
df_itpl$US <- approx(x = df$month, y = df$US, xout = df_itpl$month)$y
df_itpl$lim <- approx(x = df$month, y = df$lim, xout = df_itpl$month)$y
ggplot(df_itpl, aes(x = month,
ymin = ifelse(lim>US, lim, NA),
ymax = US,
y = US)) +
geom_ribbon(fill = "pink") +
geom_line(color = "deepskyblue4")+
geom_line(aes(y = lim))+
theme_bw()
df_itpl如果您将ymin
或ymax
中的一个设置为NA
,您可以使用geom_ribbon
,用于那些x
-您不想填充的值:
ggplot(df, aes(x = month,
ymin = ifelse(lim>US, lim, NA),
ymax = US,
y = US)) +
geom_ribbon(fill = "pink") +
geom_line(color = "deepskyblue4")+
geom_line(aes(y = lim))+
theme_bw()
编辑:
如果要填补空白,可以插值数据以获得更好的绘图:
df_itpl <- data.frame(month = seq(min(df$month), max(df$month), .1))
df_itpl$US <- approx(x = df$month, y = df$US, xout = df_itpl$month)$y
df_itpl$lim <- approx(x = df$month, y = df$lim, xout = df_itpl$month)$y
ggplot(df_itpl, aes(x = month,
ymin = ifelse(lim>US, lim, NA),
ymax = US,
y = US)) +
geom_ribbon(fill = "pink") +
geom_line(color = "deepskyblue4")+
geom_line(aes(y = lim))+
theme_bw()
df_itpl事实上,由于lim>US
,您高估了极限处的面积。使用lim>=US
低估了它。这是第一种方法,但并不完全正确。可能需要对数据进行插值,以使交叉点更精确exact@RichardTelford非常感谢你的帮助。的确,正如bVa所提到的,这不是一个精确的方法,但我可以从这一点继续研究它。再次感谢。@RichardTelford我可以建议您参考dplyr
-依赖关系,或者使用transform
和ifelse
,这样它会变得更具可复制性(或者在后者的情况下甚至更少依赖于包)?事实上,您高估了极限处的面积,因为lim>US
。使用lim>=US
低估了它。这是第一种方法,但并不完全正确。可能需要对数据进行插值,以使交叉点更精确exact@RichardTelford非常感谢你的帮助。的确,正如bVa所提到的,这不是一个精确的方法,但我可以从这一点继续研究它。再次感谢。@RichardTelford我可以建议您参考dplyr
-依赖关系,或者使用transform
和ifelse
,这样它会变得更具可复制性(或者在后者的情况下甚至更少依赖于包)?谢谢Tino,但正如我在结果图中看到的那样,按照这种方法,填充区域的边缘没有完全着色。也许这个问题与已建立的ymax和ymin有关。但这也是一个非常有用的解决方案,我将继续思考如何准确地计算它。谢谢:-)@Marina你指的是哪个例子?插值应至少大致解决此问题。在这里,您可以选择通过将seq
中的by
-参数设置为较小的值(例如.01)来进一步减少步骤。非常感谢您的帮助@Tino。在添加插值之前,我参考了您提出的第一种方法,该方法现在解决了边的问题。谢谢Tino,但正如我在生成的图中所看到的,按照这种方法,填充区域的边没有完全着色。也许这个问题与已建立的ymax和ymin有关。但这也是一个非常有用的解决方案,我将继续思考如何准确地计算它。谢谢:-)@Marina你指的是哪个例子?插值应至少大致解决此问题。在这里,您可以选择通过将seq
中的by
-参数设置为较小的值(例如.01)来进一步减少步骤。非常感谢您的帮助@Tino。我提到了您在添加插值之前提出的第一种方法,它现在解决了边的问题。