Fonction pour assigner un angle à un point dans un graphique classique

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 03 Avr 2020, 16:21

Bonjour,

Je poste mon premier message après avoir sillonné à plusieurs reprises le forum pour me former et trouver des solutions à mes problèmes! Supers site et communautés!

Pour ce qui m'amène à poster aujourd'hui, il faut avouer que je n'ai pas trouvé de solution ni de piste sur des discussions.

En fait, je réalise un graph avec la fonction plot() classique dans le quel je projette des points triangles (pch=24). Ces points sont positionnés avec un X et un Y.

En plus, je souhaite assigner un angle à ces triangles pour qu'ils ne soient pas tous projetés sur le graph avec le manque angle et donc qu'ils n'apparaissent pas tous exactement dans le même sens. Suis je clair? En bonus, il faudrait que je puisse identifier le sommet de départ du triangle car rien ne ressemble plus au triangle de départ qu'un triangle qui tourne à 90°C :-)

Connaissez vous:
Une fonction ou une modalité dans plot() qui permette de le faire?
Le moyen de créer un nouveau type de point auquel je pourrai assigner directement l'angle désiré?

Merci d'avance

Antò

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 03 Avr 2020, 18:09

oups
pour qu'ils ne soient pas tous projetés sur le graph avec le MEME angle

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Eric Wajnberg » 04 Avr 2020, 15:43

La forme triangle est affectée a pch=24 avec la pointe en haut. Aucun moyen de changer ceci.

En revanche, vous pourriez vous en sortir en retraçant chaque triangle avec la fonction lines(), et les orienter avec l'angle qui vous convient.

Il a peut-être d'autres solutions plus élaborées, mais je ne les connais pas.

HTH, Eric.

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 05 Avr 2020, 08:56

Ok merci beaucoup,
Je testerai.

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 05 Avr 2020, 08:58

J'ai pensé aussi à assigner une couleur au triangle en fonction de cet angle.
Moins visuel, mais l'info sera là
A suivre

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Eric Wajnberg » 05 Avr 2020, 09:28

Anthony Sturbois a écrit :J'ai pensé aussi à assigner une couleur au triangle en fonction de cet angle.
Moins visuel, mais l'info sera là
A suivre

C'est une idée effectivement. Vous deviez peut-être également chercher du côté du tracé de champs de vecteurs, par exemple la fonction vectorfield() du package pracma, etc.

Merci de nous tenir informés.

Eric.

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar François Bonnot » 05 Avr 2020, 20:48

