web-dev-qa-db-ja.com

グループ化されたバープロットを行う最も簡単な方法

私は次のデータフレームを持っています:

 Catergory        Reason Species
1   Decline       Genuine      24
2  Improved       Genuine      16
3  Improved Misclassified      85
4   Decline Misclassified      41
5   Decline     Taxonomic       2
6  Improved     Taxonomic       7
7   Decline       Unclear      41
8  Improved       Unclear     117

私は、グループ化された棒グラフ、高さとしての種、そして食用の2色を作成しようとしています。

私が持っているものの画像を投稿しますが、評判ポイントが十分ではありません...しかし、ここに私のコードがあります:

Reasonstats<-read.csv("bothstats.csv")
Reasonstats2<-as.matrix(Reasonstats[,3])


barplot((Reasonstats2),beside=T,col=c("darkblue","red"),ylab="number of 
species",names.arg=Reasonstats$Reason, cex.names=0.8,las=2,space=c(0,100)
,ylim=c(0,120))
box(bty="l")

今私が欲しいのは、2つのバーに2回ラベルを付けてグループ化する必要がないことです。スペース値をあらゆる種類のものに変更しようとしましたが、バーを離れるように見えることはありません。誰が私が間違っているのか教えてもらえますか?

29
Dizzy Bean

ggplot2の場合:

library(ggplot2)
Animals <- read.table(
  header=TRUE, text='Category        Reason Species
1   Decline       Genuine      24
2  Improved       Genuine      16
3  Improved Misclassified      85
4   Decline Misclassified      41
5   Decline     Taxonomic       2
6  Improved     Taxonomic       7
7   Decline       Unclear      41
8  Improved       Unclear     117')

ggplot(Animals, aes(factor(Reason), Species, fill = Category)) + 
  geom_bar(stat="identity", position = "dodge") + 
  scale_fill_brewer(palette = "Set1")

Bar Chart

40
Jack Ryan

barplotソリューションではなく、latticeおよびbarchartを使用:

library(lattice)
barchart(Species~Reason,data=Reasonstats,groups=Catergory, 
         scales=list(x=list(rot=90,cex=0.8)))

enter image description here

28
agstudy

Rでプロットを行う方法はいくつかあります。 latticeはそのうちの1つであり、常に妥当な解決策であり、@ agstudyに+1します。基本グラフィックスでこれを実行したい場合は、次を試してください。

Reasonstats <- read.table(text="Category         Reason  Species
                                 Decline        Genuine       24
                                Improved        Genuine       16
                                Improved  Misclassified       85
                                 Decline  Misclassified       41
                                 Decline      Taxonomic        2
                                Improved      Taxonomic        7
                                 Decline        Unclear       41
                                Improved        Unclear      117", header=T)

ReasonstatsDec <- Reasonstats[which(Reasonstats$Category=="Decline"),]
ReasonstatsImp <- Reasonstats[which(Reasonstats$Category=="Improved"),]
Reasonstats3   <- cbind(ReasonstatsImp[,3], ReasonstatsDec[,3])
colnames(Reasonstats3) <- c("Improved", "Decline")
rownames(Reasonstats3) <- ReasonstatsImp$Reason

windows()
  barplot(t(Reasonstats3), beside=TRUE, ylab="number of species", 
          cex.names=0.8, las=2, ylim=c(0,120), col=c("darkblue","red"))
  box(bty="l")

enter image description here

私がやったことは次のとおりです。列がDeclineImprovedの種数である2列の行列を作成しました(データは列にあるため)。次に、これらのカテゴリを列名にしました。また、Reasonsを行名にしました。 barplot()関数はこの行列に対して操作できますが、列ではなくのデータが必要なので、行列の転置バージョンを入力しました。最後に、不要になったbarplot()関数呼び出しの引数の一部を削除しました。 つまり、問題はデータが適切に設定されていないことでしたbarplot()目的の出力が必要です

23
gung

同様のことを頻繁に行う必要があるため、ここでしようとしていることを行うために、bar()barplot()という関数ラッパーを作成しました。関数へのGithubリンクは here です。 Rにコピーして貼り付けたら、

bar(dv = Species, 
    factors = c(Category, Reason), 
    dataframe = Reasonstats, 
    errbar = FALSE, 
    ylim=c(0, 140))  #I increased the upper y-limit to accommodate the legend. 

便利な方法の1つは、カテゴリ変数のレベルの名前(たとえば、 "Decline"および "Improved")を使用して、プロットに凡例を表示することです。各レベルに複数の観測値がある場合、エラーバーもプロットできます(ここでは適用されないため、errbar=FALSE

enter image description here

17
Alex