Função para construir o gráfico do eixo y duplo no ggplot2
Estou testando uma função para criar um gráfico de eixo y duplo no ggplot2. Funciona, mas não consigo obter alguns elementos dos gráficos de entrada. Eu construí esses dois gráficos com dois quadros de dadosBase1
eBase2
(Eu adiciono odput()
versão na parte final):
library(ggplot2)
library(scales)
library(gtable)
#Graph 1
g1<-ggplot(Base1, aes(x = Month, y = value, fill = variable)) +
geom_bar(stat="identity",colour="black",size=1) +
scale_y_continuous(labels = comma,breaks=pretty_breaks(n=7),
limits=c(0,max(Base1$value,na.rm=T))) +
theme(axis.text.x=element_text(angle=90,colour="grey20",face="bold",size=12),
axis.text.y=element_text(colour="grey20",face="bold",hjust=1,vjust=0.8,size=15),
axis.title.x=element_text(colour="grey20",face="bold",size=16),
axis.title.y=element_text(colour="grey20",face="bold",size=16)) +
xlab('Month')+ylab('')+ ggtitle("My graph") +
theme(plot.title = element_text(lineheight=3, face="bold", color="black",size=24)) +
theme(legend.text=element_text(size=14),
legend.title=element_text(size=14)) +
scale_fill_manual(name = "variable",
label = "Power",
values = "#FF6C91")
E o segundo:
#Graph2
colors=c("red","darkgreen")
g2<-ggplot(Base2, aes(x=Month, y=value, color=variable))+
geom_line(aes(group=variable),size=1.3) +
geom_point(size=3.8, shape=21, fill="white") +
scale_color_manual(values=colors)+ ggtitle("My graph")
Com esses dois gráficos, usei a próxima função dois, faça um gráfico de eixo y duplo:
double_axis_graph <- function(graf1,graf2){
graf1 <- graf1
graf2 <- graf2
gtable1 <- ggplot_gtable(ggplot_build(graf1))
gtable2 <- ggplot_gtable(ggplot_build(graf2))
par <- c(subset(gtable1[['layout']], name=='panel', select=t:r))
graf <- gtable_add_grob(gtable1, gtable2[['grobs']][[which(gtable2[['layout']][['name']]=='panel')]],
par['t'],par['l'],par['b'],par['r'])
ia <- which(gtable2[['layout']][['name']]=='axis-l')
ga <- gtable2[['grobs']][[ia]]
ax <- ga[['children']][[2]]
ax[['widths']] <- rev(ax[['widths']])
ax[['grobs']] <- rev(ax[['grobs']])
ax[['grobs']][[1]][['x']] <- ax[['grobs']][[1]][['x']] - unit(1,'npc') + unit(0.15,'cm')
graf <- gtable_add_cols(graf, gtable2[['widths']][gtable2[['layout']][ia, ][['l']]], length(graf[['widths']])-1)
graf <- gtable_add_grob(graf, ax, par['t'], length(graf[['widths']])-1, par['b'])
return(graf)
}
Portanto, quando usei isso para criar os gráficos de dois eixos, o resultado mostra o eixo duplo, mas não consigo obter os outros elementos dos gráficos de entrada como uma legenda completa; além disso, quando uno os gráficos, apenas um deles é mostrado e o outro se perde. Eu apliquei a função com os próximos resultados:
plot(double_axis_graph(g1,g2))
Nesse caso, o gráfico de barras (g1
) desaparece e não consigo concluir a lenda com os elementos deg2
. Dois eixos funcionaram bem. Em um segundo teste, obtive este resultado:
plot(double_axis_graph(g2,g1))
Nesse caso, perdi a série deg2
e a lenda não tem os elementos deg1
. Gostaria de concluir a função para mostrar gráficos e elementos na legenda para todas as séries no gráfico. odput()
A versão dos meus quadros de dados é a seguinte:
Base1<-structure(list(Month = c("m11", "m12", "m13", "m14", "m15", "m16"
), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Power", class = "factor"),
value = c(28101696.45, 28606983.44, 30304944, 32583849.36,
34791542.82, 40051050.24)), .Names = c("Month", "variable",
"value"), row.names = c(NA, -6L), class = "data.frame")
Base2<-structure(list(Month = c("m11", "m12", "m13", "m14", "m15", "m16",
"m11", "m12", "m13", "m14", "m15", "m16"), variable = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("Index1",
"Index2"), class = "factor"), value = c(0.044370892419913, 0.0437161234641523,
0.0516857394621815, 0.0495793011485982, 0.0506456741259283, 0.0314653057147897,
0.0299405579124744, 0.0296145768664101, 0.0269727649059507, 0.0250663815369419,
0.0233469715385275, 0.0201801611981898)), .Names = c("Month",
"variable", "value"), row.names = c(NA, -12L), class = "data.frame")
Muito obrigado pela sua ajuda!