4
votes

Coche mineure à l'échelle logarithmique à l'extérieur de la ligne d'axe avec annotation_logticks ou alternative

annotation_logticks () est une super petite fonction qui ajoute des graduations mineures à un axe d'échelle logarithmique, comme indiqué ici .

Par défaut, la fonction dessine des graduations à l'intérieur de la zone de panneau du tracé. Par exemple, si sur l'axe y, des graduations apparaissent sur le côté droit de la ligne d'axe; si sur l'axe des x, des graduations apparaissent au-dessus de la ligne de l'axe.

 exemple du site Web ggplot2

Je trouve cette valeur par défaut indésirable pour la plupart des situations de traçage. Jusqu'à présent, je n'ai pas trouvé de moyen simple d'afficher ces graduations mineures à l'extérieur de la zone du panneau où les graduations ggplot2 régulières apparaissent. Ainsi par exemple sur l'axe y apparaissant sur le côté gauche de la ligne au lieu de la droite. Y a-t-il une solution simple à cela?

Pour tracer des situations où l'interpolation des valeurs entre les graduations majeures est importante, ce serait une très bonne option de les faire apparaître sur le côté gauche où les étiquettes et les graduations régulières de ggplot2 apparaissent normalement. Je n'ai pas encore trouvé de solution qui n'implique pas de couper ou d'abandonner complètement annotation_logticks (), et je n'ai pas réussi à utiliser simplement une valeur négative pour la longueur de la graduation.

Voici le code directement à partir de l'exemple de site Web ggplot2:

a <- ggplot(msleep, aes(bodywt, brainwt)) +
 geom_point(na.rm = TRUE) +
 scale_x_log10(
   breaks = scales::trans_breaks("log10", function(x) 10^x),
   labels = scales::trans_format("log10", scales::math_format(10^.x))
 ) +
 scale_y_log10(
   breaks = scales::trans_breaks("log10", function(x) 10^x),
   labels = scales::trans_format("log10", scales::math_format(10^.x))
 ) +
 theme_bw()

a + annotation_logticks()

Je recherche un résultat qui fait simplement basculer les coches de l'autre côté du ligne d'axe.


0 commentaires

3 Réponses :


4
votes

Pour autant que je sache, oui mais c'est un peu dégoûtant. TLDR ::

a5 <- a4 + theme(axis.text.x=element_text(margin = margin(t = 10)),
      axis.text.y=element_text(margin = margin(r = 10)))
a5

donne

entrez la description de l'image ici

Vous devez truquer les 0,01 et - 100 dans le annotation_custom.


Si vous regardez annotation_logticks dans la console, il contient

a4 <- a3 +
   annotation_custom(
    grob=rectGrob(gp=gpar(col=NA)),
    xmin=-100, xmax=min(ab$x.range) + 0.01,
    ymax=min(ab$y.range) + 0.01, ymin=-100
  )
a4


0 commentaires

3
votes

J'ai trouvé un moyen soigné de résoudre ce problème, bien que cette solution n'ait pas la même longueur de graduation qu'avec annotation_logticks()

logticks <- function(datavar,type) {

  minimum <- 1/10^abs(floor(log10(min(datavar, na.rm=TRUE))))
  maximum <- 1*10^abs(floor(log10(max(datavar, na.rm=TRUE)))+1)
  multiple <- floor(log10(maximum/minimum))

  yourtickvector <- c()

  if (type=="breaks") {

    yourtickvector <- c(minimum)

    for (x in seq(0,multiple)) {

      andadd <- seq(minimum*10^x,minimum*10^(x+1),minimum*10^x)[-1]

      yourtickvector <- c(yourtickvector,andadd)

    }

  } else if (type=="labels") {

    for (x in seq(0,multiple)) {

      andadd <- c(minimum*10^x,rep("",8))

      yourtickvector <- c(yourtickvector,andadd)

    }

    yourtickvector <- c(yourtickvector,minimum*10^multiple)

  }

  return(yourtickvector)

}

# only changed the breaks / label fields below to call the above function

a <- ggplot(msleep, aes(bodywt, brainwt)) +
  geom_point(na.rm = TRUE) +
  scale_x_log10(
    breaks = logticks(msleep$bodywt,"breaks"),
    labels = logticks(msleep$bodywt,"labels")
  ) +
  scale_y_log10(
    breaks = logticks(msleep$brainwt,"breaks"),
    labels = logticks(msleep$brainwt,"labels")
  ) +
  theme_bw()

a

entrez description de l'image ici


0 commentaires

0
votes

J'ai réalisé que si vous voulez que le coord_cartesian fonctionne, vous devez d'abord définir vos "pauses", "limites" et "étiquettes" dans la commande de mise à l'échelle:

scale_y_log10(breaks = c(0.1, 1, 10, 100, 1000, 10000,100000),limits = c(0.1,100000),labels=c(0.1, 1, 10, 100, 1000, 10000, "100000")) +
  annotation_logticks(sides = "l", outside = T, short = unit(0.05, "cm"),mid = unit(0.05, "cm"),long = unit(0.2, "cm"))+
  coord_cartesian(clip = "off")
tique à l'extérieur


0 commentaires