Visualisierung von 2-Buchstaben-Kombinationen

10

Die Antworten auf diese Frage zu SO ergaben einen Satz von ungefähr 125 Namen mit ein bis zwei Buchstaben: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r-Objekte

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

Und R Importcode:

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

Da der Punkt der Frage darin bestand, eine einprägsame Liste von Objektnamen zu erstellen, die vermieden werden sollten, und die meisten Menschen nicht so gut darin sind, aus einem soliden Textblock einen Sinn zu machen, möchte ich dies visualisieren.

Leider bin ich mir nicht ganz sicher, wie ich das am besten machen kann. Ich hatte an so etwas wie eine Stamm-Blatt-Darstellung gedacht, nur da es keine wiederholten Werte gibt, wurde jedes "Blatt" in die entsprechende Spalte gestellt, anstatt gerechtfertigt zu bleiben. Oder eine Anpassung im Stil einer Wortwolke, bei der die Größe der Buchstaben entsprechend ihrer Verbreitung erfolgt.

Wie kann dies am klarsten und effizientesten visualisiert werden?

Visualisierungen, die eine der folgenden Möglichkeiten erfüllen, passen zum Geist dieser Frage:

  • Primäres Ziel: Verbessern Sie die Einprägsamkeit des Namenssatzes, indem Sie Muster in den Daten anzeigen

  • Alternatives Ziel: Markieren Sie interessante Funktionen des Namenssatzes (z. B. zur Visualisierung der Verteilung, der häufigsten Buchstaben usw.).

Antworten in R werden bevorzugt, aber alle interessanten Ideen sind willkommen.

Das Ignorieren der Einzelbuchstaben ist zulässig, da diese einfacher als separate Liste anzugeben sind.

Ari B. Friedman
quelle

Antworten:

12

Hier ist ein Anfang: Visualisieren Sie diese in einem Raster aus ersten und zweiten Buchstaben:

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

(war: zwei Buchstaben) Gitter mit Buchstaben

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

zweiter Brief

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

erster Brief

Ich sammle:

  • der Ein-Buchstaben-Namen,

    • Zum Glück i, j, k, und lsind verfügbar (I so indizieren kann bis 4d Arrays up)
    • Leider sind t(Zeit), c(Konzentration) weg. So sind m(Masse), V(Volumen) und F(Kraft). Kein Radius roder Durchmesser d.
    • Ich kann jedoch Druck ( p), Substanzmenge ( n) und Länge lhaben.
    • Vielleicht muss ich zu griechischen Namen wechseln: εist OK, sollte es dann aber nicht

      π <- pi

      ?

  • Ich kann jeden lowerUPPERNamen haben, den ich will.

  • Im Allgemeinen ist es sicherer, mit einem Großbuchstaben zu beginnen als mit einem Kleinbuchstaben.

  • fang nicht mit coder and

cbeleites
quelle
Schöner Start. Fügen Sie möglicherweise Quadrantenlinien (in einem großen +) durch das 2D-Diagramm hinzu, um ein besseres Gefühl dafür zu erhalten, wohin die Groß- / Kleinbuchstaben gehen?
Ari B. Friedman
Ich dachte, ich hätte das getan. Sowieso hier ist es. @ gsk3: danke für das hochladen der bilder!
cbeleites unglücklich mit SX
Nett. Und im Gegenteil, danke, dass Sie eine interessante Antwort auf die zweite Aufforderung gegeben haben. :-)
Ari B. Friedman
Wenn Sie sich Ihr 2D-Diagramm ansehen, besteht ein weiterer Vorschlag darin, es auf ein Raster von 27 x 26 zu reduzieren und Symbole oder Farben (oder Jitter mit Alpha) zu ändern, wenn ein bestimmter Buchstabe unter / oben / beides hat. Könnte auch dazu führen, dass die NA-Reihe eine andere Farbe hat, um sie optisch zu trennen.
Ari B. Friedman
1
Ich habe mir 27 x 26 angesehen, bevor ich die Antwort gepostet habe (wobei Farbe und Form gemäß dem ersten und zweiten Buchstaben in Großbuchstaben geschrieben sind). Da dies jedoch keine einfache Nachricht war, ging ich sofort zum größeren Raster zurück.
cbeleites unglücklich mit SX
8

Ok, hier ist meine sehr schnelle Darstellung einer "Periodensystem" -ähnlichen Visualisierung, basierend auf der SO-Frage und den Kommentaren der anderen. Das Hauptproblem ist der große Unterschied in der Anzahl der Variablen zwischen den Paketen, der die Visualisierung behindert ... Mir ist klar, dass dies sehr rau ist. Sie können es also jederzeit ändern.

Hier ist die aktuelle Ausgabe (aus meiner Paketliste) Beispielplot

Und der 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))

Jetzt haben wir einen Datenrahmen wie diesen:

> 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

Wir können jetzt die Daten nach Paket aufteilen

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

Wir können sehen , dass die meisten Variablen stammen aus der Basis und Statistik - Paket

> 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 

