2 글자 조합 시각화


10

SO에이 질문에 대한 답은 두 글자 이름에 약 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 플롯을 통해 사분면 선 (큰 +)을 추가 할 수 있습니까?
Ari B. Friedman

내가 그렇게 생각했습니다. 어쨌든 여기 있습니다. @ gsk3 : 사진을 업로드 해 주셔서 감사합니다!
SX

좋은. 반면에 프롬프트 2 번에 대한 흥미로운 답변을 제공해 주셔서 감사합니다. :-)
Ari B. Friedman

2d 음모를 살펴보면 주어진 문자가 낮거나 위 / 둘 다인 경우 27x26 격자로 줄이고 기호 또는 색상 (또는 알파가있는 지터)을 변경하는 것이 좋습니다. NA 행을 시각적으로 분리하기 위해 다른 색으로 만들 수도 있습니다.
Ari B. Friedman

1
답을 게시하기 전에 27 x 26을 살펴 보았습니다 (첫 번째와 두 번째 문자에 따라 색상과 모양이 대문자 임). 그러나 그것은 쉬운 메시지를 전달하지 못했기 때문에 즉시 더 큰 그리드로 돌아갔습니다.
SX에 불만족 cveleites

8

자, 여기 SO 질문과 다른 사람들의 의견을 바탕으로 한 "주기적인 테이블"과 같은 시각화에 대한 빠른 설명이 있습니다. 주요 문제는 패키지 간의 변수 수의 큰 차이로 인해 시각화가 방해됩니다 ... 이것이 매우 거칠다는 것을 알고 있으므로 원하는대로 변경하십시오.

여기 내 패키지 목록의 현재 출력이 있습니다. 플롯 예

그리고 코드

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

대부분의 변수는 basestats 패키지 에서 나옵니다.

> 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
좋은! 이를 수행하는 한 가지 흥미로운 방법은 범주 (예 : 그래픽 패키지, 데이터 조작 방법 등)별로 그룹화하고 색상 코드를 작성한 다음 전체 모양을 히스토그램이 아닌 상자 모양으로 만드는 것입니다.
Ari B. Friedman

+1이 얼마나 대접! :) 아주 좋은 일입니다. 주기율표 기능을 얻는 데 필요한 유일한 것은 테이블 레이아웃이라고 생각합니다. 표준 PT에는 2 개의 그리드가 있으며 일부 요소는 상단 1에서 누락되어 있으며 그룹은 분할 / 재 배열됩니다 (1 그룹 = 1 세로 열이 아닌). 솔직히 말해서, 그것은 내가 어려울 것이라고 생각한 부분이 아닙니다. 채색 및 블록 레이아웃은 저를 가장 흥분시키는 부분이며 ggplot2 코드를 보는 것이 좋습니다.
반복자

나는 커피를 마시고 싶다. 나는 gsk3가 적은 단어로 동일한 주석을 가지고 있음을 알았습니다. :) 나는 색에 매료되었다고 생각한다.
반복자

1
@Iterator : 그것은 모든 R 표준 플롯 함수이며 ggplot2는 포함하지 않습니다 :)
nico

거룩한 고등어. 네가 옳아! 더욱 인상적입니다. 나의 결론 : 나는 coffeeeeeeeeeee를 말했다.
반복자

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

같은 음모에 1 자 및 2 자 이름을 가진 버전

문자 기반 히스토그램


2

100 주기율표, Alex. 그래도 코드가 없습니다. :(

"주기 테이블"패키지가 CRAN에 이미 존재한다고 생각할 수도 있습니다. 채색 계획과 그러한 데이터의 레이아웃에 대한 아이디어는 흥미롭고 유용 할 수 있습니다.

패키지별로 색상을 지정하고 빈도별로 수직으로 정렬 할 수 있습니다 (예 : CRAN의 코드 샘플 또는 로컬 코드베이스에 표시됨).


내가 당신을 따르는 지 확실하지 않습니다 ... 당신이 생각하는 것을 간단하게 스케치 할 수 있습니까? 주기율표 레이아웃이 어떻게 도움이 될지 모르겠습니다.
nico

@nico : 다음과 같이 생각하고 있습니다 : en.wikipedia.org/wiki/Periodic_table "nobel 요소"를 기본 R 명령으로 교체한다고 가정 해 봅시다. 할로겐은 자체 패키지 등으로 대체 될 수 있습니다. 이러한 시각화 패키지를 사용하면 행, 열, 그룹 및 색상의 특성을 지정하도록 사용자에게 맡길 수 있습니다. 구현하기는 매우 간단하지만 매우 조잡하게 수행해야합니다. 배치는 같은 그룹 (즉, 패키지)에있는 항목들이 서로 가까이 있어야합니다. 수직 배치는 사용 빈도에 따라 결정될 수 있습니다.
반복자

이제 이해했다! 어쩌면 내가 뭔가를 가지고 나올 수 있는지 보려고 노력하지만 먼저 여가 시간을 찾아야합니다 ... :(
nico

꽤 아직 표시되지 않습니다,하지만 난보고 흥분하고있는 무슨 :-)에이 아이디어를 턴
아리 B. 프리드먼

1
Tal Galili는 얼마 전에 PSE에 대해 물었으므로 묻지 않았습니다. 하지만 난 그냥 R-위조 코드의 제 1 비트를 밀어 : pse.R가 체크 아웃 주위에 넣어 별을 기쁘게 - 나는 그들이 사라질 수 있도록 그들을 탈출하는 방법을 모른다 ...
SX에 불만 cbeleites

1

MacKay ITILA 2 장의 첫 두 페이지 에는 영어로 된 모든 문자 쌍의 조건부 확률을 보여주는 멋진 다이어그램이 있습니다. 당신은 그것을 사용할 수 있습니다.

프로그램 제작에 어떤 프로그램이 사용되었는지 기억이 나지 않는다고 생각합니다.


1
멋지지만, 각 문자-문자 쌍과 관련된 몇 가지 추가 정보 (유병률)에 의존하는 것처럼 보입니다. 따라서 그는 3 차원을 그래프 화하는 반면 우리는 주로 2를 그래프 화하고 있습니다. 그러나 R에 대한 유병률 정보를 갖고 싶습니다. 그러나 그것은 다른 날의 데이터 마이닝 작업입니다.
Ari B. Friedman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.