Hình dung kết hợp 2 chữ cái


10

Các câu trả lời cho câu hỏi này trên SO đã trả về một bộ gồm khoảng 125 tên từ một đến hai chữ cái: /programming/6979630/what-1-2-letter-object-names-conflict-with-ex hiện -r-đối tượng

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

Và mã nhập 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")

Vì mục đích của câu hỏi là đưa ra một danh sách đáng nhớ các tên đối tượng cần tránh và hầu hết mọi người không giỏi trong việc hiểu ý nghĩa của một khối văn bản vững chắc, tôi muốn hình dung điều này.

Thật không may, tôi không chắc chắn về cách tốt nhất để làm điều này. Tôi đã nghĩ về một cái gì đó giống như một âm mưu thân cây, chỉ vì không có giá trị lặp lại, mỗi "chiếc lá" được đặt trong cột thích hợp thay vì được để lại hợp lý. Hoặc một sự điều chỉnh theo kiểu wordcloud trong đó các chữ cái có kích thước tùy theo mức độ phổ biến của nó.

Làm thế nào điều này có thể được hình dung rõ ràng và hiệu quả nhất?

Hình dung mà một trong những điều sau đây phù hợp với tinh thần của câu hỏi này:

  • Mục tiêu chính: Tăng cường khả năng ghi nhớ của bộ tên bằng cách tiết lộ các mẫu trong dữ liệu

  • Mục tiêu thay thế: Làm nổi bật các tính năng thú vị của bộ tên (ví dụ: giúp trực quan hóa phân phối, các chữ cái phổ biến nhất, v.v.)

Câu trả lời trong R được ưa thích, nhưng tất cả các ý tưởng thú vị đều được chào đón.

Bỏ qua các tên đơn được cho phép, vì những cái đó dễ dàng hơn chỉ là một danh sách riêng.

Câu trả lời:


12

Đây là một sự khởi đầu: hình dung những thứ này trên một lưới các chữ cái thứ nhất và thứ hai:

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

(là hai lá thư:) lưới với các chữ cái

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

lá thư thứ hai

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

lá thư đầu tiên

Tôi thu thập:

  • tên một chữ cái,

    • may mắn thay i, j, k, và lcó sẵn (vì vậy tôi có thể chỉ mục lên đến mảng 4d)
    • Thật không may t(thời gian), c(sự tập trung) đã biến mất. Vậy là m(khối lượng), V(khối lượng) và F(lực lượng). Không bán kính rcũng không đường kính d.
    • Tôi có thể có áp lực ( p), lượng chất ( n) và chiều dài l, mặc dù.
    • Có lẽ tôi sẽ phải đổi sang tên Hy Lạp: không εsao, nhưng sau đó không nên

      π <- pi

      ?

  • Tôi có thể có bất cứ lowerUPPERtên nào tôi muốn.

  • Nói chung, bắt đầu bằng một chữ cái viết hoa là đặt cược an toàn hơn chữ thường.

  • đừng bắt đầu với choặcd


Khởi đầu tốt đẹp Có thể thêm các dòng góc phần tư (trong một dấu lớn +) thông qua âm mưu 2d để cho cảm giác tốt hơn về việc các chữ cái in hoa / in thường đi đâu?
Ari B. Friedman

Nghĩ rằng tôi đã làm điều đó. Dù sao, đây là. @ gsk3: cảm ơn vì đã tải lên hình ảnh!
cbeleites không hài lòng với SX

Đẹp. Và ngược lại, cảm ơn vì đã cung cấp một câu trả lời thú vị để nhắc # 2. :-)
Ari B. Friedman

Nhìn vào âm mưu 2d của bạn, một đề xuất khác có thể là giảm nó thành lưới 27x26 và thay đổi các ký hiệu hoặc màu sắc (hoặc jitter bằng alpha) nếu một chữ cái đã cho có thấp hơn / trên / cả hai. Cũng có thể làm cho hàng NA có màu khác để tách nó ra một cách trực quan.
Ari B. Friedman

1
Tôi đã xem 27 x 26 trước khi đăng câu trả lời (với màu sắc và hình dạng theo chữ cái thứ nhất và thứ hai là chữ hoa). Nhưng điều đó không truyền tải được một thông điệp dễ dàng, vì vậy tôi ngay lập tức quay trở lại với lưới điện lớn hơn.
cbeleites không hài lòng với SX

8

Ok, đây là cách tôi nhanh chóng thực hiện trực quan giống như "bảng tuần hoàn", dựa trên câu hỏi SO và nhận xét của những người khác. Vấn đề chính là sự khác biệt lớn về số lượng biến giữa các gói, loại gây cản trở trực quan hóa ... Tôi nhận ra điều này rất khó khăn, vì vậy xin vui lòng thay đổi nó theo ý muốn.

Đây là đầu ra hiện tại (từ danh sách gói của tôi) Ví dụ cốt truyện

Và mã

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

Bây giờ, chúng ta có một khung dữ liệu như thế này:

> 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

Bây giờ chúng ta có thể chia dữ liệu theo gói

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

Chúng ta có thể thấy rằng hầu hết các biến đến từ gói cơ sởsố liệu thống kê

> 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 

