2
respostas

Alinhamento de duas escalas no eixo

Alinhamento de duas escalas do eixo "y" no R

Estou plotando dois tipos de gráficos, eixo Y esquerdo como de Chamadas e o direito referente Dia.

Quberei um pouco a cabeça para tentar plotar esses dois gráficos, o meio que achei ( mais uma gambiarra ) foi de um site que explica passo a passo esse procedimento:

http://lehoangvan.com/posts/dual-y-axis-ggplot2/

Eu recomendo que leia o link para entender melhor meu código.

O problema esta na imagem abaixo:

https://imgur.com/a/r1WNH

não estou conseguindo alinhar as duas escalas, queria na mesma linha 200/20 e 0 do eixo direito no seu devido lugar tb.

A parte do gráfico está ok, só mesmo o alinhamento.

#Bibliotecas 
library(lubridate)
library(gtable)
library(ggplot2)
library(grid)
library(extrafont)
loadfonts(device="win")

# Transformar var tab.OpTT$Dia em formato ymd (yyyy-mm-dd) do lubridate
tab.OpTT$Dia <- seq(ymd("2018-01-19"), ymd("2018-02-18"), by="days")

#Primeiro plot de gráfico, com eixo "Y" orientação na esquerda
p1 <- ggplot(tab.OpTT)+
  geom_area(aes(x = Dia, y = v1, group = 1), fill = "#3D196D")+
  geom_area(aes(x = Dia, y = v2, group = 1), fill = "#B18AE4", alpha = 0.7)+
  geom_area(aes(x = Dia, y = v3, group = 1), fill = "#490F49", alpha = 0.8)+
  labs( x=NULL,y=NULL)+
  ggtitle("Chamadas\n")+
  scale_x_date(breaks=seq(min(tab.OpTT$Dia), max(tab.OpTT$Dia), by="1 day"),  date_labels="%d/%b", minor_breaks=seq(min(tab.OpTT$Dia), max(tab.OpTT$Dia), by="1 month"))+  
  scale_y_continuous(expand = c(0, 0), limits = c(0, 200)) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1),
    panel.background = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.grid.major = element_line(color = "gray50", size = 0.5), 
    panel.grid.major.x = element_blank(),
    text = element_text(family="Simplon BP Light"),
    axis.text.y = element_text(size = 14),  
    axis.ticks = element_line(colour = 'gray50'),
    axis.ticks.length = unit(.25, "cm"),
    axis.ticks.x = element_line(colour = "gray50"),
    axis.ticks.y = element_blank(),
    plot.title = element_text(hjust = 3.00 , vjust= 1.00, color = "gray50", size = 14, family = "Simplon BP Light")) 

#Primeiro plot de gráfico, com eixo "Y" orientação na direita.
p2 <- ggplot(tab.OpTT)+
  geom_line(  aes(x = Dia, y = v4, group = 1), color = "#00008B", linetype= 1, size = 1.5)+
  geom_line(  aes(x = Dia, y = v5, group = 1), color = "#F4D0F4", linetype = 7, size = 1.5)+
  labs(x= NULL, y= NULL)+
  ggtitle("Dia\n")+
  scale_x_date(breaks=seq(min(tab.OpTT$Dia), max(tab.OpTT$Dia), by="1 day"),  date_labels="%d/%b", minor_breaks=seq(min(tab.OpTT$Dia), max(tab.OpTT$Dia), by="1 month"))+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))+  
  scale_y_continuous(expand = c(0, 0), limits = c(-0, 20)) +
  theme(
    panel.background = element_blank(),
    panel.grid.minor = element_blank(), 
    panel.grid.major = element_blank(),
    panel.grid.major.x = element_blank(),
    text = element_text(family="Simplon BP Light"),
    axis.text.y = element_text(size=14),
    axis.text.x = element_text(size = 14),
    axis.ticks = element_line(colour = 'gray50'),
    axis.ticks.length = unit(.25, "cm"),
    axis.ticks.x = element_line(colour = "gray50"),
    axis.ticks.y = element_blank(),
    plot.title = element_text(hjust = 0.6, vjust=2.12, color = "gray50", size = 14, family = "Simplon BP Light"))

#inversor
g1 <- ggplot_gtable(ggplot_build(p1)) # tranforma o ggplot em gtable e armazena na Var g1
g2 <- ggplot_gtable(ggplot_build(p2)) # tranforma o ggplot em gtable e armazena na Var g2
pp <- c(subset(g1$layout, name == "panel", se = t:r)) #Pega as coordenadas do painel p1, para que o p2 seja posicionado corretamente
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, pp$l, pp$b, pp$l) #Sobrepoe o p2 encima do p1 
ia <- which(g2$layout$name == "axis-l") #extrai o eixo "Y" da p2
ga <- g2$grobs[[ia]]
ax <- ga$children[[2]]
ax$widths <- rev(ax$widths) # gira horizontamente o eixo "Y" da p2
ax$grobs <- rev(ax$grobs)
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) #Adiciona e vira o eixo "Y" da p2 para a direita
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b)
grid.draw(g) #Executa o grid como gráfico

Segue Dados:

https://gist.github.com/anonymous/92b3eedb8b0d355fdefb8bbc6cd26321

2 respostas

Fala ai Pedro, de boa ?

Cara parece que a galera não conseguiu entender muito bem o problema. :(

Será que já conseguiu resolver ?

Em parte sim, falta umas partes para o ajuste, como as legendas do gráfico a label do eixo y do gráfico p2 ficar na direita. Quando eu conseguir, mostro a resolução aqui.