Visualisation des combinaisons de 2 lettres

10

Les réponses à cette question sur SO ont renvoyé un ensemble d'environ 125 noms d'une à deux lettres: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r-objets

  [1] "Ad" "am" "ar" "as" "bc" "bd" "bp" "br" "BR" "bs" "by" "c"  "C" 
 [14] "cc" "cd" "ch" "ci" "CJ" "ck" "Cl" "cm" "cn" "cq" "cs" "Cs" "cv"
 [27] "d"  "D"  "dc" "dd" "de" "df" "dg" "dn" "do" "ds" "dt" "e"  "E" 
 [40] "el" "ES" "F"  "FF" "fn" "gc" "gl" "go" "H"  "Hi" "hm" "I"  "ic"
 [53] "id" "ID" "if" "IJ" "Im" "In" "ip" "is" "J"  "lh" "ll" "lm" "lo"
 [66] "Lo" "ls" "lu" "m"  "MH" "mn" "ms" "N"  "nc" "nd" "nn" "ns" "on"
 [79] "Op" "P"  "pa" "pf" "pi" "Pi" "pm" "pp" "ps" "pt" "q"  "qf" "qq"
 [92] "qr" "qt" "r"  "Re" "rf" "rk" "rl" "rm" "rt" "s"  "sc" "sd" "SJ"
[105] "sn" "sp" "ss" "t"  "T"  "te" "tr" "ts" "tt" "tz" "ug" "UG" "UN"
[118] "V"  "VA" "Vd" "vi" "Vo" "w"  "W"  "y"

Et le code d'importation R:

nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y")

Étant donné que le but de la question était de proposer une liste mémorable de noms d'objets à éviter, et que la plupart des humains ne sont pas si doués pour donner du sens à un bloc de texte solide, je voudrais visualiser cela.

Malheureusement, je ne suis pas exactement certain de la meilleure façon de procéder. J'avais pensé à quelque chose comme un tracé de tige et de feuille, seulement parce qu'il n'y a pas de valeurs répétées chaque "feuille" a été placée dans la colonne appropriée plutôt que d'être laissée justifiée. Ou une adaptation de style wordcloud où les lettres sont dimensionnées en fonction de sa prévalence.

Comment cela pourrait-il être visualisé le plus clairement et le plus efficacement possible?

Les visualisations qui remplissent l'une des conditions suivantes dans l'esprit de cette question:

  • Objectif principal: améliorer la mémorisation de l'ensemble de noms en révélant des modèles dans les données

  • Autre objectif: mettre en évidence les caractéristiques intéressantes de l'ensemble de noms (par exemple, qui aident à visualiser la distribution, les lettres les plus courantes, etc.)

Les réponses en R sont préférées, mais toutes les idées intéressantes sont les bienvenues.

Ignorer les noms à une seule lettre est autorisé, car ceux-ci sont plus faciles à donner en tant que liste distincte.

Ari B. Friedman
la source

Réponses:

12

Voici un début: visualisez-les sur une grille de première et deuxième lettres:

combi <- c("Ad", "am", "ar", "as", "bc", "bd", "bp", "br", "BR", "bs", 
"by", "c",  "C",  "cc", "cd", "ch", "ci", "CJ", "ck", "Cl", "cm", "cn", 
"cq", "cs", "Cs", "cv", "d",  "D",  "dc", "dd", "de", "df", "dg", "dn", 
"do", "ds", "dt", "e",  "E",  "el", "ES", "F",  "FF", "fn", "gc", "gl", 
"go", "H",  "Hi", "hm", "I",  "ic", "id", "ID", "if", "IJ", "Im", "In", 
"ip", "is", "J",  "lh", "ll", "lm", "lo", "Lo", "ls", "lu", "m",  "MH", 
"mn", "ms", "N",  "nc", "nd", "nn", "ns", "on", "Op", "P",  "pa", "pf", 
"pi", "Pi", "pm", "pp", "ps", "pt", "q",  "qf", "qq", "qr", "qt", "r",  
"Re", "rf", "rk", "rl", "rm", "rt", "s",  "sc", "sd", "SJ", "sn", "sp", 
"ss", "t",  "T",  "te", "tr", "ts", "tt", "tz", "ug", "UG", "UN", "V",  
"VA", "Vd", "vi", "Vo", "w",  "W",  "y")

df <- data.frame (first = factor (gsub ("^(.).", "\\1", combi), 
                                  levels = c (LETTERS, letters)),
                  second = factor (gsub ("^.", "", combi), 
                                  levels = c (LETTERS, letters)),
                  combi = combi))