Cuối cùng, thói quen vẽ

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
Đẹp! Một cách thú vị để thực hiện điều này là nhóm chúng theo danh mục (ví dụ: gói đồ họa, thực hành thao tác dữ liệu, v.v.), mã màu cho chúng, sau đó làm cho hình dạng tổng thể giống hình hộp hơn là giống như biểu đồ.
Ari B. Friedman

+1 Thật là một điều trị! :) Công việc rất tốt. Tôi đoán điều duy nhất cần thiết để có được chức năng bảng định kỳ là cách bố trí bảng. PT tiêu chuẩn có 2 lưới, với một số phần tử bị thiếu trong top 1 và các nhóm được phân chia / sắp xếp lại (trái ngược với 1 nhóm = 1 cột dọc). Thành thật mà nói, đó không phải là phần mà tôi nghĩ sẽ khó. Bố cục tô màu và khối là phần khiến tôi phấn khích nhất và thật tuyệt khi thấy mã ggplot2 cho nó.
Lặp lại

Tôi cần cà phê. Tôi thấy rằng gsk3 có cùng nhận xét với ít từ hơn. :) Tôi nghĩ rằng tôi đã bị mê hoặc bởi màu sắc.
Lặp lại

1
@Iterator: lưu ý rằng đó là tất cả các chức năng cốt truyện tiêu chuẩn R, không có ggplot2 tham gia :)
nico

Thánh cá thu. Bạn đúng! Thậm chí ấn tượng hơn. Kết luận của tôi: Tôi đã nhận cà phêeeeeeeeeeee.
Lặp lại

4

Đây là một biểu đồ dựa trên chữ cái. Được coi là định cỡ các chữ cái đầu tiên theo số, nhưng đã quyết định từ đó vì đã được mã hóa trong thành phần dọc.

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

phiên bản có tên một và hai chữ cái trên cùng một cốt truyện

biểu đồ dựa trên thư


2

Bảng tuần hoàn cho 100, Alex. Tôi không có mã cho nó, mặc dù. :

Mọi người có thể nghĩ rằng gói "bảng tuần hoàn" có thể đã tồn tại trong CRAN. Ý tưởng về sơ đồ tô màu và bố cục của dữ liệu đó có thể thú vị và hữu ích.

Chúng có thể được tô màu theo gói và được sắp xếp theo chiều dọc, ví dụ như trong một mẫu mã trên CRAN hoặc khi chúng xuất hiện trong cơ sở mã địa phương của một người.


Không chắc chắn nếu tôi theo bạn ... bạn có thể làm một bản phác thảo đơn giản về những gì bạn đang nghĩ đến? Tôi không thấy cách bố trí bảng tuần hoàn sẽ giúp ích ở đây ...
nico

@nico: Tôi đang nghĩ về một cái gì đó như thế này: vi.wikipedia.org/wiki/Periodic_table Giả sử rằng chúng ta thay thế "các phần tử cao quý" bằng các lệnh R cơ sở. Các halogen có thể được thay thế bằng (các) gói riêng, v.v. Với gói trực quan hóa như vậy, tôi sẽ để nó cho người dùng chỉ định bản chất của các hàng, cột, nhóm và màu. Nó sẽ là một điều khá đơn giản để thực hiện, mặc dù tôi sẽ làm điều đó rất thô sơ. Vị trí sẽ sao cho các mục trong cùng một nhóm (tức là gói) ở gần nhau. Vị trí dọc có thể được xác định bởi tần suất sử dụng.
Lặp lại

Được, giờ tôi hiểu rồi! Có lẽ tôi sẽ cố gắng xem liệu tôi có thể ra một cái gì đó không nhưng tôi cần tìm thời gian rảnh trước ... :(
nico

Tôi chưa hoàn toàn nhìn thấy nó, nhưng tôi rất phấn khích khi thấy ý tưởng này biến thành gì :-)
Ari B. Friedman

1
đã có một cái nhìn về stackexchange: Tal Galili đã hỏi về PSE một thời gian trước đây, vì vậy tôi đã không hỏi. Nhưng tôi vừa đẩy một đoạn mã đầu tiên lên r-forge: pse.R xin vui lòng đặt các ngôi sao xung quanh thanh toán - Tôi không biết làm thế nào để thoát chúng để chúng biến mất ...
cbeleites không hài lòng với SX

1

Hai trang đầu tiên trong chương 2 của ITILA của MacKay có sơ đồ đẹp cho thấy xác suất có điều kiện của tất cả các cặp ký tự trong ngôn ngữ tiếng Anh. Bạn có thể tìm thấy nó sử dụng.

Tôi cảm thấy xấu hổ khi nói rằng tôi không nhớ chương trình nào được sử dụng để sản xuất chúng.


1
Thật tuyệt, nhưng đối với tôi có vẻ như tất cả đều phụ thuộc vào việc có thêm một số thông tin (mức độ phổ biến) liên quan đến mỗi cặp chữ cái. Do đó, anh ấy vẽ đồ thị 3 chiều trong khi chúng tôi chủ yếu vẽ đồ thị 2 .... Tuy nhiên, tôi rất muốn có thông tin phổ biến cho R. Nhưng đó là một hoạt động khai thác dữ liệu cho một ngày khác.
Ari B. Friedman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.