web-dev-qa-db-fra.com

Ajouter x = ligne Y au satterPlot

J'utilise la fonction SatterPlot de l'emballage de voiture pour générer une dispersion. Je veux pouvoir générer une ligne de référence dans l'intrigue qui devrait être x = y. J'ai essayé d'utiliser Abline et il ajoute une ligne mais ce n'est pas la ligne X = y. Quelqu'un peut-il aider?

Mon code est comme suit:

scatterplot(phenos$P1~pheno$P0, data=pheno,spread=FALSE,ylab="6 month timepoint", xlab="Baseline Timepoint", jitter=list(x=1, y=1))
abline(0,1)

Merci.

11
CadisEtRama

C'est en fait assez difficile/piraquable, car scatterplot() Utilisations internes layout, ce qui permet de contrôler le sous-titre actuellement utilisé par le pilote graphique. (-Mise à jour: C'est plus difficile que je pensais - la définition par("mfg") doit avoir travaillé plus ou moins par accident.)

Données de maquillage (Mise à jour: Utiliser des données avec des signes X et Y non égaux zéro et ne sont pas égaux les uns aux autres, car il illustrent les difficultés d'utilisation naïvement à l'aide de abline() plus clairement)

set.seed(1)
d <- data.frame(x=rnorm(10,mean=10),y=rnorm(10,mean=12))
library(car)

Essayez mon ancienne stratégie (qui ne fonctionne pas réellement, ou ne fonctionne que de manière imprévisible):

scatterplot(y~x,data=d,reset.par=FALSE)
k <- 1              
for (i in 1:2) {
   for (j in 1:2) {
      par(mfg=c(i,j,2,2))
        abline(0,1,lwd=3,col=k)
        k <- k+1
  }

}

En fonction de la façon dont je fais cela, je reçois des avertissements et des erreurs ou des réponses de faux. Il semble compter si je fais la scatterplot() appelle à l'intérieur d'une fonction ... ??

enter image description here

Deuxièmement, essayez, plus de conservation: reconstruire la mise en page de zéro.

 scatterplot(y~x,data=d)
 uu <- par("usr")
 ## mimic layout frolm car:::scatterplot.default.  Would be different if we were drawing only one
 ## of x-boxes or y-boxes
 layout(matrix(c(1, 0, 3, 2), 2, 2), widths = c(5, 95), 
        heights = c(95, 5))
 oldmar <- par(mar=rep(0,4))  ## zero out margins so we can plot in sub-boxes without errors
 ## now skip through the first two sub-plots
 par(new=TRUE); plot.new(); par(new=TRUE); plot.new()
 par(oldmar)  ## reset margins
 ## blank plot with user limits set and 'interior' axis calculations
 plot(0:1,0:1,xlab="",ylab="",xlim=uu[1:2],ylim=uu[3:4],xaxs="i",yaxs="i")
 ## add annotation
 abline(a=0,b=1,col=4,lwd=3)              

enter image description here

Compte tenu de la quantité d'effort et de fragilité de cette solution, il pourrait en réalité être le meilleur de hack scatterplot _ pour permettre éventuellement abline() à spécifier ou de demander au responsable de cette capacité ...

1
Ben Bolker

Vous pouvez atteindre votre objectif de la même fonction abline. Utilisez la fonction abline(a=0, b=1)a et b sont respectivement l'interception et le pont de la ligne. Cela vous attire une ligne droite de la forme Y = a + b*x.

J'espère que cela t'aides.

Je viens d'utiliser la fonction Segments: segments (x0 = 0, y0 = 0, x1 = 45, y1 = 45)

Faites simplement que les valeurs Y vont juste au-dessus des limites de votre parcelle.

Cette fonction est également agréable car elle ne change pas vos limites X et Y afin que la ligne puisse fonctionner propre sur votre graphique sans avoir à choisir avec précision les valeurs X et Y.

3
Denys Kelly