library(ggplot2)
ggplot (data = df, aes (x = first, y = second)) + 
   geom_text (aes (label = combi), size = 3) + 
   ## geom_point () +
   geom_vline (x = 26.5, col = "grey") + 
   geom_hline (y = 26.5, col = "grey")

(était: deux lettres) grille avec lettres

ggplot (data = df, aes (x = second)) + geom_histogram ()

deuxième lettre

ggplot (data = df, aes (x = first)) + geom_histogram ()

première lettre

Je rassemble:

  • des noms à une lettre,

    • heureusement i, j, ket lsont disponibles (donc je ne peux indexer jusqu'à tableaux 4d)
    • malheureusement t(le temps), c(la concentration) sont partis. Il en va de même pour m(masse), V(volume) et F(force). Pas de rayon rni de diamètre d.
    • Je peux cependant avoir une pression ( p), une quantité de substance ( n) et une longueur l.
    • Peut-être que je vais devoir changer pour les noms grecs: εest OK, mais ne devrait pas

      π <- pi

      ?

  • Je peux avoir le lowerUPPERnom que je veux.

  • En général, commencer par une lettre majuscule est un pari plus sûr que les minuscules.

  • ne commence pas par coud

cbeleites
la source
Bon début. Peut-être ajouter des lignes de quadrant (dans un grand +) à travers le tracé 2d pour donner une meilleure idée de l'endroit où vont les lettres majuscules / minuscules?
Ari B. Friedman
Je pensais avoir fait ça. Quoi qu'il en soit, le voici. @ gsk3: merci d'avoir téléchargé les photos!
cbeleites mécontents de SX
Agréable. Et au contraire, merci d'avoir fourni une réponse intéressante à l'invite # 2. :-)
Ari B. Friedman
En regardant votre tracé 2d, une autre suggestion pourrait être de le réduire à une grille 27x26 et de changer les symboles ou les couleurs (ou la gigue avec alpha) si une lettre donnée a plus bas / plus haut / les deux. Pourrait également rendre la ligne NA d'une couleur différente pour la séparer visuellement.
Ari B. Friedman
1
J'ai jeté un coup d'œil à 27 x 26 avant de poster la réponse (avec la couleur et la forme selon la première et la deuxième lettre en majuscule). Mais cela n'a pas transmis un message facile, alors je suis immédiatement retourné pour la plus grande grille.
cbeleites mécontents de SX
8

Ok, voici ma vision très rapide d'une visualisation de type "tableau périodique", basée sur la question SO et les commentaires des autres. Le problème principal est la grande différence de nombre de variables entre les packages, ce qui entrave la visualisation ... Je me rends compte que c'est très difficile, alors n'hésitez pas à le modifier comme vous le souhaitez.

Voici la sortie actuelle (de ma liste de paquets) Exemple de tracé

Et le code

# Load all the installed packages
lapply(rownames(installed.packages()), require, 
       character.only = TRUE)
# Find variables of length 1 or 2
one_or_two <- unique(apropos("^[a-zA-Z]{1,2}$"))
# Find which package they come from
packages <- lapply(one_or_two, find)
# Some of the variables may belong to multiple packages, so determine the length 
# of each entry in packages and duplicate the names accordingly
lengths <- unlist(lapply(packages, length))
var.data <- data.frame(var = rep(one_or_two, lengths), 
                   package = unlist(packages))

Maintenant, nous avons un bloc de données comme celui-ci:

> head(var.data, 10)
   var           package
1   ar     package:stats
2   as   package:methods
3   BD    package:fields
4   bs      package:VGAM
5   bs   package:splines
6   by      package:base
7    c      package:base
8    C     package:stats
9   cm package:grDevices
10   D     package:stats

Nous pouvons maintenant diviser les données par package

 data.split <- split(var.data, var.data$package)

Nous pouvons voir que la plupart des variables proviennent du package de base et de statistiques

> unlist(lapply(data.split, nrow))
     package:base  package:datasets    package:fields 
               16                 1                 2 
  package:ggplot2 package:grDevices  package:gWidgets 
                2                 1                 1 
  package:lattice      package:MASS    package:Matrix 
                1                 1                 3 
  package:methods      package:mgcv      package:plyr 
                3                 2                 1 
     package:spam   package:splines     package:stats 
                1                 2                14 
 package:survival     package:utils      package:VGAM 
                1                 2                 4 

Enfin, la routine de dessin

plot(0, 0, "n", xlim=c(0, 100), ylim=c(0, 120), 
     xaxt="n", yaxt="n", xlab="", ylab="")

side.len.x <- 100 / length(data.split)
side.len.y <- 100 / max(unlist(lapply(data.split, nrow)))
colors <- rainbow(length(data.split), start=0.2, end=0.6)    

for (xcnt in 1:length(data.split))
    {
    posx <- side.len.x * (xcnt-1)

    # Remove "package :" in front of the package name
    pkg <- unlist(strsplit(as.character(data.split[[xcnt]]$package[1]), ":"))
    pkg <- pkg[2]

    # Write the package name
    text(posx + side.len.x/2, 102, pkg, srt=90, cex=0.95, adj=c(0, 0))

    for (ycnt in 1:nrow(data.split[[xcnt]]))
        {
        posy <- side.len.y * (ycnt-1)
        rect(posx, posy, posx+side.len.x*0.85, posy+side.len.y*0.9, col = colors[xcnt])
        text(posx+side.len.x/2, posy+side.len.y/2, data.split[[xcnt]]$var[ycnt], cex=0.7)
        }
    }
Nico
la source
1
Agréable! Une façon intéressante de procéder serait de les regrouper par catégorie (par exemple, les packages graphiques, les pratiques de manipulation de données, etc.), de les coder par couleur, puis de rendre la forme globale plus semblable à une boîte qu'à un histogramme.
Ari B. Friedman
+1 Quel régal! :) Très bon travail. Je suppose que la seule chose qui serait nécessaire pour obtenir la fonctionnalité de tableau périodique est la disposition du tableau. Le PT standard a 2 grilles, avec certains éléments manquants dans le 1 supérieur, et les groupes sont divisés / réorganisés (par opposition à 1 groupe = 1 colonne verticale). Pour être honnête, ce n'est pas la partie que je pensais être difficile. La disposition des couleurs et des blocs est la partie qui m'excite le plus et c'est génial de voir le code ggplot2 pour cela.
Iterator
J'ai besoin de café. Je vois que gsk3 avait le même commentaire avec moins de mots. :) Je pense que j'étais fasciné par la couleur.
Iterator
1
@Iterator: notez que ce sont toutes les fonctions de tracé standard R, pas de ggplot2 impliqué :)
nico
Maquereau sacré. Vous avez raison! Encore plus impressionnant. Ma conclusion: je neeeeeeed coffeeeeeeeeeee.
Iterator
4

Voici un histogramme basé sur une lettre. Envisagé de dimensionner les premières lettres en nombre, mais a décidé de ne pas le faire car il est déjà encodé dans la composante verticale.

# "Load" data
nms <- c("Ad","am","ar","as","bc","bd","bp","br","BR","bs","by","c","C","cc","cd","ch","ci","CJ","ck","Cl","cm","cn","cq","cs","Cs","cv","d","D","dc","dd","de","df","dg","dn","do","ds","dt","e","E","el","ES","F","FF","fn","gc","gl","go","H","Hi","hm","I","ic","id","ID","if","IJ","Im","In","ip","is","J","lh","ll","lm","lo","Lo","ls","lu","m","MH","mn","ms","N","nc","nd","nn","ns","on","Op","P","pa","pf","pi","Pi","pm","pp","ps","pt","q","qf","qq","qr","qt","r","Re","rf","rk","rl","rm","rt","s","sc","sd","SJ","sn","sp","ss","t","T","te","tr","ts","tt","tz","ug","UG","UN","V","VA","Vd","vi","Vo","w","W","y") #all names
two_in_base <- c("ar", "as", "by", "cm", "de", "df", "dt", "el", "gc", "gl", "if", "Im", "is", "lh", "lm", "ls", "pf", "pi", "pt", "qf", "qr", "qt", "Re", "rf", "rm", "rt", "sd", "ts", "vi") # 2-letter names in base R
vowels <- c("a","e","i","o","u")
vowels <- c( vowels, toupper(vowels) )

# Constants
yoffset.singles <- 3

# Define a function to give us consistent X coordinates
returnX <- function(vec) {
  sapply(vec, function(x) seq(length(all.letters))[ x == all.letters ] )
}

# Make df of 2-letter names
combi <- nms[ sapply( nms, function(x) nchar(x)==2 ) ]
combidf <- data.frame( first = substr(combi,1,1), second=substr(combi,2,2) )
library(plyr)
combidf <- arrange(combidf,first,second)

# Add vowels
combidf$first.vwl <- (combidf$first %in% vowels)
combidf$second.vwl <- (combidf$second %in% vowels)

# Flag items only in base R
combidf$in_base <- paste(combidf$first,combidf$second,sep="") %in% two_in_base

# Create a data.frame to hold our plotting information for the first letters
combilist <- dlply(combidf,.(first),function(x) x$second)
combi.first <- data.frame( first = names(combilist), n = sapply(combilist,length) ,stringsAsFactors=FALSE )
combi.first$y <- 0
all.letters <-  c(letters,LETTERS) # arrange(combi.first,desc(n))$first to go in order of prevalence (which may break the one-letter name display)
combi.first$x <- returnX( combi.first$first )

# Create a data.frame to hold plotting information for the second letters
combidf$x <- returnX( combidf$first )
combidf$y <- unlist( by( combidf$second, combidf$first, seq_along ) )

# Make df of 1-letter names
sngldf <- data.frame( sngl = nms[ sapply( nms, function(x) nchar(x)==1 ) ] )
singles.y <- max(combidf$y) + yoffset.singles
sngldf$y <- singles.y
sngldf$x <- returnX( sngldf$sngl )

# Plot
library(ggplot2)
ggplot(data=combidf, aes(x=x,y=y) ) +
  geom_text(aes( label=second, size=3, colour=combidf$in_base ), position=position_jitter(w=0,h=.25)) +
  geom_text( data=combi.first, aes( label=first, x=x, y=y, size=4 ) ) +
  geom_text( data=sngldf, aes( label=sngl, x=x, y=y, size=4 ) ) +
  scale_size(name="Order (2-letter names)",limits=c(1,4),breaks=c(1,2),labels=c("Second","First")) +
  scale_x_continuous("",breaks=c(13,39),labels=c("lower","UPPER")) +
  scale_y_continuous("",breaks=c(0,5,singles.y),labels=c("First letter of two-letter names","Second letter of two-letter names","One-letter names") ) +
  coord_equal(1.5) +
  labs( colour="In base R" )

version avec des noms à une et deux lettres sur la même parcelle

histogramme basé sur des lettres

Ari B. Friedman
la source
2

Tableau périodique pour 100, Alex. Mais je n'ai pas de code pour ça. :(

On pourrait penser qu'un package "tableau périodique" pourrait déjà exister dans CRAN. L'idée d'un schéma de coloration et d'une disposition de ces données pourrait être intéressante et utile.

Ceux-ci peuvent être colorés par package et triés verticalement par fréquence, par exemple dans un échantillon de code sur CRAN ou tels qu'ils apparaissent dans la base de code locale.

Itérateur
la source
Je ne sais pas si je vous suis ... pourriez-vous faire un simple croquis de ce à quoi vous pensez? Je ne vois pas comment une disposition de tableau périodique aiderait ici ...
nico
@nico: Je pense à quelque chose comme ceci: en.wikipedia.org/wiki/Periodic_table Supposons que nous remplaçons les «éléments nobel» par les commandes de base R. Les halogènes peuvent être remplacés par ses propres emballages, etc. Avec un tel package de visualisation, je laisserais à l'utilisateur le soin de spécifier la nature des lignes, des colonnes, des groupes et des colorations. Cela devrait être une chose assez simple à mettre en œuvre, même si je le ferais très grossièrement. Le placement serait tel que les articles du même groupe (c'est-à-dire le paquet) sont proches les uns des autres. Le placement vertical peut être déterminé par la fréquence d'utilisation.
Iterator
D'accord maintenant je comprend! Peut-être que j'essaierai de voir si je peux sortir quelque chose mais je dois d'abord trouver du temps libre ... :(
nico
Je ne le vois pas encore tout à fait, mais je suis excité de voir à quoi cette idée se transforme :-)
Ari B. Friedman
1
a jeté un œil à stackexchange: Tal Galili a posé des questions sur PSE il y a quelque temps, donc je ne l'ai pas demandé. Mais je viens de pousser un premier morceau de code pour r-forger: pse.R veuillez mettre des étoiles autour de la caisse - je ne sais pas comment leur échapper afin qu'ils disparaissent ...
cbeleites mécontents de SX
1

Les deux premières pages du chapitre 2 de l'ITILA de MacKay contiennent de beaux diagrammes montrant les probabilités conditionnelles de tous les couples de caractères en anglais. Vous pouvez le trouver utile.

Je suis gêné de dire que je ne me souviens pas quel programme a été utilisé pour les produire.

jcb
la source
1
C'est cool, mais il me semble que tout cela dépend de la présence d'informations supplémentaires (prévalence) associées à chaque paire de lettres. Ainsi, il représente graphiquement 3 dimensions alors que nous représentons principalement 2 .... J'adorerais avoir les informations de prévalence pour R, cependant. Mais c'est une opération d'exploration de données pour un autre jour.
Ari B. Friedman