Подтвердить что ты не робот

Самый простой способ сгруппировать барплот

У меня есть следующий фреймворк:

 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 цвета для catergory.

Я бы разместил изображение того, что у меня есть, но у меня недостаточно очков репутации... но вот мой код:

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

Теперь, что я хочу, не нужно дважды отмечать два бара и группировать их друг с другом, я попытался изменить значение пространства на всевозможные вещи и, похоже, не раздвигает столбцы. Может ли кто-нибудь сказать мне, что я делаю неправильно?

4b9b3361

Ответ 1

с 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

Ответ 2

Не решение 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

Ответ 3

Есть несколько способов сделать графики в R; lattice является одним из них и всегда разумным решением, +1 для @agstudy. Если вы хотите сделать это в базовой графике, попробуйте следующее:

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

Вот что я сделал: я создал матрицу с двумя столбцами (потому что ваши данные были в столбцах), где столбцы были подсчетами видов для Decline и для Improved. Затем я сделал эти категории именами столбцов. Я также сделал Reason имена строк. Функция barplot() может работать над этой матрицей, но ей нужны данные в строках, а не в столбцах, поэтому я передал ей транспонированную версию матрицы. Наконец, я удалил некоторые ваши аргументы для вызова функции barplot(), которые больше не нужны. Другими словами, проблема заключалась в том, что ваши данные не были настроены так, как barplot() хочет для вашего предполагаемого вывода.

Ответ 4

Я написал оболочку функции bar() для barplot(), чтобы делать то, что вы пытаетесь сделать здесь, так как мне нужно делать подобные вещи часто. Ссылка Gitub на функцию здесь. После копирования и вставки его в 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. 

Единственное удобство заключается в том, что он поместит легенду на сюжет, используя имена уровней в вашей категориальной переменной (например, "Отклонить" и "Улучшено" ). Если каждый из ваших уровней имеет несколько наблюдений, он также может отображать полосы ошибок (которые здесь не применяются, следовательно errbar=FALSE

enter image description here