web-dev-qa-db-fra.com

Inverser l'échelle de l'axe des x dans un tracé

J'ai créé un tracé en R et mes propres axes x et y personnalisés. Je souhaite que l'axe x soit affiché dans un ordre inverse (1-0 par -.02). J'ai lu de nombreux articles et discussions qui suggèrent d'utiliser xlim et reverse range mais je n'arrive pas à le faire fonctionner. Une fois tracé, je convertis également les étiquettes des axes en pourcentages en multipliant par 100 (comme vous le verrez dans le code). Voici ce que j'ai jusqu'à présent;

plot(roc.val, xlab = "Specificity (%)", ylab = "Sensitivity (%)", axes = FALSE)
axis(2, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)
axis(1, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)

Comment inverser l'échelle de l'axe des x pour que les valeurs commencent à 100 et se terminent à 0 par incréments de 20?

11
Courtney

Je pense que cela crée un tracé dans lequel l'axe des y est dans l'ordre inverse:

x <- seq(-4, 4, length = 10)
y <- exp(x) / (1 + exp(x))
plot(x,y, ylim = rev(range(y)))

Cela supprime les valeurs des axes:

x <- seq(-4, 4, length = 10)
y <- exp(x) / (1 + exp(x))
plot(x,y, ylim = rev(range(y)), labels = FALSE)

Je suppose que vous pouvez ensuite attribuer les valeurs d'axe que vous souhaitez avec une variation de vos lignes:

axis(2, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)
axis(1, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)
10
Mark Miller
df <- data.frame(x=seq(0,1, length.out=50), y=seq(0, 1, length.out=50))
plot(df)

enter image description here

df$x1 <- (max(df$x) - df$x)/ (max(df$x) - min(df$x))
plot(df$x1, df$y, axes=F, xlab = "Specificity (%)", ylab = "Sensitivity (%)")
axis(2, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)
axis(1, at = seq(0,1,by=.2), labels = paste(100*seq(1,0, by=-.2)), tick = TRUE)

enter image description here

2
Adam Quek

Adapter la réponse de Mark Miller pour résoudre un problème similaire (j'ai trouvé ce sujet en recherchant la solution) et j'ai trouvé une variante de sa solution dans https://tolstoy.newcastle.edu.au/R/help/05 /03/0342.html .
Fondamentalement, si vous souhaitez inverser les valeurs de l'axe X dans le tracé, au lieu d'utiliser ylim = rev (plage (y)), vous pouvez utiliser xlim = rev (c (-4,4)).

x <- seq(-4, 4, length = 10)
y <- exp(x) / (1 + exp(x))
par(mfrow=c(1,2))
plot(x, y, ylim=range(y), xlim=c(-4, 4))
plot(x, y, ylim=range(y), xlim=rev(c(-4, 4)))

plot1

Et si vous souhaitez conserver les valeurs de l'axe des x dans le véritable ordre, vous pouvez utiliser ceci:

par(mfrow=c(1,1))
plot(x, y, ylim=range(y), xlim=c(-4, 4), axes=FALSE)
par(new=TRUE)
plot(-100, -100, ylim=range(y), xlim=c(-4, 4), axes=FALSE, xlab="", ylab="", main="")
axis(1, at = seq(-4,4,by=1), labels = seq(-4,4,by=1), tick = TRUE)
axis(2, at = seq(0,1,by=.2), labels = paste(100*seq(0,1, by=.2)), tick = TRUE)

plot2

Je poste cette solution car j'avais besoin de quelque chose de très simple pour résoudre mon problème. Et la solution pour cela avait besoin du tracé avec la valeur de l'axe X dans le bon ordre (et non inversé).

2
Eduardo Alvim

Tout d'abord, consultez la bibliothèque ggplot2 Pour créer de superbes graphiques extensibles. Il fait partie de l'approche Tidyverse de R et d'un gamechanger si vous n'y avez pas été exposé.

Par exemple, pour résoudre votre problème à l'aide de ggplot, il vous suffit d'ajouter le terme scale_x_reverse() à votre graphique.

Voir: http://ggplot.yhathq.com/docs/scale_x_reverse.html

1
Daniel