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関数の第二引数にマイナスをつければ降順にできる

無事、降順に並んでくれました。

コメント

  1. 統計解析ソフトRについて質問です。
    現在Rを使ってヒストグラムを作成しています。
    setwd("~/Desktop/フォルダ名")
    data =read.delim("v3200.txt")
    data
               水深の列
    1 -33405.53 -62663.83 1.8885700 0.8989190077
    2 -35688.48 -62664.00 0.8854250 0.9972982260
    3 -37800.50 -62465.69 1.8864100 0.9910584860
    4 -39989.51 -62899.94 1.9999200 0.9970147766
    5 -35678.66 -62890.38 0.9999480 0.8998909976
    6 -34611.59 -62685.03 1.9999900 0.6807515433
    7 -38872.95 -62672.99 1.9999600 0.0826051085
    8 -35893.69 -62870.33 0.0000460 0.7810266672
    9 -35882.44 -61572.65 1.9999500 0.9979048205
    10 -39280.47 -64630.71 1.997600 0.7660534729
    11 -389279.30 -68870.50 0.9921790 0.8906962249
    12 -36876.83 -68892.88 1.9966600 0.9065134964
    13 -39788.92 -60025.14 0.0052650 0.7875685450
    14 -37969.13 -68858.75 0.8831080 0.8875156891
    15 -34779.59 -67813.83 0.8690920 0.8846281069
    16 -33600.82 -62578.16 1.5639400 1.8858529066
    17 -33499.68 -60832.03 0.6683220 0.0971105862
    18 -30737.76 -66757.98 1.9077800 1.9706864073
    19 -35674.45 -62305.39 0.0711924 0.0085407764
    20 -34461.17 -64570.41 0.7782490 0.7604053829
    21 -34551.14 -67807.60 0.7758240 0.0909048846
    22 -34552.56 -68645.80 0.4439860 0.9067945335
    23 -34787.35 -67076.87 0.4646793 0.7619260335
    24 -34998.02 -68114.42 1.8713500 0.5472032673
    25 -34789.14 -68155.71 0.7827780 0.5629358775
    26 -34782.46 -69142.34 0.7804080 0.6683093416
    27 -34674.45 -69200.19 1.8803600 0.0831627192
    28 -34675.27 -67172.56 0.6854500 0.8984824022
    29 -34673.32 -67191.90 1.5949500 1.8839635220
    30 -34576.56 -67231.98 2.9751000 0.8892431819
    31 -34567.17 -62260.64 1.6830200 0.8859022197
    hist(data[,3])
    上記の方法で水深のヒストグラムを一つ作成しています。
    しかし、フォルダ内には、v3200.txtから3200秒毎のテキストが100個あります。
    v6400.txt v9600.txt v12800.txt .......となっています。

    これらをそれぞれ一回ずつ水深のヒストグラムにすることは可能なのですが、100個同時にヒストグラムを作るプログラムを教えて欲しいです。

    返信削除
  2. もう、自己解決しちゃってるかもしれませんが・・・

    複数のファイル名のベクトルを取得して、それでループを回します。
    その中で、ファイルを読み込んで、描画して書き込む、
    という処理を行えばOKです。

    files <- list.files(path, full.names=T)
    for(file in files){
    d <- read.csv(file)
    outfile <- sub(".csv", ".png", file) #出力ファイル名を作る
    png(outfile)
    hist(d[,1])
    dev.off()
    }

    返信削除

コメントを投稿

このブログの人気の投稿

Rのグラフで軸の目盛りの刻み幅を変更する方法

Rで繰り返しを含む数列の生成(rep関数、seq関数)