2 harfli kombinasyonları görselleştirme


10

SO ile ilgili bu soruya verilen cevaplar, yaklaşık 125 bir - iki harfli ad kümesi döndürdü: /programming/6979630/what-1-2-letter-object-names-conflict-with-existing r-nesneler

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

Ve R ithalat kodu:

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

Sorunun amacı kaçınılması gereken unutulmaz bir nesne isimleri listesi oluşturmak olduğundan ve çoğu insan sağlam bir metin bloğundan anlam çıkarmak konusunda o kadar iyi değil, bunu görselleştirmek istiyorum.

Ne yazık ki bunu yapmanın en iyi yolundan tam olarak emin değilim. Kök ve yaprak grafiği gibi bir şey düşünmüştüm, ancak tekrarlanan değerler olmadığı için her bir "yaprak" iki yana yaslanmak yerine uygun sütuna yerleştirilmişti. Veya harflerin yaygınlığına göre boyutlandırıldığı bir wordcloud tarzı uyarlama.

Bu nasıl daha net ve verimli bir şekilde görselleştirilebilir?

Aşağıdakilerden birini yapan görselleştirmeler bu sorunun ruhuna uyar:

  • Birincil hedef: Verilerdeki kalıpları açığa çıkararak ad kümesinin ezberlenebilirliğini artırmak

  • Alternatif hedef: Ad kümesinin ilginç özelliklerini vurgulayın (örneğin, dağıtımı, en yaygın harfleri vb. Görselleştirmeye yardımcı olan)

R'deki cevaplar tercih edilir, ancak tüm ilginç fikirler kabul edilir.

Tek harfli adları görmezden gelmeye izin verilir, çünkü bunların ayrı bir liste olarak verilmesi daha kolaydır.

Yanıtlar:


12

İşte bir başlangıç: bunları birinci ve ikinci harflerin bir ızgarasında görselleştirin:

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

(öyleydi iki harf:) harflerle ızgara

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

ikinci mektup

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

ilk harf

Toplarım:

  • tek harfli isimlerden,

    • Neyse ki i, j, kvel vardır mevcut (ı 4d dizilere endeksi yukarı can böylece)
    • ne yazık ki t(zaman), c(konsantrasyon) gitti. Yani vardır m(kütle), V(hacim) ve F(kuvvet). Yarıçap rveya çap yok d.
    • Basınç ( p), madde miktarı ( n) ve uzunluğa sahip olabilirimlYine .
    • Belki Yunan isimlerine geçmek zorunda kalacağım: εTamam, ama sonra yapmamalıyım

      π <- pi

      ?

  • İstediğim lowerUPPERisme sahip olabilirim .

  • Genel olarak, büyük harfle başlamak küçük harften daha güvenli bir bahistir.

  • ile başlama cya dad


İyi bir başlangıç. Belki büyük / küçük harflerin nereye gittiğine dair daha iyi bir fikir vermek için 2d grafiğinden çeyrek çizgiler (büyük + olarak) ekleyin?
Ari B. Friedman

Bunu yaptığımı sanıyordum. Her neyse, işte burada. @ gsk3: resimleri yüklediğiniz için teşekkürler!
sbeleites SX

Güzel. Aksine, 2. isteme ilginç bir cevap verdiğiniz için teşekkürler. :-)
Ari B. Friedman

2D grafiğinize baktığınızda, başka bir öneri onu 27x26 ızgaraya indirgemek ve belirli bir harfin alt / üst / her ikisi birden varsa sembolleri veya renkleri (veya alfa ile titremeyi) değiştirmek olabilir. Ayrıca NA satırını görsel olarak ayırmak için farklı bir renk yapabilir.
Ari B. Friedman

1
Cevabı göndermeden önce 27 x 26'ya baktım (birinci ve ikinci harfe göre renk ve şekil büyük harf). Ama bu kolay bir mesaj vermedi, bu yüzden hemen daha büyük ızgaraya geri döndüm.
Sbeleites SX

8

Tamam, işte SO sorusuna ve diğerlerinin yorumlarına dayanan "periyodik tablo" benzeri bir görselleştirmeye çok çabuk başladım. Asıl sorun, paketler arasındaki değişken sayısındaki büyük farktır, bu da görselleştirmeyi engeller ... Bunun çok kaba olduğunu fark ediyorum, bu yüzden lütfen istediğiniz gibi değiştirmekten çekinmeyin.

İşte mevcut çıktı (paket listemden) Örnek grafik

Ve kod

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

Şimdi, böyle bir veri çerçevemiz var:

> 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

Şimdi verileri pakete göre ayırabiliriz

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

Değişkenlerin çoğunun temel ve istatistik paketinden geldiğini görebiliriz

