Самый простой способ сгруппировать барплот
У меня есть следующий фреймворк:
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")
Теперь, что я хочу, не нужно дважды отмечать два бара и группировать их друг с другом, я попытался изменить значение пространства на всевозможные вещи и, похоже, не раздвигает столбцы. Может ли кто-нибудь сказать мне, что я делаю неправильно?
Ответы
Ответ 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]()