ggplot2 中带有两个 Y 轴的多图面线图 - 添加点和更改线条颜色
Multiplot facet line plot in ggplot2 with two Y axes - adding points and changing line colours
我正在为 Inc 和 Ratio 准备一个带有两个 y 轴的多图。
我用不同的颜色区分每个图来代表三个区域。
有三项我没有成功:
我现在确实有,每个图中有两条颜色相同的线。我想将其中一个更改为虚线(比率一)。
我需要将 SE 柱添加到 Inc 行(来自 Inc 列)
我想添加geom_points() 所以在连线的节点处也有点,只是为了美观。
据我所知:
df <- data.frame(c(2009,2009,2009,2009,2010,2010,2010,2010,2011,2011,2011,2011,
2012,2012,2012,2012,2013,2013,2013,2013),
c("N","S","W","W","N","S","W","W","N","S","W","W","N","S","W","W",
"N","S","W","W"),
c("Luo","Aka","Opo","Mya","Luo","Aka","Opo","Mya",
"Luo","Aka","Opo","Mya","Luo","Aka","Opo","Mya",
"Luo","Aka","Opo","Mya"),
runif(20,0,1),runif(20,0,1),
runif(20,0,0.1))
colnames(df) <- c("Year","Region","District","Inc","Ratio","Inc_SE")
# Order of drawing in facet
df$District<- factor(df$District,
levels = c("Opo",
"Mya",
"Luo",
"Aka"))
p <- ggplot(data=df, aes(x = Year))
p <- p + geom_line(aes(y = Inc))
p <- ggplot(df, aes(x = Year, y=df$Inc))
p <- p + geom_line(aes(y = Inc))
p <- ggplot(df, aes(x = Year))
p <- p + geom_line(aes(y = Inc, colour = Region))
p <- p + theme_bw()+
theme(plot.title = element_text(hjust = 1))+
theme(legend.position="none")+
theme(axis.title.x = element_text(face ="bold", colour="black", size=11),
axis.text.x = element_text(angle=90, vjust=0.5, size=7, family = "serif"),
axis.title.y = element_text(face = "bold", colour = "black", size=10))
# adding Ratio
p <- p + geom_line(aes(y = Ratio, colour = Region,linetype = "dashed")) # here dashed is not recognised by R
# now adding the secondary axis
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*1, name = "Ratio"))
p <- p + scale_colour_manual(values = c("blue", "red","black"))
p <- p +
theme_bw()+
theme(plot.title = element_text(hjust = 1))+
theme(legend.position="none")+
theme(axis.title.x = element_text(face ="bold", colour="black", size=11),
axis.text.x = element_text(angle=90, vjust=0.5, size=9, family = "serif"),
axis.title.y = element_text(face = "bold", colour = "black", size=10))
# Breaking down to separate graphs
p_facet = p + facet_wrap(~ df$District,
ncol = 2)
p_facet
你可以试试tidyverse
。诀窍是将数据从宽转换为长(这里我使用 gather
)。然后您可以轻松添加点、线和 Inc_SE
作为功能区。
library(tidyverse)
df %>%
gather(k,v, -Year, -Region, -District, -Inc_SE) %>%
ggplot(aes(Year, v, group = k, color=Region, linetype=k)) +
geom_ribbon(data=. %>% filter( k == "Inc"),
aes(ymin=v-Inc_SE, ymax=v+Inc_SE),
alpha=0.2,color=NA,
show.legend = F) +
geom_line() +
geom_point(show.legend = F)+
scale_y_continuous(sec.axis = sec_axis(~.*1, name = "Ratio"))+
facet_wrap(~ District) +
labs(y="Inc") +
theme_bw() +
theme(legend.position = "bottom")
我正在为 Inc 和 Ratio 准备一个带有两个 y 轴的多图。
我用不同的颜色区分每个图来代表三个区域。 有三项我没有成功:
我现在确实有,每个图中有两条颜色相同的线。我想将其中一个更改为虚线(比率一)。
我需要将 SE 柱添加到 Inc 行(来自 Inc 列)
我想添加geom_points() 所以在连线的节点处也有点,只是为了美观。
据我所知:
df <- data.frame(c(2009,2009,2009,2009,2010,2010,2010,2010,2011,2011,2011,2011,
2012,2012,2012,2012,2013,2013,2013,2013),
c("N","S","W","W","N","S","W","W","N","S","W","W","N","S","W","W",
"N","S","W","W"),
c("Luo","Aka","Opo","Mya","Luo","Aka","Opo","Mya",
"Luo","Aka","Opo","Mya","Luo","Aka","Opo","Mya",
"Luo","Aka","Opo","Mya"),
runif(20,0,1),runif(20,0,1),
runif(20,0,0.1))
colnames(df) <- c("Year","Region","District","Inc","Ratio","Inc_SE")
# Order of drawing in facet
df$District<- factor(df$District,
levels = c("Opo",
"Mya",
"Luo",
"Aka"))
p <- ggplot(data=df, aes(x = Year))
p <- p + geom_line(aes(y = Inc))
p <- ggplot(df, aes(x = Year, y=df$Inc))
p <- p + geom_line(aes(y = Inc))
p <- ggplot(df, aes(x = Year))
p <- p + geom_line(aes(y = Inc, colour = Region))
p <- p + theme_bw()+
theme(plot.title = element_text(hjust = 1))+
theme(legend.position="none")+
theme(axis.title.x = element_text(face ="bold", colour="black", size=11),
axis.text.x = element_text(angle=90, vjust=0.5, size=7, family = "serif"),
axis.title.y = element_text(face = "bold", colour = "black", size=10))
# adding Ratio
p <- p + geom_line(aes(y = Ratio, colour = Region,linetype = "dashed")) # here dashed is not recognised by R
# now adding the secondary axis
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*1, name = "Ratio"))
p <- p + scale_colour_manual(values = c("blue", "red","black"))
p <- p +
theme_bw()+
theme(plot.title = element_text(hjust = 1))+
theme(legend.position="none")+
theme(axis.title.x = element_text(face ="bold", colour="black", size=11),
axis.text.x = element_text(angle=90, vjust=0.5, size=9, family = "serif"),
axis.title.y = element_text(face = "bold", colour = "black", size=10))
# Breaking down to separate graphs
p_facet = p + facet_wrap(~ df$District,
ncol = 2)
p_facet
你可以试试tidyverse
。诀窍是将数据从宽转换为长(这里我使用 gather
)。然后您可以轻松添加点、线和 Inc_SE
作为功能区。
library(tidyverse)
df %>%
gather(k,v, -Year, -Region, -District, -Inc_SE) %>%
ggplot(aes(Year, v, group = k, color=Region, linetype=k)) +
geom_ribbon(data=. %>% filter( k == "Inc"),
aes(ymin=v-Inc_SE, ymax=v+Inc_SE),
alpha=0.2,color=NA,
show.legend = F) +
geom_line() +
geom_point(show.legend = F)+
scale_y_continuous(sec.axis = sec_axis(~.*1, name = "Ratio"))+
facet_wrap(~ District) +
labs(y="Inc") +
theme_bw() +
theme(legend.position = "bottom")