2
votes

Ajout d'un espace entre l'axe des x et les barres, dans ggplot

J'ai le bloc de données suivant:

ggplot(df, aes(x,y)) + 
  geom_col() + 
  coord_cartesian(ylim = c(1,4)) +
  scale_y_continuous(
    expand = expand_scale(add = c(0.2,0)))

et le graphique correspondant:

ggplot(df, aes(x,y)) + 
  geom_col()

 entrez la description de l'image ici

Mon échelle va de 1 à 5, donc je ne veux pas que le 0 apparaisse sur l'axe y mais je veux que l'axe y commence à 1. Pourtant, je veux toujours l'espace vide ci-dessous les barres.

df = data.frame(x = c('a', 'b'),
                y = c(2,4))

entrez la description de l'image ici

Comme vous le voyez, l'axe des y commence effectivement à 1, mais maintenant, l'espace sous le 1 est rempli de la barre noire et n'est plus vide. Les autres articles que j'ai consultés traitent de cas où l'axe y commence à 0, donc expand_scale () a fait le travail. Pas dans mon cas.

Une idée sur la façon de résoudre ce problème?


4 commentaires

Je ne sais pas. Voulez-vous donner plus de détails? \


Si vous souhaitez produire un graphique personnalisé avec des étiquettes spécifiques, vous pouvez simplement renommer l'axe. Mais gardez à l'esprit que ne pas inclure 0 et présenter le résultat sous forme de graphique à barres est pur blasphème .


Je ne sais pas pourquoi il s’agit d’un «pur blasphème». Dans mes recherches, les participants indiquent l'étendue à laquelle ils sont d'accord avec une déclaration, de 1 (je ne suis pas d'accord) à 5 (je suis d'accord). Il n'y a donc vraiment aucun 0 dans mes données.


Ensuite, votre utilisation tombe dans la catégorie «tracé personnalisé». Un graphique à barres aurait votre 1-5 sur l'axe x , et la réponse compte sur le y . Pour autant que je sache, vous voulez afficher un seul cas, ne dessinant aucune marque si la réponse était 1, et une barre de 1 à la valeur de réponse sinon?


4 Réponses :


0
votes

Si je comprends bien votre problème, vous avez plusieurs niveaux de réponse et vous voulez que chaque individu le représente. Pourriez-vous envisager une représentation avec un axe y qui est discrète?

Cela n'évite pas votre problème de 0 ou 1 mais en fait seul le niveau est important. S'il n'y a rien, c'est juste parce que vous n'avez pas la réponse donc c'est 0. Je ne sais pas si vous êtes d'accord avec ma proposition:

df = data.frame(x = c('a', 'b', 'c', 'd'),
                y = factor(c(1, 2, 3, 4), levels = 1:4))


ggplot(df, aes(x, y)) + 
  geom_col() +
  scale_y_discrete(expand = expand_scale(add = 1.2))


1 commentaires

Les deux approches n'ont pas fonctionné. Dans les deux cas, le 0 apparaît sur l'axe y. Comme je l'ai spécifié dans le texte principal, j'ai besoin de l'axe y pour commencer à 1



2
votes

Dans ggplot, vous pouvez utiliser position_nudge () pour déplacer effrontément un geom entier d'une distance fixe:

ggplot(df, aes(x,y)) + 
      geom_col(position = position_nudge(y=1)) + #move everything up one
      ylim(c(0,5)) #set the y axis limits


2 commentaires

J'ai déjà position = position_dodge () dans mon code. Comment puis-je utiliser position_nudge () dessus?


Avez-vous essayé de remplacer position_dodge () par position_nudge () ? En fonction de vos données, il peut faire ce que vous voulez. Sinon, je ne suis pas sûr.



2
votes

Vous pouvez utiliser les limites de scale_y_continuous pour indiquer la plage que vous souhaitez afficher. NA dans les limites est «utiliser la valeur par défaut». Maintenant, normalement, cela enlèverait les deux barres car elles sont hors limites (oob), mais vous pouvez résoudre ce problème en définissant l'argument oob des échelles sur squish code >, qui est une fonction trouvée dans le package scale.

library(scales)

ggplot(df, aes(x,y)) + 
  geom_col() +
  scale_y_continuous(limits = c(1, NA), oob = squish)

entrez la description de l'image ici


2 commentaires

Cela a fonctionné, merci. Pouvez-vous expliquer pourquoi les barres disparaissent si je ne fais que définir l'argument des limites? Pourquoi sont-ils hors de portée? Les valeurs dans les données ci-dessus sont 2 et 4, alors pourquoi fixer des limites = c (1, NA) enlève les barres?


ggplot voit les barres comme des rectangles qui ont des coordonnées ymin = 0 , donc lorsque le limits = c (1, NA) , le ymin sera en dessous la limite inférieure. Par conséquent, le comportement par défaut (qui utilise scale :: censor () ) supprimera ces rectangles car les coordonnées sont hors limites.



0
votes

Remplacez coord_cartesian () par ce qui suit:

ggplot(df, aes(x,y)) + 
  geom_col() + 
  coord_cartesian(ylim=c(1,5), expand=F) +
  scale_y_continuous(
    expand = expand_scale(add = c(0.2,0)))

Voici l'appel complet à ggplot () avec le changement: p>

coord_cartesian(ylim=c(1,5), expand=F)


1 commentaires

Bien que ce code puisse résoudre la question, y compris une explication expliquant comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre post, et entraînera probablement plus de votes positifs. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limitations et hypothèses applicables.