web-dev-qa-db-fra.com

ggplot étiquettes d'axe x avec toutes les valeurs d'axe x

Je complote ggplot avec geom_point. L'axe des x sera l'identifiant des individus et l'axe des y est la variable A. Comment puis-je effectuer un graphe de tracé de toutes les valeurs d'ID individuelles sur l'axe des x sans chevauchement des étiquettes? L'identification peut ne pas être continue.

échantillon df (les lignes réelles sont beaucoup plus longues)

> df
ID     A
1      4
2      12
3      45
5      1

Code de la parcelle:

ggplot(df, aes(x = ID, y = A)) + geom_point()

Le code ci-dessus a l'axe des x dans les intervalles, mais ne présente pas d'identifiant individuel.

Merci!

9
Lumos

Est-ce ce que vous cherchez?

ID <- 1:50
A <- runif(50,1,100)

df <- data.frame(ID,A)

ggplot(df, aes(x = ID, y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  scale_x_continuous("ID", labels = as.character(ID), breaks = ID)

Cela produira cette image:

enter image description here

Vous obtiendrez ainsi une étiquette pour chaque valeur d’ID. Si vous souhaitez supprimer les lignes de la grille (il y en a trop à mon goût), vous pouvez les supprimer en ajoutant theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

EDIT: Le moyen le plus simple consisterait simplement à utiliser l'ID en tant que facteur pour le tracé. comme ça:

ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID")

enter image description here

L'avantage de cette méthode est que vous n'obtenez pas d'espaces vides à partir d'identifiants manquants.

EDIT2: Concernant votre problème avec des étiquettes qui se chevauchent: je suppose que cela provient d'un grand nombre d'identifiants à tracer. Il y a plusieurs façons de gérer cela. Disons donc que votre intrigue ressemble à ceci:

enter image description here

Une idée serait de masquer chaque troisième étiquette de l’axe des x en modifiant l’argument de rupture de l’axe:

ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  scale_x_discrete(breaks = ID[c(T,F,F)]) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID")

ce qui conduit à ceci:

enter image description here

Si vous ne pouvez pas masquer les étiquettes, vous pouvez scinder votre parcelle en sous-parcelles.

df$group <- as.numeric(cut(df$ID, 4))

ggplot(df, aes(x = factor(ID), y = A)) + 
  geom_point() + 
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5)) +
  xlab("ID") +
  facet_wrap(~group, ncol = 1, scales = "free_x")

ce qui conduit à ceci:

enter image description here

26
brettljausn