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)

대부분의 변수는 base 및 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 

마지막으로 드로잉 루틴

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.