> 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 

Son olarak, çizim rutini

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
Güzel! Bunu almanın ilginç bir yolu, bunları kategoriye göre gruplandırmak (örn. Grafik paketleri, veri işleme uygulamaları, vb.), Renk kodlaması ve daha sonra genel şekli histogram benzeri değil, daha kutu benzeri hale getirmektir.
Ari B. Friedman

+1 Ne muamele! :) Güzel iş. Periyodik tablo işlevselliği elde etmek için gerekli olacak tek şey tablo düzeni sanırım. Standart PT'nin 2 ızgarası vardır, bazı öğeler ilk 1'de eksiktir ve gruplar bölünür / yeniden düzenlenir (1 grup = 1 dikey sütun yerine). Dürüst olmak gerekirse, zor olacağını düşündüğüm kısım bu değil. Renklendirme ve blok düzeni beni en çok heyecanlandıran bölümdür ve bunun için ggplot2 kodunu görmek harika.
Iterator

Kahveye ihtiyacım var. Görüyorum ki gsk3 daha az kelimeyle aynı yoruma sahip. :) Renklerle büyülendiğimi düşünüyorum.
Iterator

1
@Iterator: tüm R standart arsa işlevlerine dikkat edin, ggplot2 dahil değildir :)
nico

Kutsal uskumru. Haklısın! Daha da etkileyici. Sonucum: Coffeeeeeeeeeee neeeeeeed.
Iterator

4

İşte harf tabanlı bir histogram. İlk harfleri sayı olarak boyutlandırmayı düşündünüz, ancak dikey bileşende zaten kodlanmış olduğundan buna karar verdiniz.

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

aynı grafikte bir ve iki harfli isimler

harf tabanlı histogram


2

100 için periyodik tablo, Alex. Yine de bunun için kodum yok. :(

CRAN'da bir "periyodik tablo" paketinin mevcut olabileceği düşünülebilir. Bir renklendirme şeması ve bu tür verilerin düzeni fikri ilginç ve yararlı olabilir.

Bunlar pakete göre renklendirilebilir ve örneğin CRAN üzerindeki bir kod örneğinde veya kişinin yerel kod tabanında göründüğü gibi frekansa göre dikey olarak sıralanabilir.


Seni takip edip etmediğimden emin değilim ... ne düşündüğünü basit bir şekilde çizebilir misin? Periyodik bir tablo düzeninin burada nasıl yardımcı olacağını görmüyorum ...
nico

@nico: Böyle bir şey düşünüyorum: en.wikipedia.org/wiki/Periodic_table "nobel elemanlarını" temel R komutlarıyla değiştirdiğimizi varsayalım. Halojenler kendi paket (ler) i ile değiştirilebilir. Böyle bir görselleştirme paketi ile, satırların, sütunların, grupların ve renklerin doğasını belirtmek için kullanıcıya bırakırım. Bunu uygulamak oldukça basit bir şey olmalı, ancak bunu çok kabaca yapardım. Yerleşim, aynı gruptaki (yani paket) öğeler birbirine yakın olacak şekilde olacaktır. Dikey yerleşim kullanım sıklığına göre belirlenebilir.
Iterator

Tamam şimdi anladım! Belki bir şeyle çıkıp çıkamayacağımı görmeye çalışacağım ama önce biraz boş zaman bulmam gerekiyor ... :(
nico

Henüz tam olarak göremiyorum, ama bu fikrin neye dönüştüğünü görmek için heyecanlıyım :-)
Ari B. Friedman

1
stackexchange'e bir göz attı: Tal Galili bir süre önce PSE'yi sordu, bu yüzden sormadım. Ama sadece r-forge için ilk kod biraz itti: pse.R lütfen ödeme etrafında yıldız koymak - yok nasıl bu yüzden yok böylece bilmiyorum ...
Sb

1

MacKay'ın ITILA'sının 2. bölümünde yer alan ilk iki sayfada , İngilizce'deki tüm karakter çiftlerinin koşullu olasılıklarını gösteren güzel diyagramlar bulunmaktadır. Kullanımda bulabilirsiniz.

Onları üretmek için hangi programın kullanıldığını hatırlamadığımı söylemekten utanıyorum.


1
Havalı, ama bana öyle geliyor ki, bunların hepsi her harf-mektup çifti ile ilişkili bazı ek bilgilere (yaygınlık) sahip olmaya bağlı. Bu yüzden 3 boyut grafik çiziyor, ancak biz esas olarak 2 grafik çiziyoruz .... Yine de R için yaygınlık bilgisine sahip olmak isterdim. Ama bu başka bir gün için bir veri madenciliği operasyonu.
Ari B. Friedman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.