Parece que este tema no se ha cubierto desde el actualización de ggplot2.2.2 donde soluciones antiguas como este y este uno ya no se aplica. Afortunadamente, el proceso es mucho más sencillo que antes. Una línea de código y tiene un eje Y secundario (como se muestra aquí).

Pero no puedo obtener un eje X secundario en mis gráficos ...

Estoy comparando un perfil de profundidad de concentraciones de metales a lo largo del núcleo del sedimento. Me gustaría mostrar las concentraciones de carbono y fosfato como una geom_area detrás de la concentración del metal. El problema es que las concentraciones de carbono y fosfato no están en la misma escala que el metal. Por eso necesito un segundo eje.

El tema es el siguiente (tomado de este sitio web):

theme_new <- theme(panel.grid.major = element_blank(), panel.grid.minor =  element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black"), strip.text.x = element_text(size=10, angle=0, vjust=0), strip.background = element_blank(), strip.text.y = element_text(angle = 0), legend.position="none",panel.border = element_blank(), axis.text.x=element_text(angle=45,hjust=1)) # Axis tick label angle

Y este código me da un segundo eje Y aunque lo especifico debajo del eje X.

ggplot(MasterTable)+
  geom_line(aes(Depth,Conc.nM))+
  geom_area(aes(Depth,Conc.uM, fill=Variable))+
  scale_x_continuous("Depth (cm)", sec.axis = sec_axis(~ . *100, name = "Carbon & Phosphate"))+
  scale_y_continuous("Metal concentration (nM)")+
  coord_flip()+
  theme_new+
  theme(legend.position = "right")+
  facet_grid(. ~ Assay, scales = "free")

ggplot2 figure

¿Alguien puede ayudarme a colocar el eje secundario en la parte superior de la figura?

¡¡Gracias!!

El resultado de mi MasterTable es el siguiente:

Estructura (lista (Profundidad = c (15L, 5L, 2L, -1L, -3L, -5L, -7L, -9L, -11L, -13L, -15L, -17L, -19L, -21L, -23L, -25L, -27L, -29L, -31L, 15L, 5L, 2L, -1L, -3L, -5L, -7L, -9L, -11L, -13L, -15L, -17L, -19L, -21L , -23L, -25L, -27L, -29L, -31L), Conc.nM = c (24L, 24L, 24L, 100L, 100L, 75L, 75L, 85L, 85L, 120L, 300L, 1000L, 200L, 240L , 240L, 800L, 1100L, 1500L, 2300L, 0L, 10L, 0L, 50L, 200L, 200L, 50L, 50L, 200L, 15L, 0L, 0L, 10L, 120L, 200L, 1500L, 2100L, 2000L, 2000L), Ensayo = estructura (c (1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c ("Instrumento 1", "Instrumento 2"), clase = "factor"), Conc.uM = c (0L, 0L, 0L, 1L, 4L, 10L, 10L, 10L, 5L, 7L, 10L, 14L, 14L, 14L, 14L, 13L, 12L, 12L, 12L, 1L, 1L, 1L, 4L, 6L, 9L, 11L, 11L, 8L, 8L, 8L, 20L, 10L, 9L, 9L, 9L, 10L, 10L, 10L), Variable = estructura (c (2L, 2L, 2L , 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Etiqueta = c ("Carbono", "Fosfato") , class = "factor")), .Names = c ("Profundidad", "Conc.nM", "Ensayo", "Conc.uM", "Variable"), class = "data.frame", filas.nombres = c (NA, -38L))

1
Marty999 2 ago. 2017 a las 21:22

2 respuestas

La mejor respuesta

Gracias a la respuesta de Brian, y modificando el tema propuesto anteriormente, obtuve la siguiente figura.

Sediment core

Como sugirió, primero debe modificar sus datos manualmente usando algo como esto:

MasterTable$Conc.uM <- MasterTable$Conc.uM *100

Luego, en el código, ajuste su eje con el mismo factor de corrección que el usado anteriormente. Aquí está el código para hacer la figura.

ggplot(MasterTable)+
  geom_line(aes(Depth,Conc.nM))+
  geom_area(aes(Depth,Conc.uM, fill=Variable), alpha=0.6)+                            #Area for second X-axis
  geom_area(aes(Depth,Conc.nM), alpha=0.95)+                                     
  geom_point(aes(Depth,Conc.uM), size=1, shape=16, alpha=0.3)+                        #Adding points for second X-axis
  geom_point(aes(Depth,Conc.nM), size=1, shape=16, alpha=0.8)+   
  scale_fill_manual(values=colours) + scale_colour_manual(values=colours) +      

  labs(title="Sediment core", color="",fill="")  +                                    #Place legend title in both color="" and fill=""

  scale_y_continuous("Metal concentration (nM)", 
                 sec.axis = sec_axis(~ . /100, name = "[Pi] (uM)                                             DOC (mg/L)"))+    
  scale_x_continuous("Depth (cm)", breaks=pretty_breaks(n=7))+

  coord_flip()+                                                                       #Required to make a proper depth profile 
  theme_new+                                                                          #Reference to custom theme
  facet_grid(. ~ Assay, scales = "free")                                              #Scales makes that the axis size can change 

Ahora solo me queda un problema por resolver. Me gustaría que las marcas de verificación y las etiquetas estuvieran debajo de la faceta. Parece más lógico y menos ocupado que tenerlo en la parte superior de la figura.

2
Marty999 3 ago. 2017 a las 00:16

De tu código:

...
  scale_x_continuous("Depth (cm)", sec.axis = sec_axis(~ . *100, name = "Carbon & Phosphate"))+
  scale_y_continuous("Metal concentration (nM)") + 
  coord_flip() ...

Considere a qué eje primario desea que "Carbono y fosfato" sea paralelo. También considere lo que significan "eje x" y "eje y" en el contexto del uso de coord_flip.

TL; DR : simplemente mueva su eje secundario a scale_y_continuous.

0
Brian 2 ago. 2017 a las 19:35