投稿

ラベル(ggplot)が付いた投稿を表示しています

reorderを使ってggplotの棒グラフの並び順を降順にする方法

イメージ
# サンプルデータの作成 fruits <- c("apple","durian","orange") count  <- c(2, 1, 3) df <- data.frame(fruits, count) df # 中身の確認   fruits count 1  apple     2 2 durian     1 3 orange     3 このデータを使って、ggplotで棒グラフを描いてみると、 library(ggplot2) ggplot(df, aes(x=fruits, y=count))   + geom_bar(stat="identity") 並び順はデータのまま 当然ながら、棒の順番はデータ通りに、2、1、3と並びますね。 これをソートしたい場合は、reorderを使います↓ ggplot(df, aes( x=reorder(fruits, count) , y=count)) +   geom_bar(stat="identity") reorderすると昇順に並ぶ x軸はfruitsなんだけど、reorder関数の第二引数であるcountの値で並べ替えてから使ってね、という指定です。 で、次の課題です。 reorderを使うと、昇順で1、2、3という並びになりましたが、これを降順の3、2,1という並びにしたいときは、どうやればいいか。 データフレームをソートするときなんかに使うorder関数でいうところの「decreasing=TRUE」みたいな指定があればいいのですが、reorder関数にはそのようなオプションはなさそうです。 で、実はごく簡単で、reorderの第二引数(count)の値の正負が逆になれば、順番も逆になるじゃんという理屈です。 ggplot(df, aes(x=reorder(fruits, -count ), y=count)) +   geom_bar(stat="identity") reorder関数の第二引数にマイナスをつければ降順に...

「データの見えざる手」のU分布を、Rでシミュレート(改)

イメージ
↓以前、こちらの記事を書いたのですが、 「データの見えざる手」のU分布を、Rでシミュレート よくよく見てみると、書籍と軸の取り方が違ったりして、つっこみどころ満載だったので、悔い改めて、ちゃんとやることにしました。 書籍では、横軸がマスに入っている個数、縦軸が累積確率になっていました。 あと、初期値もちゃんとランダムで設定するようにしました。 それと、対数プロットする際に、軸の目盛ラベルの付けやすさから、ggplotを使ってみました。 library(ggplot2) library(scales) n <- 72000 # 点の個数 m <- 900   # マスの個数 masu <- numeric(m) # 空のマスを用意 # 点をランダムにマスに配置 indices <- sample(1:900, 72000, replace=T) for(i in indices){   masu[i] <- masu[i] + 1 } for( i in 1:100000000 ) {   s <- sample(1:m, 2) # ランダムに2つのマスを選ぶ   if( masu[s[1]] != 0 ) { # 無い袖は振れないケースへの対処     masu[s[1]] <- masu[s[1]] - 1 # 1つ目のマスから取って、     masu[s[2]] <- masu[s[2]] + 1 # 2つ目のマスへ入れる   } } tbl <- table(masu)     # 個数を集計 df <- data.frame(tbl) # データフレームにする # 列名を分かりやすくする colnames(df) <- c("num_of_dots", "freq") # 点の数が因子型なので、整数型に変えておく df$num_of_dots <- as.integer(df$num_of_dots) # 累積確率を計算 df$cum_prob <- rev(cumsum(rev(df$f...

Rでデータフレームを部分抽出後、ベクトルや行列に変換する

イメージ
例えば↓こんな感じで、各市町村の人口データがあったとします。 city   <- c("A市", "B町", "C村", "D市") male   <- c(95, 49, 26, 45) female <- c(99, 51, 24, 55) df <- data.frame(city, male, female) df   city male female 1  A市   95     99 2  B町   49     51 3  C村   26     24 4  D市   45     55 で、人口や男女比を比較するために、それぞれの市町村に対してグラフを描いてみようとしたとします。 じゃあ、1行ごとにループで回しながら、barplotあたりを使って、グラフを描いてみようとしまして、↓こんな風にスクリプトを書くと(iがループのカウンタだと思ってね)、 # i行目の男女人口を棒グラフにしたい・・・ barplot(df[i, c("male", "female")])  barplot.default(df[i, c("male", "female")]) でエラー:    'height' はベクトルか行列でなければなりません なんでだ?と思って、切り出される部分をチェックしてみると、 df[i, c("male", "female")]   male female 1   95     99 class(df[i, c("male", "female")]) [1] "data.frame" 構成要素としては、2つの数値の並びになっているもの、型がデータフレームなもんだから、barplotにそのまま渡すとエラーになってしまうのね。ちなみに、円グラフのpie...

Rを使って福岡市の人口密度ランキング(町丁目単位)

