Візуалізація 2-буквових комбінацій


10

Відповіді на це питання повернули набір приблизно 125 імен на одну букву: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r-об’єкти

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

І код імпорту 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")

Оскільки суть питання полягала в тому, щоб створити пам’ятний перелік імен об’єктів, яких слід уникати, а більшість людей не так добре вибирають сенс із твердого блоку тексту, я хотів би це уявити.

На жаль, я не точно певний з найкращих способів зробити це. Я придумав щось на зразок стовбурового сюжету, тільки оскільки немає повторних значень, кожен "лист" розміщувався у відповідному стовпчику, а не залишався виправданим. Або адаптація у слововому стилі, де букви розміщуються відповідно до її поширеності.

Як це можна найбільш наочно та ефективно уявити?

Візуалізації, які відповідають одному із наведеного нижче, відповідають духу цього питання:

  • Основна мета: Підвищити запам'ятовуваність набору імен шляхом виявлення шаблонів у даних

  • Альтернативна мета: виділіть цікаві особливості набору імен (наприклад, які допомагають візуалізувати розповсюдження, найпоширеніші букви тощо)

Відповіді на R бажані, але всі цікаві ідеї вітаються.

Ігнорування однолітерних імен дозволяється, оскільки їх легше просто навести як окремий список.

Відповіді:


12

Ось для початку: візуалізуйте їх на сітці першої та другої літер:

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

(було дві літери:) сітка з літерами

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

друга буква

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

перший лист

Я збираю:

  • назв однієї літери,

    • До щастя i, j, kі lдоступні (так що може індексувати до 4d масивів)
    • на жаль t(час), c(концентрація) пішли. Так і єm (маса),V (об'єм) і F(сила). Ні радіус, rні діаметр d.
    • Я можу мати тиск (p ), кількість речовини ( n) та довжину l, хоча.
    • Можливо, мені доведеться змінити грецькі назви: ε це добре, але тоді не слід

      π <- pi

      ?

  • Я можу мати що завгодно lowerUPPER ім’я.

  • Взагалі, починаючи з великої літери - це більш безпечна ставка, ніж нижня літера.

  • не починати з cабоd


Приємний старт. Можливо, додайте квадрантні рядки (у великому +) через 2d графік, щоб краще зрозуміти, куди йдуть великі та малі літери?
Арі Б. Фрідман

Думав, що я це зробив. У всякому разі, ось воно. @ gsk3: дякую за завантаження фотографій!
cbeleites незадоволений SX

Приємно. І навпаки, дякую за надану цікаву відповідь на запит №2. :-)
Арі Б. Фрідман

Дивлячись на ваш 2d графік, ще однією пропозицією може бути зменшення його до сітки 27х26 та зміна символів чи кольорів (або тремтіння з альфа), якщо дана літера має нижню / верхню / обидві. Можна також зробити рядок NA іншого кольору, щоб візуально відокремити його.
Арі Б. Фрідман

1
Я перед тим, як опублікувати відповідь (перед кольором та формою відповідно до першої та другої літери, як верхнього регістру), я подивився на 27 х 26. Але це не передало простого повідомлення, тому я негайно повернувся назад до більшої сітки.
cbeleites незадоволений SX

8

Добре, ось я дуже швидко взяв на себе "періодичну таблицю" -візуалізацію, засновану на питанні ТА та коментарях інших. Основна проблема полягає у великій різниці в кількості змінних між пакунками, яка заважає візуалізації ... Я розумію, що це дуже грубо, тому, будь ласка, не соромтеся змінювати його, як хочете.

Ось поточний вихід (зі мого списку пакунків) Приклад сюжету

І код

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

Тепер у нас є такий кадр даних:

> 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

Тепер ми можемо розділити дані за пакетом

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

Ми можемо бачити, що більшість змінних походять з базового та статистичного пакету

> 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 