Bonjour,
Une suggestion (on obtient d'autres polygones en passant un paramètre edges > 3)

Code : Tout sélectionner

polyg <- function(xcenter,ycenter,radius,angle,bg,fg,lwd=1,edges=3) {
    angle <- angle*pi/180
    theta <- ((0:(edges-1)))*2*pi/edges
    centers <- cbind(xcenter,ycenter)
    for (i in 1:nrow(centers)) {
        x <- cos(theta+angle[i])*radius
        y <- sin(theta+angle[i])*radius
        polygon(centers[i,1]+x,centers[i,2]+y,border=fg,col=bg,lwd=lwd,density=-1)
    }
}

df <- expand.grid(x=1:5, y=1:5)
plot(df$x,df$y,xlim=c(0,6),ylim=c(0,6), asp=1)
df$angle <- (1:nrow(df))*10 ## en degrés
polyg(df$x,df$y,radius=0.5,angle=df$angle,bg="yellow",fg="blue",lwd=1)
François

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 06 Avr 2020, 07:25

Merci à tous,
Je vais regarder tout cela. Il s'agit de piste que je ne connait pas.
Antò

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 06 Avr 2020, 10:19

Encore merci Eric pour tes propositions, c'est une chose qui pourrait me servir à l'avenir.
Toutefois je vais tenter d'exploiter la piste de François dans un premier temps qui réponds mieux à mes attentes de départ
And... it works very well!!! Merci beaucoup!

Deux dernières questions pour essayer de compléter la fonction

1- Comment vous prendriez vous pour faire varier la taille des triangles (en fonction d'un vecteur de taille)
J'ai essayé de modifier la fonction en ajoutant cex, mais je n'y suis pas parvenu.

Code : Tout sélectionner

polyg <- function(xcenter,ycenter,radius,angle,bg,fg,lwd=1,edges=3,cex) {
  angle <- angle*pi/180
  theta <- ((0:(edges-1)))*2*pi/edges
  centers <- cbind(xcenter,ycenter)
  for (i in 1:nrow(centers)) {
    x <- cos(theta+angle[i])*radius
    y <- sin(theta+angle[i])*radius
    polygon(centers[i,1]+x,centers[i,2]+y,border=fg,col=bg,lwd=lwd,density=-1,cex=cex)
  }
}


Code : Tout sélectionner

Error in polygon(centers[i, 1] + x, centers[i, 2] + y, border = fg, col = bg,  :
  l'argument "cex" est manquant, avec aucune valeur par défaut



2.J'utilise une gamme d'angle de 0 à 180°. Quand je suis à 0 ou 180 le triangle tourne à 90°C d'un côté ou de l'autre et on ne sais pas si le triangle n'a pas pivoté ou si au contraire il a pivoter à 90 dans un sens ou dans l'autre? Une idée pour visualiser le sommet serait de récupérer les coordonnées du X et du Y du sommet (après avoir appliqué le vecteur de taille) et de projeter un point dessus pour pouvoir le repérer. Là j'avoue que je ne vois pas comment m'y prendre.

Encore merci pour vos réponses et merci d'avance ;-)

Antò

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar François Bonnot » 06 Avr 2020, 11:39

Autre suggestion :

Code : Tout sélectionner

polyg <- function(xcenter,ycenter,radius,angle,bg,fg,lwd=1,edges=3) {
    angle <- angle*pi/180
    theta <- ((0:(edges-1)))*2*pi/edges
    centers <- cbind(xcenter,ycenter)
    if (length(radius)==1) radius <- rep(radius,nrow(centers))
    for (i in 1:nrow(centers)) {
        x <- cos(theta+angle[i])*radius[i]
        y <- sin(theta+angle[i])*radius[i]
        polygon(centers[i,1]+x,centers[i,2]+y,border=fg,col=bg,lwd=lwd,density=-1)
        points(centers[i,1]+x[1],centers[i,2]+y[1],col="red",pch=16)
    }
}

df <- expand.grid(x=1:5, y=1:5)
plot(df$x,df$y,xlim=c(0,6),ylim=c(0,6), asp=1)
df$angle <- (0:(nrow(df)-1)*10) ## en degrés
df$radius <- (1:nrow(df))/nrow(df)*0.4 + 0.1
polyg(df$x,df$y,radius=df$radius,angle=df$angle,bg="yellow",fg="blue",lwd=1)
François

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 06 Avr 2020, 13:33

Si beau et efficace!
Merci François
Au plaisir de te croiser pour t'offrir une bière (qui sait!? :-) )
Antò

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 06 Avr 2020, 13:33

Si beau et efficace!
Je parlais du script hein !

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Bastien Gamboa » 07 Avr 2020, 07:49

Bonjour,

Une autre approche pourrait être d'utiliser un symbole avec la fonction text(), et le faire tourner grâce à l'argument srt.
Voici un exemple avec le signe '>' et un triangle isocèle (ASCII), afin de différencier les rotations >90 (même si c'est pas si évident à voir pour ce dernier).

Code : Tout sélectionner

plot(1:10, col="white")
for(
i in 1:10) text(x=i, y=i, labels=">", srt=i*10, col=i)
for(
i in 1:10) text(x=i, y=10-i, labels="\21", srt=i*10, col=i)
gtools::asc("\21") # 17, the 'dc1' ASCII symbol   

Pour le calcul des angles, l'approche de François peut être réutilisée.

HTH,
Bastien

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 08 Avr 2020, 17:38

Merci pour cette bonne idée également!

Anthony Sturbois
Messages : 38
Enregistré le : 07 Nov 2019, 07:49

Re: Fonction pour assigner un angle à un point dans un graphique classique

Messagepar Anthony Sturbois » 09 Avr 2020, 16:45

Bonsoir
Afin d'améliorer la lecture graphique, je me demande si une rotation de part et d'autre d'un axe (avec le sommet point rouge fixe) ne serait pas plus lisible qu'une rotation basée sur le centre de triangle.
Je pense que cette modification est applicable au script de François, mais pas sur pour celui de Bastien.
François, à quel argument de la fonction me conseilles tu de m'attaquer?
Merci d'avance
Antò


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité