Memvisualisasikan kombinasi 2 huruf


10

Jawaban untuk pertanyaan ini pada SO mengembalikan sekumpulan kurang lebih 125 nama satu hingga dua huruf: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing -r-benda

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

Dan kode impor 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")

Karena inti pertanyaannya adalah membuat daftar nama objek yang mudah diingat untuk dihindari, dan sebagian besar manusia tidak begitu pandai dalam memahami blok teks yang solid, saya ingin memvisualisasikannya.

Sayangnya saya tidak yakin cara terbaik untuk melakukan ini. Saya telah memikirkan sesuatu seperti plot batang dan daun, hanya karena tidak ada nilai berulang setiap "daun" ditempatkan di kolom yang sesuai daripada dibenarkan dibiarkan. Atau adaptasi gaya kata-kata di mana huruf-huruf berukuran sesuai dengan prevalensinya.

Bagaimana ini bisa divisualisasikan dengan sangat jelas dan efisien?

Visualisasi yang melakukan salah satu dari yang berikut ini sesuai dengan semangat pertanyaan ini:

  • Tujuan utama: Meningkatkan daya ingat himpunan nama dengan mengungkapkan pola dalam data

  • Sasaran alternatif: Sorot fitur menarik dari rangkaian nama (mis. Yang membantu memvisualisasikan distribusi, huruf paling umum, dll.)

Jawaban dalam R lebih disukai, tetapi semua ide menarik dipersilakan.

Mengabaikan nama huruf tunggal diperbolehkan, karena itu lebih mudah untuk diberikan sebagai daftar terpisah.

Jawaban:


12

Ini adalah permulaannya: bayangkan ini pada kisi-kisi huruf pertama dan kedua:

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

(tadinya dua huruf:) kotak dengan huruf

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

huruf kedua

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

surat pertama

Aku mengumpulkan:

  • dari satu nama surat,

    • untungnya i, j, k, dan ltersedia (jadi saya dapat mengindeks hingga array 4d)
    • sayangnya t(waktu), c(konsentrasi) hilang. Begitu juga m(massa), V(volume) dan F(kekuatan). Tidak ada radius ratau diameter d.
    • Saya dapat memiliki tekanan ( p), jumlah zat ( n), dan panjangnya l.
    • Mungkin saya harus mengubah ke nama-nama Yunani: εtidak apa-apa, tapi kemudian tidak

      π <- pi

      ?

  • Saya dapat memiliki lowerUPPERnama apa pun yang saya inginkan.

  • Secara umum, memulai dengan huruf besar adalah taruhan yang lebih aman daripada huruf kecil.

  • jangan mulai dengan cataud


Awal yang bagus. Mungkin menambahkan garis kuadran (dalam + besar) melalui plot 2d untuk memberikan rasa yang lebih baik ke mana huruf besar / kecil pergi?
Ari B. Friedman

Kupikir aku melakukan itu. Bagaimanapun, ini dia. @ gsk3: terima kasih telah mengunggah gambar!
cbeleites tidak senang dengan SX

Bagus. Dan sebaliknya, terima kasih telah memberikan jawaban yang menarik untuk meminta # 2. :-)
Ari B. Friedman

Melihat plot 2d Anda, saran lain mungkin untuk menguranginya menjadi kisi 27x26 dan mengubah simbol atau warna (atau jitter dengan alpha) jika huruf yang diberikan memiliki huruf kecil / atas / keduanya. Bisa juga membuat baris NA warna berbeda untuk memisahkannya secara visual.
Ari B. Friedman

1
Saya telah melihat pada 27 x 26 sebelum memposting jawaban (dengan warna dan bentuk sesuai dengan huruf pertama dan kedua menjadi huruf besar). Tapi itu tidak menyampaikan pesan yang mudah, jadi saya segera kembali ke kotak yang lebih besar.
cbeleites tidak senang dengan SX

8

Ok, inilah saya sangat cepat mengambil visualisasi seperti "tabel periodik", berdasarkan pertanyaan SO dan komentar yang lain. Masalah utama adalah perbedaan besar dalam jumlah variabel antara paket, jenis yang menghalangi visualisasi ... Saya menyadari ini sangat kasar, jadi jangan ragu untuk mengubahnya sesuai keinginan.

Ini adalah keluaran saat ini (dari daftar paket saya) Contoh plot

Dan kodenya

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

Sekarang, kami memiliki kerangka data seperti ini:

> 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

Kami sekarang dapat membagi data berdasarkan paket

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

Kita dapat melihat bahwa sebagian besar variabel berasal dari paket basis dan statistik

> 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 

