2017-11-24 2 views
2

Ich möchte ein Balkendiagramm in R mit Gitter erstellen. Es ist ein einfaches Diagramm mit sechs Doppelspalten, derzeit ist das Farbmuster für alle gleich. Das heißt, die erste Doppelsäule ist in Rot und Schwarz sowie die anderen fünf Doppelsäulen. Wäre es möglich, das Farbmuster zu ändern, so dass jede Spalte ihre eigene Farbe hat? Wenn es mit Gitter nicht möglich ist, könnte es mit ggplot2 möglich sein? Um zu klären, was ich im Sinn haben, sehen Sie die folgenden zwei Bilder:Färbung bestimmter Balken gruppiert Balkendiagramm in r mit Gitter

Aktuelles Ergebnis:

enter image description here

Wunschfarbmuster:

enter image description here

Mein aktueller Code:

library(lattice) 
mitte_table <- read.table(text = "Partei; Jahr; Ergebnis 
CDU;2017;18.6 
CDU;2013;22.6 
SPD;2017;17.9 
SPD;2013;26.1 
Linke;2017;21.5 
Linke;2013;18.7 
Gruene;2017;17.2 
Gruene;2013;16.7 
AfD;2017;8.2 
AfD;2013;3.9 
FDP;2017;8.7 
FDP;2013;3.7 
Sonstige;2017;7.9 
Sonstige;2013;8.3", 
header = TRUE, 
sep = ";", 
) 

colors_Jahr = c("black", "red") 

my.settings <- list(
superpose.polygon = list(col = colors_Jahr) 
) 

barchart(
data = mitte_table, 
Ergebnis ~ Partei, 
groups = Jahr, 
horizontal = FALSE, 
main = "Zweitstimme im Wahlkreis Mitte", 
xlab = "Parteien", 
ylab = "Stimmenverteilung in %", 
auto.key = TRUE, 
par.settings = my.settings 
) 

Antwort

1

S etwas so? (Mit ggplot2.)

enter image description here

zwei Einschränkungen:

  1. ich nicht um die Farben zu den Parteien brachte versuchen. Aber das sollte einfach zu beheben sein, einfach einen anderen Farbvektor verwenden.

  2. Es ist schwer in ggplot2, die Balken zu überlappen, wie im Beispiel. Wenn Sie darauf bestehen, ist etwas mehr Arbeit erforderlich. Hier

ist der Code:

require(dplyr) 
require(ggplot2) 

mitte_table <- read.table(text = "Partei; Jahr; Ergebnis 
CDU;2017;18.6 
CDU;2013;22.6 
SPD;2017;17.9 
SPD;2013;26.1 
Linke;2017;21.5 
Linke;2013;18.7 
Gruene;2017;17.2 
Gruene;2013;16.7 
AfD;2017;8.2 
AfD;2013;3.9 
FDP;2017;8.7 
FDP;2013;3.7 
Sonstige;2017;7.9 
Sonstige;2013;8.3", 
header = TRUE, 
sep = ";", 
) 

# make combined dark and light color palette 
cols_dark <- c("#CD8E04", "#5E9FC8", "#028D67", "#D6CB35", "#0266A0", "#BB571E", "#AE7192", "#898989") 
cols_light <- c("#FFB746", "#7DCCFF", "#4BC095", "#F9ED51", "#579BDB", "#FF834A", "#EC99C6", "#B7B7B7") 
colors <- c(rbind(cols_dark, cols_light)) 

# add a column that has a smaller number for the larger year and vice versa 
mitte_table <- mutate(mitte_table, order = 10000 - Jahr) 

# reorder levels so they are in the order in which they are in the table 
mitte_table$Partei <- factor(mitte_table$Partei, levels = unique(mitte_table$Partei)) 

# the trick is to fill by a factor that combines the party name and the order (10000 - year) 
ggplot(mitte_table, aes(x=Partei, group=order, y=Ergebnis, fill=factor(paste0(Partei,order)))) + 
    geom_col(position="dodge") + 
    scale_fill_manual(values = colors, 
        breaks = paste0(mitte_table$Partei[1], 10000-c(2017, 2013)), 
        labels = c("Wahl 2017", "Wahl 2013"), 
        name = "") + 
    scale_y_continuous(limits = c(0, 29), expand = c(0, 0)) + 
    # override the fill aes to get gray colors in the legend 
    guides(fill = guide_legend(override.aes = list(fill = c("#9A9A9A", "#C5C5C5")))) + 
    theme_minimal(14) + 
    theme(legend.position = "bottom") 
+0

Vielen Dank für Ihre hilfreiche Antwort und die nützlichen Kommentare! –

Verwandte Themen