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

У меня есть следующий кадр данных:

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

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


person Dizzy Bean    schedule 18.07.2013    source источник


Ответы (4)


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

Гистограмма

person Jack Ryan    schedule 18.07.2013
comment
Очень полезно, Спасибо! - person ganeshran; 26.09.2016
comment
@ Джек Райан Должен быть ggplot(Animals, aes(factor(Reason), Species или ggplot(Animals, aes(factor(Reason), as.factor(Species) ? Потому что в моем случае у меня были данные в том же формате, но вместо групповой панели была сделана панель стека. - person RKR; 27.04.2017
comment
Как указал RKR, ggplot ожидает факторы при построении сгруппированной гистограммы. У меня также были аналогичные данные, но я не читал столбцы как факторы из-за других требований, и я не мог построить сгруппированный столбец, пока не определил это требование. - person iMajetyHK; 08.09.2018

Не решение barplot, а использование lattice и barchart:

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

введите здесь описание изображения

person agstudy    schedule 18.07.2013
comment
как насчет легенды для цветов здесь? - person maciek; 07.10.2016
comment
@maciek Вы можете использовать auto.key = T в функции barchart, чтобы иметь легенду. - person Bappa Das; 23.07.2020

Есть несколько способов построения графиков в 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")

введите здесь описание изображения

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

person gung - Reinstate Monica    schedule 18.07.2013
comment
Спасибо. Одним из преимуществ использования базовой графики является то, что вы можете собрать несколько основных графиков с помощью функций par() или layout(). - person giordano; 18.12.2016

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

введите здесь описание изображения

person Alex    schedule 18.07.2013
comment
Где определить столбец, который будет использоваться для полос ошибок при использовании оболочки? Спасибо - person heysamhey; 05.07.2017
comment
Мне интересно, есть ли способ сложить эту гистограмму? Я хочу создать трехпанельную фигуру, первые две с обычными сгруппированными гистограммами, как позволяет эта функция, а затем третью, где каждая полоса разделена на две части. 1/2 - person Ella Bowles; 31.07.2019
comment
2/2 -- ЕСЛИ у меня есть bar(dv = numoutspc1, factor = c(Sex, Population), dataframe = WALL, errbar = FALSE, col=c(red,purple,blue), ylab=c(Количество связанных выбросов с каждой осью PC), ylim=c(0, 240)) ###но я также хочу numoutsPC2 в каждом баре. - person Ella Bowles; 31.07.2019