Akhirnya, rutinitas menggambar

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
Bagus! Salah satu cara menarik untuk mengelompokkannya adalah dengan mengelompokkannya berdasarkan kategori (mis. Paket grafik, praktik manipulasi data, dll.), Kode warna mereka, dan kemudian membuat bentuk keseluruhan lebih seperti kotak daripada seperti histogram.
Ari B. Friedman

+1 Apa yang memperlakukan! :) Kerja yang sangat bagus. Saya kira satu-satunya hal yang diperlukan untuk mendapatkan fungsionalitas tabel periodik adalah tata letak tabel. PT standar memiliki 2 kisi, dengan beberapa elemen hilang di atas 1, dan grup dibagi / disusun kembali (berlawanan dengan 1 grup = 1 kolom vertikal). Sejujurnya, itu bukan bagian yang saya pikir akan sulit. Pewarnaan dan tata letak blok adalah bagian yang paling membuat saya bersemangat & senang melihat kode ggplot2 untuknya.
Iterator

Aku butuh kopi. Saya melihat bahwa gsk3 memiliki komentar yang sama dengan lebih sedikit kata. :) Saya pikir saya terpesona oleh warna.
Iterator

1
@Iterator: perhatikan bahwa itu semua fungsi plot standar R, tidak ada ggplot2 yang terlibat :)
nico

Makarel suci. Kamu benar! Bahkan lebih mengesankan. Kesimpulan saya: Saya neeeeeeed coffeeeeeeeeeeeee.
Iterator

4

Berikut histogram berbasis surat. Dianggap ukuran huruf pertama dengan nomor, tetapi memutuskan karena itu sudah dikodekan dalam komponen vertikal.

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

versi dengan nama satu dan dua huruf pada plot yang sama

histogram berbasis surat


2

Tabel Periodik untuk 100, Alex. Saya tidak punya kode untuk itu. :(

Orang mungkin berpikir bahwa paket "tabel periodik" mungkin sudah ada di CRAN. Gagasan skema pewarnaan dan tata letak data tersebut bisa menarik dan bermanfaat.

Ini bisa diwarnai oleh paket dan diurutkan secara vertikal berdasarkan frekuensi, misalnya dalam sampel kode pada CRAN atau seperti yang muncul dalam basis kode lokal seseorang.


Tidak yakin jika saya mengikuti Anda ... bisakah Anda membuat sketsa sederhana dari apa yang Anda pikirkan? Saya tidak melihat bagaimana tata letak tabel periodik akan membantu di sini ...
nico

@nico: Saya memikirkan sesuatu seperti ini: en.wikipedia.org/wiki/Periodic_table Misalkan kita mengganti "elemen nobel" dengan perintah dasar R. Halogen mungkin digantikan oleh paket sendiri, dan sebagainya. Dengan paket visualisasi seperti itu, saya akan menyerahkannya kepada pengguna untuk menentukan sifat baris, kolom, grup, dan pewarnaan. Itu harus menjadi hal yang cukup sederhana untuk diterapkan, meskipun saya akan melakukannya dengan sangat kasar. Penempatan akan sedemikian rupa sehingga barang-barang dalam kelompok yang sama (yaitu paket) saling berdekatan. Penempatan vertikal dapat ditentukan oleh frekuensi penggunaan.
Iterator

OK sekarang saya mengerti! Mungkin saya akan mencoba untuk melihat apakah saya bisa keluar dengan sesuatu tetapi saya harus mencari waktu luang dulu ... :(
nico

Saya belum melihatnya, tapi saya senang melihat bagaimana ide ini berubah menjadi :-)
Ari B. Friedman

1
telah melihat stackexchange: Tal Galili memang bertanya tentang PSE beberapa waktu lalu, jadi saya tidak bertanya. Tapi saya hanya mendorong sedikit kode pertama ke r-forge: pse.R tolong beri tanda bintang di checkout - Saya tidak tahu bagaimana cara melarikan diri sehingga mereka menghilang ...
cbeleites tidak senang dengan SX

1

Dua halaman pertama dalam bab 2 dari ITILA MacKay memiliki diagram yang bagus yang menunjukkan probabilitas kondisional dari semua pasangan karakter dalam bahasa Inggris. Anda mungkin menemukannya berguna.

Saya malu mengatakan bahwa saya tidak ingat program apa yang digunakan untuk memproduksinya.


1
Ini keren, tetapi bagi saya sepertinya semua tergantung pada memiliki beberapa informasi tambahan (prevalensi) yang terkait dengan setiap pasangan surat-surat. Jadi dia menggambar 3 dimensi sedangkan kita terutama menggambar 2 .... Saya ingin memiliki info prevalensi untuk R. Tapi itu operasi penambangan data untuk hari lain.
Ari B. Friedman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.