2017-07-27 1 views
6

Je souhaite dupliquer l'axe Y gauche sur un tracé ggplot2 sur le côté droit, puis modifier les graduations pour un axe discret (catégoriel).Duplication (et modification) d'un axe discret dans ggplot2

J'ai lu la réponse à this question, mais comme on le voit on the package's repo page, la fonction switch_axis_position() a été retiré de l'emballage cowplot (l'auteur cité (fonctionnalité native à venir?) Dans ggplot2).

J'ai vu la page reference sur les axes secondaires dans ggplot2, mais tous les exemples dans ce document utilisent scale_y_continuous plutôt que scale_y_discrete. Et, en effet, lorsque je tente d'utiliser la fonction discrète, je reçois l'erreur:

Error in discrete_scale(c("y", "ymin", "ymax", "yend"), "position_d", : 
unused argument (sec.axis = <environment>) 

Y at-il de toute façon de le faire avec ggplot2? Même une solution complètement piratée suffira pour moi. Merci d'avance. (MREs ci-dessous)

library(ggplot2) 

# Working continuous plot with 2 axes 
ggplot(mtcars, aes(cyl, mpg)) + 
    geom_point() + 
    scale_y_continuous(sec.axis = sec_axis(~.+10)) 


# Working discrete plot with 1 axis 
ggplot(mtcars, aes(cyl, as.factor(mpg))) + 
    geom_point() 


# Broken discrete plot with 2 axes 
ggplot(mtcars, aes(cyl, as.factor(mpg))) + 
    geom_point() + 
    scale_y_discrete(sec.axis = sec_axis(~.+10)) 
+0

regardant la source de 'scale_y_discrete' il n'y a pas d'option/l'argument pour spécifier l'axe secondaire. Donc, toute solution devra probablement être un hack. – SymbolixAU

Répondre

6

Prenez votre facteur discret et représentez-le numériquement. Vous pouvez ensuite le mettre en miroir et renommer les graduations pour qu'elles correspondent aux niveaux de facteur et non aux nombres.

library(ggplot2) 

irislabs1 <- levels(iris$Species) 
irislabs2 <- c("foo", "bar", "buzz") 

ggplot(iris, aes(Sepal.Length, as.numeric(Species))) + 
    geom_point() + 
    scale_y_continuous(breaks = 1:length(irislabs1), 
        labels = irislabs1, 
        sec.axis = sec_axis(~., 
             breaks = 1:length(irislabs2), 
             labels = irislabs2)) 

Puis violon avec l'argument expand = à l'échelle au besoin d'imiter de plus près l'échelle discrète par défaut.

enter image description here

+1

selon ggplot help "Les valeurs par défaut sont c (0,05, 0) pour les variables continues, et c (0, 0,6) pour les variables discrètes." pour moi expand = c (0,0.6) a donné de très bons résultats – TobiO