Visualizzazione delle combinazioni di 2 lettere


10

Le risposte a questa domanda su SO hanno restituito un set di circa 125 nomi da una a due lettere: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r-oggetti

  [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"

E codice di importazione 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")

Poiché il punto della domanda era quello di elaborare un elenco memorabile di nomi di oggetti da evitare, e la maggior parte degli umani non è così brava a dare un senso a un solido blocco di testo, vorrei visualizzarlo.

Sfortunatamente non sono esattamente sicuro del modo migliore per farlo. Avevo pensato a qualcosa di simile a un diagramma a gambo e foglia, solo perché non c'erano valori ripetuti ogni "foglia" veniva collocata nella colonna appropriata anziché essere giustificata a sinistra. O un adattamento in stile wordcloud in cui le lettere sono dimensionate in base alla sua prevalenza.

Come può essere visualizzato in modo più chiaro ed efficiente?

Le visualizzazioni che rientrano in una delle seguenti condizioni rientrano nello spirito di questa domanda:

  • Obiettivo primario: migliorare la memorabilità dell'insieme di nomi rivelando i modelli nei dati

  • Obiettivo alternativo: evidenziare le caratteristiche interessanti dell'insieme di nomi (ad esempio, che aiutano a visualizzare la distribuzione, le lettere più comuni, ecc.)

Le risposte in R sono preferite, ma tutte le idee interessanti sono benvenute.

È consentito ignorare i nomi di una sola lettera, poiché è più semplice fornirli come un elenco separato.

Risposte:


12

Ecco un inizio: visualizzali su una griglia di prima e seconda lettera:

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")

(era due lettere:) griglia con lettere

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

seconda lettera

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

prima lettera

Io raccolgo:

  • dei nomi di una lettera,

    • fortunatamente i, j, k, e lsono disponibili (quindi in grado di indicizzare fino a array 4d)
    • sfortunatamente t(tempo), c(concentrazione) se ne sono andati. Lo stesso vale per m(massa), V(volume) e F(forza). Nessun raggio rné diametro d.
    • Posso avere pressione ( p), quantità di sostanza ( n) e lunghezza l, però.
    • Forse dovrò cambiare i nomi greci: εva bene, ma non dovrebbe

      π <- pi

      ?

  • Posso avere qualunque lowerUPPERnome io voglia.

  • In generale, iniziare con una lettera maiuscola è una scommessa più sicura di una minuscola.

  • non iniziare con cod


Buon inizio. Forse aggiungi linee di quadranti (in un grande +) attraverso la trama 2d per dare un'idea migliore di dove vanno le lettere maiuscole / minuscole?
Ari B. Friedman,

Pensavo di averlo fatto. Comunque, eccolo qui. @ gsk3: grazie per aver caricato le foto!
cbeleites insoddisfatto dell'SX

Bello. E al contrario, grazie per aver fornito una risposta interessante al prompt n. 2. :-)
Ari B. Friedman

Guardando la tua trama 2d, un altro suggerimento potrebbe essere quello di ridurla a una griglia 27x26 e cambiare simboli o colori (o jitter con alfa) se una data lettera ha inferiore / superiore / entrambi. Potrebbe anche rendere la riga NA di un colore diverso per separarla visivamente.
Ari B. Friedman,

1
Ho dato un'occhiata a 27 x 26 prima di pubblicare la risposta (con colore e forma in base alla prima e alla seconda lettera maiuscole). Ma questo non ha trasmesso un messaggio facile, quindi sono tornato immediatamente alla griglia più grande.
cbeleites insoddisfatto dell'SX

8

Ok, ecco la mia visione molto veloce di una visualizzazione simile a una "tavola periodica", basata sulla domanda SO e sui commenti degli altri. Il problema principale è la grande differenza nel numero di variabili tra i pacchetti, che ostacola la visualizzazione ... Mi rendo conto che questo è molto approssimativo, quindi sentiti libero di cambiarlo come desideri.

Ecco l'output corrente (dal mio elenco di pacchetti) Esempio di trama

E il codice

# 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))

Ora, abbiamo un frame di dati come questo:

> 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

Ora possiamo dividere i dati per pacchetto

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

Possiamo vedere che la maggior parte delle variabili provengono dal pacchetto base e stats

> 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 

Finalmente la routine di disegno

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)
        }
    }

1
Bello! Un modo interessante per farlo sarebbe quello di raggrupparli per categoria (ad es. Pacchetti grafici, pratiche di manipolazione dei dati, ecc.), Codificarli con colori e quindi rendere la forma complessiva più simile a una scatola piuttosto che a un istogramma.
Ari B. Friedman,

+1 Che meraviglia! :) Ottimo lavoro. Immagino che l'unica cosa che sarebbe necessaria per ottenere la funzionalità di tavola periodica sia il layout della tabella. Il PT standard ha 2 griglie, con alcuni elementi mancanti nella parte superiore 1 e i gruppi sono divisi / riorganizzati (al contrario di 1 gruppo = 1 colonna verticale). Ad essere sincero, questa non è la parte che pensavo fosse difficile. Il layout di colorazione e blocchi è la parte che mi emoziona di più ed è bello vedere il codice ggplot2 per questo.
Iteratore

Ho bisogno di caffè. Vedo che gsk3 ha avuto lo stesso commento con meno parole. :) Penso di essere rimasto affascinato dal colore.
Iteratore

1
@Iteratore: nota che sono tutte le funzioni di trama standard R, nessuna ggplot2 coinvolta :)
nico,

Santo sgombro. Hai ragione! Ancora più impressionante. La mia conclusione: ho bisogno di coffeeeeeeeeeee.
Iteratore

4

Ecco un istogramma basato su lettere. Considerato il dimensionamento delle prime lettere in base al numero, ma deciso contro poiché già codificato nel componente 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" )

versione con nomi di una o due lettere sulla stessa trama

istogramma a lettere


2

Tavola periodica per 100, Alex. Non ho codice per questo, però. :(

Si potrebbe pensare che un pacchetto "tavola periodica" potrebbe già esistere in CRAN. L'idea di uno schema di colorazione e layout di tali dati potrebbe essere interessante e utile.

Questi potrebbero essere colorati per pacchetto e ordinati verticalmente per frequenza, ad esempio in un campione di codice su CRAN o come appaiono nella propria base di codice locale.


Non sono sicuro che se ti seguo ... potresti fare un semplice schizzo di quello che stai pensando? Non vedo come un layout di tabella periodica possa aiutare qui ...
nico,

@nico: sto pensando a qualcosa del genere: en.wikipedia.org/wiki/Periodic_table Supponiamo di sostituire "elementi nobel" con i comandi R di base. Gli alogeni potrebbero essere sostituiti dai propri pacchetti e così via. Con un tale pacchetto di visualizzazione, lascerei all'utente di specificare la natura di righe, colonne, gruppi e coloranti. Dovrebbe essere una cosa abbastanza semplice da implementare, anche se lo farei molto rozzamente. Il posizionamento sarebbe tale che gli articoli nello stesso gruppo (ad es. Pacchetto) siano vicini. Il posizionamento verticale potrebbe essere determinato dalla frequenza di utilizzo.
Iteratore

Ok ora capisco! Forse proverò a vedere se riesco a uscire con qualcosa, ma prima devo trovare un po 'di tempo libero ... :(
nico,

Ancora non lo vedo, ma sono entusiasta di vedere in cosa si trasforma questa idea :-)
Ari B. Friedman

1
ho dato un'occhiata a stackexchange: Tal Galili ha chiesto informazioni su PSE qualche tempo fa, quindi non ho chiesto. Ma ho appena spinto un primo po 'di codice per r-forge: pse.R, per favore, metti le stelle attorno al checkout - Non so come sfuggirle così svaniscono ...
Cbeleites insoddisfatto di SX

1

Le prime due pagine del capitolo 2 dell'ITILA di MacKay hanno dei bei diagrammi che mostrano le probabilità condizionate di tutti gli accoppiamenti di caratteri in lingua inglese. Potresti trovarlo utile.

Sono imbarazzato nel dire che non ricordo quale programma è stato usato per produrli.


1
È bello, ma mi sembra che tutti dipendano dall'avere alcune informazioni aggiuntive (prevalenza) associate ad ogni coppia lettera-lettera. Quindi sta rappresentando graficamente 3 dimensioni mentre stiamo rappresentando principalmente 2 .... Mi piacerebbe avere le informazioni sulla prevalenza di R, però. Ma questa è un'operazione di data mining per un altro giorno.
Ari B. Friedman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.