イメージ
福岡県の市単位(政令指定都市は区単位)の人口密度単位のランキングは、↓こちらにあって、 福岡県の人口密度番付 - 都道府県・市区町村ランキング【日本・地域番付】   1位 福岡市 中央区(11770人/㎢)   2位 福岡市 城南区( 8031人/㎢)   3位 福岡市 南区 ( 7976人/㎢) となっております。トップは予想通りの福岡市中央区。 ただ、中央区と言ってもそれなりに広いし、人口密度にはムラがあるでしょうし、もしかしたら他の区にもギュギュっと人の密集しているエリアがあるかもしれません。 ということで、Rを使って町丁目単位(博多駅前1丁目とか、天神2丁目とか)でのランキングを出してみました。 とりあえず結果をどうぞ↓ 中央区全体の人口密度は 11770人/㎢ でしたが、中央区荒戸2丁目で人口密度を計算すると 49294人/㎢ と、4倍以上の数字を叩き出しました。 また、上位5位の荒戸、平尾、薬院、高砂はいずれも中央区の町名ですが、6位に入っている愛宕浜は西区にある町です。 西区と言えば福岡市の中では辺境ですし(注:著者の個人的なイメージです)、前述の市区単位のランキングでは17位とかなり下位にランキングされてました、 実は、この愛宕浜2丁目は室見川をはさんで早良区のすぐ対岸にあって、比較的都市部に近い場所なんですよね。そして、ほとんどマンションしかありません(他には中学校とマルキョウがある)。大抵のマンションは10階以上あるので、おのずと人口密度が高くなるわけですね。 ↓Google Earthで見てみるとこんな感じ では、最後にRスクリプトを載せておきます。 シェープファイルは↓こちらに書いてある方法で入手して、 e-Stat(統計局)で公開されているShapeファイルを、Rで表示する - Rプログラミングの小ネタ ↓このやり方でマージしました。 Rで複数のシェープファイルを結合する - Rプログラミングの小ネタ library ( maptools ) library ( ggplot2 )   # シェープファイルを読み込む pj <- CRS ( "+proj=longlat +datum=WGS84" ) shp <-r...

RでFukuoka City Wi-Fiの利用状況を可視化する

イメージ
オープンデータとして、Fukuoka City Wi-Fiの利用状況のCSVファイルが公開されています↓ Fukuoka City Wi-Fi 利用状況 - データセット - 福岡市のCKAN が、例によってなかなか扱いにくそうなフォーマットになっております↓ 福岡市のオープンデータサイトで公開されていたCSVの形式 1拠点の1日が1行になっており、その行の中に0時台、1時台、2時台、~、23時台のように横に伸びてデータが格納されています。別の日は、別の行に格納されています。 そのままじゃ扱いにくそうなので、日付時刻型で表現して、形もシンプルにしましょう。 d <- read.csv ( "201410access.csv" )   d <- d [ d$X != "合計" , ] # 合計が入っているレコードは削除する   df <- data.frame ( ) # 空のデータフレームを用意しておく   for ( i in 1 : nrow ( d ) ) { tmp <- paste ( d [ i , ] $X , sprintf ( "%02d" , 0 : 23 ) ) YmdH <- strptime ( tmp , "%Y%m%d %H" )   value <- as.vector ( t ( d [ i , 4 : 27 ] ) )   df <- rbind ( df , data.frame ( 年月日時 = YmdH , 拠点名 = d [ i , ] $拠点名 , 認証回数 = value ) ) } そうすると、冗長だけどシンプルな形式になりました↓ CSVの形式を変えてみたもの ひと月の合計値で棒グラフを書いてみましょう。認証回数の少ない順にソートしています。なんとなくggplotを使ってみました。(いまいち、まだ慣れていない感が・・・) ggplotの...

Rのhistとggplot(geom_histogram)を比較する

イメージ
ggplot2パッケージって使ったことありませんでした。記法がとっつきにくいというのもあったのですが、あの見た目を素直に「きれい」とは認めたくなかったというか。「ggplotの方がかっこいい」という人への反発みたいな部分も多分にあるのですが。 「白地に線画」みたいなビジュアルが好きなんです。下手に色をつけたらかえって趣味が悪くなったりするじゃないですか。自分自身センスがないことを自覚しているので、色やら塗りつぶしやら飾りっぽいものやらは極力使わないようにしていたんですよね。 でも今回、ggplot2パッケージを使ってみようと思ったのは、ベースとなるレイヤーを用意して、次に重ねたいレイヤーを(場合によっては複数)用意して、最後にバンっとplotする、っていうコンセプトがなんだか使いやすいのではないかという気がしたから。なので、徐々に試していこうかなと思っています。 前置きが長くなりました。 今回はヒストグラムですが、多くの人に馴染みのあるデフォルトのhistでの描画と、ggplot2パッケージを使った場合とで、どんな風に違うのか試してみました。 正規分布に従う乱数を発生させて、普通にヒストグラムを描いてみます。 data1 <- rnorm ( 1000 )   hist ( data1 ) 通常のhist関数で描画 ggplot2パッケージを使うと↓こんな描き方になります。 install.packages ( "ggplot2" ) library ( ggplot2 )   df1 <- data.frame ( data1 ) # データフレームにしておく必要がある   g <- ggplot ( df1 , aes ( x=data1 ) ) # 対象がdata1列であることを指定 g <- g + geom_histogram ( ) # ヒストグラムを描画することを指定 plot ( g ) # 描画 ggplot2パッケージを使ったもの 先ほどの、デフォルトのhistと階級幅を合わせる(=0.5)には、binwidthを指定します↓ g ...