Mettre à jour
Si vous souhaitez que l'apparence ressemble au graphique de gauche plutôt qu'au graphique de droite :
Alors tout ce dont vous avez besoin est rev()
dans geom_col
:
geom_col(aes(x = ID, y = rev(-(190-C)/5)))
Laissez-moi savoir si j'ai encore mal compris ce que vous recherchez.
Réponse originale
Si vous voulez que les barres descendent, elles doivent contenir des valeurs négatives.
Probablement que vous le savez déjà.
Lorsque vous ajoutez un deuxième axe Y, c'est juste visuel; aucune de vos traces ne suit réellement cet axe. Le 'tour de passe-passe' est la transformation.
Si vous voulez que les barres soient au-dessus des lignes comme s'il y avait un axe zéro pour les barres en haut et un axe zéro en bas pour les lignes, certaines choses doivent changer.
-
les barres doivent être négatives pour aller vers le bas; c'est ce qui fait bouger tout le reste
-
les lignes doivent être inférieures aux valeurs des barres sans perdre le rapport d'aspect (pour faute d'un meilleur terme)
La manière la plus simple de transformer le y dans les lignes pour s'assurer que les barres ne se chevauchent pas est de compenser les deux traces en inversant le y actuel et en ajoutant la plus grande valeur apparaissant dans la trace de barre.
Tout d'abord, trouvez cette valeur de compensation :
offset = max((190 - Mydata$C)/5) # combien décaler les autres traces
Vérifiez où nous en sommes jusqu'à présent, avec les y inversés et compensés :
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5))
Ensuite, nous devons corriger les deux axes y. En commençant par l'axe y sur la gauche, nous devons faire en sorte que cela ressemble à si nous n'avions pas inversé tout. Pour cela, nous devons trouver la valeur négative réelle qui reflète le zéro perçu sur l'axe y.
Comme la colonne B
a la plus grande valeur (à 20), je l'ai utilisée pour déterminer où se situe le bas. De plus, étant donné que la valeur la plus basse entre A et B est 1, nous allons ajouter -1 pour obtenir cette ligne zéro. Pour trouver le bas où nous voulons la ligne zéro, trouvez le minimum de la colonne B inversée - compensée moins 1.
btm = min(-1 * Mydata$B - offset - 1) # parce que la valeur minimale est 1
Regardez où nous en sommes jusqu'à présent :
btm = min(-1 * Mydata$B - offset - 1) # parce que la valeur minimale de B est 1
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10))
Il est temps d'ajouter le deuxième axe y.
J'ai inversé le signe sur la transformation et j'ai regardé où les nombres se sont positionnés sur le deuxième axe y.
btm = min(-1 * Mydata$B - offset - 1) # parce que la valeur minimale de B est 1
offset = max((190 - Mydata$C)/5)
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10),
sec.axis = sec_axis(~190 + . * 5)) # changé le signe !
Ensuite, nous devons déterminer où se situe notre zéro perçu en haut sur le deuxième axe y. Pour calculer ceci, nous avons besoin du maximum de la colonne C, lorsqu'elle est calculée comme dans le graphique et transformée comme l'axe est transformé, puis modifiée par la plus grande valeur de C, la plus grande valeur de B et la compensation déjà calculée.
top = max(((190 + (-(190 - Mydata$C)/5) * 5) + offset - btm + max(Mydata$B)))
Remarquez que dans cet appel pour créer cette valeur :
Le Y dans les barres est :
-(190 - Mydata$C)/5
Le Y dans les barres transformé par le deuxième axe est :
190 + (-(190 - Mydata$C)/5) * 5
Et voilà ! Vous pouvez ajuster les étiquettes maintenant qu'elles sont prêtes comme bon vous semble. (Je suppose que vous avez quelque chose en tête.)
btm = min(-1 * Mydata$B - offset - 1) # parce que la valeur minimale de B est 1
offset = max((190 - Mydata$C)/5)
top = max(((190 + (-(190 - Mydata$C)/5) * 5) + offset - btm + max(Mydata$B)))
ggplot(data = Mydata) +
geom_line(aes(x = ID, y = -A - offset)) +
geom_line(aes(x = ID, y = -B - offset)) +
geom_col(aes(x = ID, y = -(190-C)/5)) +
scale_y_continuous(breaks = seq(btm, by = 10, length.out = 5),
labels = seq(0, 40, 10),
sec.axis = sec_axis(~190 + . * 5, # changé le signe !
breaks = seq(top - 20 * 4, top, by = 20),
labels = seq(100, 0, by = -25)))