Einfacher Barplot

Alles zum Thema der beschreibenden Statistik

Moderator: jogo

Antworten
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Einfacher Barplot

Beitrag von retep »

Hallo,

ich wollte die Spezialisten hier um Hilfe für folgendes Problem bitten: Ich möchte gerne einen simplen Barplot erstellen.
Dieser Barplot sollte ein Vergleich zwischen den hypothetischen Durschnittskonzentrationen einer Umweltprobe und dem zugehörigen Grenzwert darstellen.
Alle Versuche diesen einfachen Plot mittels ggplot, lattice darzustellen schlugen fehl. Also ich hab ich mir den Code
selber geschrieben und versucht die Grafik mittels R Basic darzustellen:

1. Versuch

Code: Alles auswählen

A <- c(219.66, 124.75, 128.44, 66.64, 29.89)
B <- c(0,50, 250, 240, 0)
C <- c("HCO3", "Nitrat", "Chlor", "Sulfat", "CO2")
liste <- list(Median = A, Grenzwert = B, Anionen = C)
dat <- as.data.frame(liste)
dat
barplot(as.matrix(dat), beside=TRUE)
Nach Ausführen des Codes erscheint die Fehlermeldung:
Error in -0.01 * height : non-numeric argument to binary operator

Bei der Recherche zu diesem Fehler bin ich auf diesen Link gestoßen:
https://stackoverflow.com/questions/368 ... y-operator

So richtig hilft mir die angebotene Lösung nicht weiter, denn wenn ich den Code korrigiere,

Code: Alles auswählen

barplot ((as.matrix(as.data.frame(dat), beside = TRUE)))
kommt die Meldung: Error: unexpected symbol in:
Warning message:
In apply(height, 2L, cumsum) : NAs introduced by coercion

Ich will ja keine Summendarstellung, sondern einfach den Vergleich zwischen 2 Vektoren.

Im 2. Versuch

Code: Alles auswählen

Median <- c(219.66, 124.75, 128.44, 66.64, 29.89)       
Grenzwert <- c(0,50, 250, 240, 0)
C1 <- data.frame(Median, Grenzwert)        
C1
Test <-t (C1)                                          
Test                                                    
barplot(Test, beside=TRUE, ylab = "Konzentration mg/l", xlab = "Anionen", main = "Vergleich von Durchnittskonzentration und Grenzwert",
        legend = c("Median","Grenzwert"), col = c("green", "blue"), 
        horiz=FALSE, names.arg=c("HCO3", "Nitrat", "Chlor", "Sulfat", "CO2"))

Funktioniert dieser Code.

Meine Frage an die Community ist ob mir jemand helfen kann solche Plots entweder mit R Basic oder ggplot, lattice etc. zu erstellen. Oder den ersten Code soweit zu berichtigen, das die Grafik aus Code Nummer 2 dem aus Code Nummer 1 entspricht. In den Büchern wie "R Cookbook" , " R in a nutshell", Wickhams "Graphics with ggplot" sind immer dieselben Beispiele abgebildet. Da trifft auch auf viele Webseiten zu. Deswegen sind diese keine richtige Hilfe... :oops:

Für die Mühe, vielen Dank im Voraus! Und ich entschuldige mich schon jetzt für Anfängerfehler, denn das bin ich ......ein Anfänger.
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Einfacher Barplot

Beitrag von EDi »

Das Problem liegt hier und ist mehrfacettig :

Code: Alles auswählen

as.matrix(dat)
Per definition habe alle Werte in einer Matrix den gleichen Datentyp. Da du in dem data.frame sowohl numerische als auch Zeichenfolgen (character) hast, werden alle Werte in der Matrix zu charactern umgewandelt. Character kann man nicht auf einer kontinuierlichen Skala darstellen.

Wenn es mit barplot() weitergehen soll, dann die Spalte C nicht übergeben und nur für die Beschriftung nutzen.
Falls es mit ggplot weitergehen soll, würde ich zuerst mal die Daten ins lange Format bringen (+indikator variable für A/B). geht z. b. mit tidyr::gather.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Einfacher Barplot

Beitrag von retep »

Hallo,

hab vielen Dank für deinen Tipp. Und es hat funktioniert. Zwar nicht gleich im ersten Versuch aber im 2. Ich habe mich aber
für den melt Befehl entschieden. Denn mit dem tidyr:: gather wurden die kumulativen Summen geplottet. Und es wurde nicht nach den
beiden Variablen unterschieden. Anyway, für alle, die dasselbe Problem haben hier die Codes:

Code: Alles auswählen

library(ggplot2)
A <- c(219.66, 128.44, 124.75, 66.64, 29.89)
B <- c(0,50, 250, 240, 0)
C <- c("HCO3", "Chlor", "Nitrat", "Sulfat", "CO2")
liste <- list(Median = A, Grenzwert = B, Anionen = C)
liste
dat <- as.data.frame(liste)
dat
##################################################################################
#Beispiel link
# https://stackoverflow.com/questions/181 ... t#18162330
##################################################################################

Code: Alles auswählen

library(ggplot2)
library(reshape2)
data.m <- melt(dat, id.var s='Anionen')
ggplot(data.m, aes(Anionen, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat ="identity")+
  #coord_flip() + 
  theme_bw()

Meine nächste Fragen da wären; wie kann ich den Reihenfolge, der Anionen auf der x- Achse umkehren von den Größeren zu den Kleineren Werten? Und ist es möglich in der Legende die Überschrift von "Variablen" zu "Legende" zu ändern?
In dem dazugehörigen Link (siehe oben) werden solche Arten von Grafiken sehr schön erklärt und ausdrücklich darauf hingewiesen, dass der melt- Befehl hierfür unerlässlich ist. Das kommt nämlich in den Buchbeispielen nicht rüber. Da hier immer wieder dieselben Beispiel aus der Biologie oder Automobilwirtschaft gezeigt werden, welche einen ganz anderen Datentyp und Fragestellungen bevorzugen.

Nochmals vielen Dank für die Hilfe!
retep
Beiträge: 99
Registriert: Do Sep 06, 2018 7:50 pm

Re: Einfacher Barplot

Beitrag von retep »

Fehlerberichtigung zum vorhergehenden Beitrag in Code:
##################################################################################
#Beispiel link
# https://stackoverflow.com/questions/181 ... t#18162330
##################################################################################

Code: Alles auswählen

library(ggplot2)
library(reshape2)
data.m <- melt(dat, id.vars='Anionen')
ggplot(data.m, aes(Anionen, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat ="identity")+
  #coord_flip() + 
  theme_bw()
Der Fehler liegt in dem id.vars dort muss natürlich das "var" und "s" zusammen, sonst funktioniert der "melt" Befehl nicht und es kommt eine Fehlermeldung

Sorry!!! :oops:
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Einfacher Barplot

Beitrag von EDi »

; wie kann ich den Reihenfolge, der Anionen auf der x- Achse umkehren von den Größeren zu den Kleineren Werten?
geht mit reorder()

Code: Alles auswählen

ggplot(data.m, aes(x = reorder(Anionen,-value), y =value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat ="identity")+
  theme_bw()
Und ist es möglich in der Legende die Überschrift von "Variablen" zu "Legende" zu ändern?
Geht u. A. mit labs()

Code: Alles auswählen

ggplot(data.m, aes(x = reorder(Anionen,-value), y =value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat ="identity")+
  theme_bw() +
  labs(fill ="xxxxx") 
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
Antworten