Ich habe den folgenden Datenrahmen:
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
Ich versuche, ein gruppiertes Balkendiagramm zu erstellen, Art als Höhe und dann 2 Farben für Kategorie.
Ich würde ein Bild von dem, was ich habe, posten, aber ich habe nicht genug Reputationspunkte... aber hier ist mein Code:
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")
Nun, was ich möchte, ist, dass ich die beiden Balken nicht zweimal beschriften muss und sie auseinander gruppieren kann. Ich habe versucht, den Wert für den Abstand auf alle möglichen Dinge zu ändern, aber es scheint die Balken nicht auseinander zu bewegen. Kann mir jemand sagen, was ich falsch mache?
Keine "Balkenplot"-Lösung, sondern Verwendung von "Gitter" und "Balkendiagramm":
library(lattice)
barchart(Species~Reason,data=Reasonstats,groups=Catergory,
scales=list(x=list(rot=90,cex=0.8)))
Es gibt mehrere Möglichkeiten, Plots in R zu erstellen; lattice
ist eine davon, und immer eine vernünftige Lösung, +1 zu @agstudy. Wenn Sie dies in Base Graphics machen wollen, könnten Sie folgendes versuchen:
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")
Ich habe Folgendes getan: Ich habe eine Matrix mit zwei Spalten erstellt (weil deine Daten in Spalten waren), wobei die Spalten die Anzahl der Arten für "Rückgang" und für "Verbesserung" waren. Dann habe ich diese Kategorien zu den Spaltennamen gemacht. Außerdem habe ich die "Gründe" als Zeilennamen verwendet. Die Funktion barplot()
kann mit dieser Matrix arbeiten, will aber die Daten in Zeilen und nicht in Spalten, also habe ich sie mit einer transponierten Version der Matrix gefüttert. Schließlich habe ich einige Ihrer Argumente für den Aufruf der Funktion "barplot()" gelöscht, die nicht mehr benötigt wurden. *Mit anderen Worten, das Problem bestand darin, dass Ihre Daten nicht auf die Art und Weise eingerichtet waren, die barplot()
für Ihre beabsichtigte Ausgabe benötigt.
Ich habe einen Funktionswrapper namens bar()
für barplot()
geschrieben, um das zu tun, was Sie hier versuchen, da ich ähnliche Dinge häufig tun muss. Der Github-Link zu dieser Funktion ist hier. Nachdem man sie kopiert und in R eingefügt hat, macht man
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.
Der einzige Vorteil ist, dass die Funktion eine Legende mit den Namen der Stufen der kategorialen Variablen anlegt (z. B. "Rückgang" und "Verbesserung"). Wenn jede Ebene mehrere Beobachtungen hat, können auch die Fehlerbalken dargestellt werden (was hier nicht zutrifft, daher errbar=FALSE
).