Überlappender Barplot

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Überlappender Barplot

Beitrag von foena1988 »

Hallo liebes Forum,

Ich verzweifle gerade bei der Erstellung eines Barplots. Das Ergebnis sollte so in der Art aussehen:
Barplot.PNG
Die X-Achse sollte alle Rubriken (A-H) enthalten. Auf der Y-Achse sollen die zugehörigen Werte aufgetragen sein, und zwar
- der reale Wert als grauer Balken im Hintergrund
- die Schätzgen 1 - 5 als schmälere Balken im Vordergrund mit einer Gesamtbreite die exakt jener des grauen Balkens entspricht.

Beispieldaten sind beigefügt.
Daten - Kopie.csv
(201 Bytes) 49-mal heruntergeladen
Ich habe es bereits mit ggplot2 versucht, allerdings leider ohne Erfolg.

Könnte mir vielleicht jemand behilflich sein?

Danke für eure Unterstützung!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Überlappender Barplot

Beitrag von bigben »

Soll es denn ggplot2 sein?
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Re: Überlappender Barplot

Beitrag von foena1988 »

Nein, keines Falls. Habe mir nur gedacht, dass e sggf. mit ggplot2 am einfachsten wird...

LG
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Überlappender Barplot

Beitrag von bigben »

Was einfach und was schwer ist, ist zum Teil Geschmackssache. Das ggplot2 grundsätzlich einfacher wäre, würde ich gerne bestreiten. Wie wäre das hier?

Code: Alles auswählen

bd <- read.csv2(file="http://forum.r-statistik.de/download/file.php?id=823")

plot(NA, xlim=c(.3,8.7), ylim=c(0,5.3), xlab="Rubrik", xaxt="n", ylab="y-Achse")
axis(1, at=1:8, labels=bd$Rubrik)
abline(h=seq(0,10,.5), col="lightgrey")
for(i in 1:8){
   rect(i-.44, 0, i+.44, bd$Realler.Wert[i], col="grey")
    for(j in 1:5){
        rect(i-.4+.16*(j-1), 0, i-.24+.16*(j-1), bd[i, j+2], col=j)
    }
}
legend("topright", fill=1:5,
        legend=c("Schätzung 1", "Schätzung 2", "Schätzung 3",
                 "Schätzung 4", "Schätzung 5"))
Mit der Funkion barplot stehe ich ein wenig auf Kriegsfuß, deshalb habe ich es halt selbst gebastelt. Bedeutet auch, dass man ganz viel Freiheiten hat, selbst zu "tunen", bis es einem gefällt. Ich würde wahrscheinlich als erstes nach schöneren Farben für die Balken suchen, aber das liegt im Auge des Betrachters.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Re: Überlappender Barplot

Beitrag von foena1988 »

Wow, vielen Dank Bernhard für deinen Code. Funktioniert bestens und wie du sagst, ob schön oder nicht liegt immer im Auge des Betrachters. Werde mich mit dem Aussehen noch etwas beschäftigen, aber im Prinzip ist es genau so eine Grafik, wie ich wollte. DANKE.

LG
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Überlappender Barplot

Beitrag von bigben »

Hallo foena,

freut mich, wenn's schmeckt. Folgendes hatte ich in Deinem Eingangspost überlesen:
schmälere Balken im Vordergrund mit einer Gesamtbreite die exakt jener des grauen Balkens entspricht
ich hatte die grauen Balken ein wenig breiter gemacht. Wenn Du in dem ersten rect-Aufruf jeweils die Zahl -.44 und .44 durch -.4 bzw .4 ersetzt, dann stimmt auch die Breite der grauen Balken genau:

Code: Alles auswählen

plot(NA, xlim=c(.3,8.7), ylim=c(0,5.3), xlab="Rubrik", xaxt="n", ylab="y-Achse")
axis(1, at=1:8, labels=bd$Rubrik)
abline(h=seq(0,10,.5), col="lightgrey")
for(i in 1:8){
      rect(i-.4, 0, i+.4, bd$Realler.Wert[i], col="grey")
      for(j in 1:5)
            rect(i-.4+.16*(j-1), 0, i-.24+.16*(j-1), bd[i, j+2], 
                  col=rainbow(5)[j])
}
legend("topright", fill=rainbow(5),
        legend=c("Schätzung 1", "Schätzung 2", "Schätzung 3",
                               "Schätzung 4", "Schätzung 5"))
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Re: Überlappender Barplot

Beitrag von foena1988 »

Hallo Bernhard,

Danke für deinen Nachtrag. Ich habe bereits herumgespielt und ich finde mittlerweile, dass etwas schmälere Balken doch deutlich besser aussehen.

Danke nochmals.

LG
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Überlappender Barplot

Beitrag von Athomas »

Ich möchte doch noch eine ggplot-Version nachschieben:

Code: Alles auswählen

Daten <- read.csv2("D:/R/R Forum/Barplot/Daten.csv", stringsAsFactors = FALSE)

library(reshape2)
Daten.lang <- melt(Daten, id="Rubrik", measure=2:7, value.name = "Wert")

library(ggplot2)
Grafik <- ggplot() +
  theme_bw() +
            geom_bar(data=subset(Daten.lang, variable=="Realler.Wert"), 
                     aes(x=Rubrik, y=Wert), 
                     fill="grey80", colour="black", stat="identity") +
            geom_bar(data=subset(Daten.lang, variable!="Realler.Wert"), 
                     aes(x=Rubrik, y=Wert, fill=variable), 
                     colour="black", stat="identity", position="dodge") +
  scale_fill_manual(values=c("springgreen1", "tan1", "steelblue1", "tomato1", "turquoise1"))
Grafik
Die Daten werden zunächst in das "lange Format" gebracht und anschließend die Bereiche für den "Hintergrund" und die restlichen, bunten Balken getrennt geplottet.
Grafik.jpeg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Überlappender Barplot

Beitrag von bigben »

Hallo Athomas,

zunächt Lob für die bisher beste Fabrpalette in diesem Thread. Ich bin positiv überrascht, dass die Forderung nach Deckung der grauen und der bunten Balken sich so einfach "quasi von selbst" erfüllt. War Dir das vorher klar oder hast Du das einfach ausprobiert und warst erleichtert, als es gepasst hat?

Vielleicht hat ja noch jemand lust, eine Version mit barplot zu machen?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Überlappender Barplot

Beitrag von Athomas »

zunächt Lob für die bisher beste Fabrpalette in diesem Thread.
Besten Dank, aber als Kind der 60er ist mir der überragende Farbgeschmack quasi in die Wiege gelegt worden! Hawaiihemden und so :lol: !
War Dir das vorher klar oder hast Du das einfach ausprobiert und warst erleichtert, als es gepasst hat?
Es war mir (eher) klar, weil ich schonmal frickeln musste, um passende Lücken einzufügen...
Antworten