Нарешті, рутина малювання

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
Приємно! Один із цікавих способів прийняти це було б згрупувати їх за категоріями (наприклад, графічні пакети, практики маніпулювання даними тощо), пофарбувати їх у кольори, а потім зробити загальну форму більш подібною до коробки, а не гістограмою.
Арі Б. Фрідман

+1 Яке частування! :) Дуже приємна робота. Я здогадуюсь, єдине, що було б необхідно для отримання функціональності періодичних таблиць - це компонування таблиці. У стандартному ПТ є 2 сітки, де деякі елементи відсутні у верхній частині 1, а групи розділені / переставлені (на відміну від 1 групи = 1 вертикальний стовпець). Якщо чесно, це не та частина, яку я вважав, що це буде важко. Розфарбування та макет блоку - це та частина, яка мене найбільше хвилює, і це чудово побачити код ggplot2.
Ітератор

Мені потрібна кава. Я бачу, що gsk3 мав той самий коментар з меншою кількістю слів. :) Я думаю, що мене зачарували кольором.
Ітератор

1
@Iterator: зауважте, що це всі стандартні R-сюжетні функції, не включається ggplot2 :)
nico

Свята скумбрія. Ти правий! Ще більш вражаюче. Мій висновок: я neeeeeeed coffeeeeeeeeeeee.
Ітератор

4

Ось лист-гістограма. Розглянули розмір перших літер за номером, але вирішили проти, оскільки це вже закодовано у вертикальній складовій.

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

версія з одно- та двобуквенними іменами на одному сюжеті

буквена гістограма


2

Періодична таблиця на 100, Алекс. Я не маю цього коду. :(

Можна подумати, що пакет "періодична таблиця" може вже існувати в CRAN. Ідея схеми фарбування та компонування таких даних може бути цікавою та корисною.

Вони можуть бути забарвлені за пакетом і відсортовані вертикально за частотою, наприклад, у зразку коду на CRAN або у тому випадку, як вони з’являються у локальній кодовій базі даних.


Не впевнений, якщо я за тобою слідкую ... ти міг би зробити простий ескіз того, про що ти думаєш? Я не бачу, як допоможе тут макет періодичної таблиці ...
nico

@nico: Я думаю про щось подібне: en.wikipedia.org/wiki/Periodic_table Припустимо, що ми замінимо "нобелівські елементи" базовими командами R. Галогени можуть бути замінені власним пакетом тощо. З таким пакетом візуалізації я б залишив його користувачеві вказати характер рядків, стовпців, груп та забарвлень. Це має бути досить проста річ, але я б робив це дуже грубо. Розміщення буде таким, що предмети в одній групі (тобто пакеті) знаходяться поруч один з одним. Вертикальне розміщення можна визначити за частотою використання.
Ітератор

ОК зараз я розумію! Можливо, я спробую побачити, чи можу я щось вийти, але мені потрібно спочатку знайти трохи вільного часу ... :(
nico

Я ще не дуже його бачу, але я з радістю бачу, в що перетворюється ця ідея :-)
Арі Б. Фрідман

1
подивився на stackexchange: Тал Галілі запитав про PSE деякий час тому, тому я не питав. Але я просто підштовхнув перший шматочок коду до r-forge: pse.R, будь ласка, покладіть зірочок біля каси - я не знаю, як уникнути їх, щоб вони зникли ...
cbeleites незадоволений SX

1

На перших двох сторінках розділу 2 ITILA MacKay є приємні діаграми, що показують умовні ймовірності всіх пар символів в англійській мові. Ви можете знайти це корисно.

Мені соромно сказати, що я не пам'ятаю, яку програму використовували для їх створення.


1
Це круто, але мені здається, що всі вони залежать від того, щоб мати додаткову інформацію (поширеність), пов'язану з кожною парою лист-лист. Таким чином, він малює 3 виміри, тоді як ми в основному графіку 2 .... Я хотів би мати інформацію про поширеність R, хоча. Але це операція з вилучення даних для іншого дня.
Арі Б. Фрідман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.