Seite 1 von 1

Einfacher Barplot

Verfasst: So Sep 16, 2018 11:20 pm
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.

Re: Einfacher Barplot

Verfasst: So Sep 16, 2018 11:43 pm
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.

Re: Einfacher Barplot

Verfasst: Mo Sep 17, 2018 4:02 pm
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!

Re: Einfacher Barplot

Verfasst: Mo Sep 17, 2018 7:02 pm
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:

Re: Einfacher Barplot

Verfasst: Mo Sep 17, 2018 11:12 pm
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")