Zum Schluss die Zeichenroutine

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
quelle
1
Nett! Ein interessanter Weg, dies zu tun, besteht darin, sie nach Kategorien zu gruppieren (z. B. Grafikpakete, Datenmanipulationspraktiken usw.), sie farblich zu kennzeichnen und dann die Gesamtform eher kastenartig als histogrammartig zu gestalten.
Ari B. Friedman
+1 Was für ein Vergnügen! :) Sehr gute Arbeit. Ich denke, das einzige, was notwendig wäre, um die Funktionalität des Periodensystems zu erhalten, ist das Tabellenlayout. Der Standard-PT hat 2 Gitter, wobei einige Elemente in der oberen 1 fehlen, und die Gruppen sind geteilt / neu angeordnet (im Gegensatz zu 1 Gruppe = 1 vertikale Spalte). Um ehrlich zu sein, das ist nicht der Teil, von dem ich dachte, dass er schwierig sein würde. Das Farb- und Blocklayout ist der Teil, der mich am meisten begeistert und es ist großartig, ggplot2-Code dafür zu sehen.
Iterator
Ich brauche Kaffee. Ich sehe, dass gsk3 den gleichen Kommentar mit weniger Wörtern hatte. :) Ich glaube, ich war fasziniert von der Farbe.
Iterator
1
@Iterator: Beachten Sie, dass es alle R Standard-Plot-Funktionen sind, kein ggplot2 beteiligt :)
Nico
Heilige Makrele. Du hast recht! Noch beeindruckender. Mein Fazit: Ich brauche Kaffee.
Iterator
4

Hier ist ein buchstabenbasiertes Histogramm. Betrachtet die Größe der ersten Buchstaben nach Zahlen, entscheidet sich jedoch dagegen, da dies bereits in der vertikalen Komponente codiert ist.

# "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 mit Ein- und Zwei-Buchstaben-Namen auf derselben Handlung

buchstabenbasiertes Histogramm

Ari B. Friedman
quelle
2

Periodensystem für 100, Alex. Ich habe jedoch keinen Code dafür. :(

Man könnte meinen, dass in CRAN bereits ein "Periodensystem" -Paket vorhanden ist. Die Idee eines Farbschemas und des Layouts solcher Daten könnte interessant und nützlich sein.

Diese können nach Paket gefärbt und vertikal nach Häufigkeit sortiert werden, z. B. in einem Codebeispiel auf CRAN oder wie sie in der lokalen Codebasis angezeigt werden.

Iterator
quelle
Sie sind sich nicht sicher, ob ich Ihnen folge ... könnten Sie eine einfache Skizze von dem machen, woran Sie denken? Ich sehe nicht, wie ein Periodensystem-Layout hier helfen würde ...
Nico
@nico: Ich denke an so etwas: en.wikipedia.org/wiki/Periodic_table Angenommen, wir ersetzen "Nobel-Elemente" durch die Basis-R-Befehle. Die Halogene können durch eigene Pakete ersetzt werden und so weiter. Mit einem solchen Visualisierungspaket würde ich es dem Benutzer überlassen, die Art der Zeilen, Spalten, Gruppen und Farben festzulegen. Es sollte ziemlich einfach zu implementieren sein, obwohl ich es sehr grob machen würde. Die Platzierung würde so erfolgen, dass Elemente in derselben Gruppe (dh Paket) nahe beieinander liegen. Die vertikale Platzierung kann durch die Nutzungshäufigkeit bestimmt werden.
Iterator
Ok, jetzt verstehe ich! Vielleicht werde ich versuchen zu sehen, ob ich etwas herausbringen kann, aber ich muss zuerst etwas Freizeit finden ... :(
nico
Ich sehe es noch nicht ganz, aber ich bin gespannt, was aus dieser Idee wird :-)
Ari B. Friedman
1
Ich habe mir Stackexchange angesehen: Tal Galili hat vor einiger Zeit nach PSE gefragt, also habe ich nicht gefragt. Aber ich habe gerade ein erstes Stück Code an r-forge gesendet : pse.R Bitte setzen Sie Sterne um die Kasse - ich weiß nicht, wie ich ihnen entkommen kann, damit sie verschwinden ...
cbeleites unglücklich mit SX
1

Die ersten beiden Seiten in Kapitel 2 von MacKays ITILA enthalten schöne Diagramme, die die bedingten Wahrscheinlichkeiten aller Zeichenpaarungen in englischer Sprache zeigen. Sie können es von Nutzen finden.

Es ist mir peinlich zu sagen, dass ich mich nicht erinnere, mit welchem ​​Programm sie produziert wurden.

jcb
quelle
1
Es ist cool, aber es sieht für mich so aus, als ob alle davon abhängen, ob jedem Buchstaben-Buchstaben-Paar zusätzliche Informationen (Prävalenz) zugeordnet sind. Daher zeichnet er 3 Dimensionen auf, während wir hauptsächlich 2 grafisch darstellen. Ich würde jedoch gerne die Prävalenzinformationen für R haben. Aber das ist ein Data Mining-Vorgang für einen anderen Tag.
Ari B. Friedman