web-dev-qa-db-ja.com

Rのbarplot()でバーを並べ替える

私が達成したいのは、すでにここで尋ねられたものとまったく同じです(特に、ggplotlatticeのようなパッケージではなく、Rの基本グラフィックを使用します): barplot()のバーの順序付け

しかし、そこで提案された解決策は私にはうまくいかないようです。私がする必要があるのは以下です。私はこれを持っていると仮定します:

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:length(num)])
data <- data.frame(num, cat)

barplot(data$num)を使用して棒グラフを生成すると、次のようになります。

ここで、data$catに従ってバーを並べ替えます。上記のリンクに従って、受け入れられた答えを試しましたが、エラーが発生しました:

num2 <- factor(num, labels = as.character(cat))
Error in factor(num, labels = as.character(cat)) : invalid 'labels'; length 10 should be 1 or 9

次に、他の答えも試しました:

num <- as.factor(num)
barplot(table(num))

しかし、ここに私が得たものがあります:

そのため、この質問とは少し異なるこの特定のケースでは、バープロットをどのように注文すれば、バーはdata$numで定義されますが、data$cat

9
Juddy

私は次のようになります、

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)
barplot(data[order(data[,1],decreasing=TRUE),][,1],names.arg=data[order(data[,1],decreasing=TRUE),][,2])

上記のコードは、order()関数を2回使用しています(以下のコメントを参照)。これを回避するために、順序付けられたdata.frameの結果を新しいdata.frameに保存し、これを使用してバープロットを生成できます。

num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)
data2  <- data[order(data[,1],decreasing=TRUE),]
barplot(data2[,1],names.arg=data2[,2])
5
user1945827

これを行うにはggplotを使用できます

library("ggplot2")
num <- c(1, 8, 4, 3, 6, 7, 5, 2, 11, 3)
cat <- c(letters[1:10])
data <- data.frame(num, cat)    
ggplot(data,aes(x= reorder(cat,-num),num))+geom_bar(stat ="identity")

結果は以下のようになります enter image description here

基本関数を使用する

df <- data[order(data$num,decreasing = TRUE),]
 barplot(df$num,names.arg = df$cat)

enter image description here

10
ArunK

また、データを新しいデータフレームに入れたくない場合は、次を使用することもできます。少し簡単です。

barplot(sort(data$num, decreasing = TRUE))
0
lambertj