2文字の組み合わせの視覚化


10

SOに関するこの質問への回答では、約125の1文字から2文字の名前のセットが返されました。https : //stackoverflow.com/questions/6979630/what-1-2-letter-object-names-conflict-with-existing -r-objects

  [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での回答が推奨されますが、興味深いアイデアはすべて歓迎されます。

1文字の名前は、個別のリストとして指定する方が簡単なので、無視できます。

回答:


12

これが始まりです:最初と2番目の文字のグリッドでこれらを視覚化します。

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

最初の文字

私が集める:

  • 一文字の名前の

    • 幸いなことにijk、及びl(I 4Dはアレイへのインデックスアップできるように)利用可能です
    • 残念ながら、t(時間)、c(集中)はなくなりました。そうであるm(質量)、 V(体積)及びF(力)。半径rも直径もありませんd
    • でも、私は圧力(p)、物質の量(n)、そして長さを持つことができlます。
    • 多分私はギリシャ語の名前に変更しεなければならないでしょう:大丈夫ですが、そうすべきではありません

      π <- pi

  • 好きなlowerUPPER名前を付けることができます。

  • 一般に、大文字から始める方が小文字より安全です。

  • cまたはで始まらないd


いいスタートです。おそらく、大文字/小文字がどこに行くのかをよりよく理解するために、2dプロットに象限線(大きな+で)を追加しますか?
Ari B. Friedman

私はそれをしたと思った。とにかく、ここです。@ gsk3:写真をアップロードしてくれてありがとう!
cbeleitesはSXに不満

いいね。それどころか、プロンプト#2に興味深い答えを提供してくれてありがとう。:-)
アリB.フリードマン、

2Dプロットを見ると、27x26グリッドに縮小して、特定の文字が下/上/両方にある場合は記号または色(またはアルファ付きのジッター)を変更することもできます。NA行を別の色にして、視覚的に区別することもできます。
Ari B. Friedman、

1
回答を投稿する前に、27 x 26を見ました(最初の文字と2番目の文字に応じた色と形は大文字です)。しかし、それでは簡単なメッセージが伝わらなかったので、すぐに大きなグリッドに戻りました。
cbeleitesはSXに満足していない2011

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
いいね!これを行う1つの興味深い方法は、それらをカテゴリ(たとえば、グラフィックパッケージ、データ操作の実践など)でグループ化し、カラーコーディングして、全体的な形状をヒストグラムではなくボックスのようにすることです。
アリB.フリードマン

+1なんてご馳走でしょう!:)とてもいい仕事です。定期的なテーブルの機能を実現するために必要なのは、テーブルのレイアウトだけだと思います。標準のPTには2つのグリッドがあり、上部1にいくつかの要素がありません。グループは分割/再配置されています(1つのグループ= 1つの垂直列とは対照的)。正直なところ、それは難しいと思った部分ではありません。カラーリングとブロックレイアウトは、私を最もワクワクさせる部分です。そのためのggplot2コードを見るのは素晴らしいことです。
イテレータ2011

私はコーヒーが必要。gsk3には同じコメントがあり、単語数が少ないことがわかります。:)私は色に魅了されたと思います。
イテレータ2011

1
@イテレーター:すべてのR標準プロット関数であり、ggplot2は関与しないことに注意してください:)
nico

聖なるサバ。あなたが正しい!さらに印象的です。私の結論:私はcoffeeeeeeeeeeeを必要としました。
イテレータ2011

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の周期表、アレックス。ただし、コードはありません。:(

「周期表」パッケージがすでにCRANに存在していると思われるかもしれません。そのようなデータの配色スキームとレイアウトのアイデアは、興味深く、役に立つかもしれません。

これらは、パッケージごとに色分けしたり、周波数によって垂直にソートしたりできます。


私があなたに従うかどうかわからない...あなたが考えていることの簡単なスケッチを作ってくれませんか?周期表のレイアウトがどのように役立つかわかりません...
nico

@nico:私は次のようなものを考えています:en.wikipedia.org/wiki/Periodic_table 「ノーベル要素」をベースRコマンドで置き換えると仮定します。ハロゲンは、独自のパッケージに置き換えられる場合があります。そのような視覚化パッケージでは、行、列、グループ、および色付けの性質を指定するのはユーザーに任せます。実装するのはかなり簡単なはずですが、大雑把にやります。同じグループ(つまり、パッケージ)のアイテムが互いに近くなるような配置になります。垂直配置は、使用頻度によって決定できます。
イテレータ2011

ああ、わかってるよ!多分私は何かで出てくることができるかどうかを確認しようとしますが、私は最初にいくつかの時間を見つける必要があります... :(
nico

私はまだそれを完全には見ていませんが、このアイデアがどうなるかを見て興奮しています:-)
Ari B. Friedman

1
stackexchangeを確認しました。TalGaliliは少し前にPSEについて質問したので、私は質問しませんでした。しかし、私はコードの最初のビットをr-forgeにプッシュしました:pse.R チェックアウトの周りに星を置いてください -それらを消滅させる方法がわからないので、消えます...
cbeleitesは

1

MacKayのITILAの第2章の最初の2ページには、英語のすべての文字の組み合わせの条件付き確率を示す素晴らしい図があります。あなたはそれを使うのを見つけるかもしれません。

それらを作成するために使用されたプログラムを覚えていないことを言って私は恥ずかしいです。


1
すばらしいのですが、それらはすべて、文字と文字の各ペアに関連付けられた追加情報(普及率)に依存しているようです。したがって、彼は3次元をグラフ化していますが、主に2をグラフ化しています。ただし、Rの有病率情報が欲しいです。しかし、それは別の日のデータマイニング操作です。
Ari B. Friedman
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.