########################## #Panaschierstatistik KTZH# ########################## rm(list=ls(all=TRUE)) #working directory festlegen setwd() optionStringAsFacotr=F library(foreign) library(xlsx) library(ggplot2) library(scales) #Datensatz laden auf aufbereiten panasch <- read.csv('panaschiertalle.csv',enc='UTF-8',sep=",",stringsAsFactors = FALSE) panasch$Listenbezeichnung[panasch$Listen.nummer==6] = 'GLP' panasch$Listenbezeichnung[panasch$Listen.nummer==29] = 'GLP' panasch$Listenbezeichnung[panasch$Listen.nummer==11] = 'PDA' panasch$Listenbezeichnung[panasch$Listen.nummer==10] = 'PIRATEN' panasch$Listenbezeichnung[panasch$Listen.nummer==16] = 'SNP.DwE' #Summe aller panaschierten Listen total <- sum(unique(panasch$Total.der.Listenstimmen)) #Leere Liste auslassen dim(panasch) attach(panasch) #Loop vorbereiten liste2 <- unique(Listenbezeichnung) liste <- names(panasch)[7:27] matprofit <- matrix(1,nrow=20,ncol=24) q <- 0 q <- 0 for (w in liste2){ temp <- subset(panasch, Listenbezeichnung==w) q <- q+1 matprofit[q,1] <- w x <- 0 v <- 0 for (i in 7:(length(liste)+6)){ zahl <- sum(temp[,i]) x <- x + 1 matprofit[q,x] <- zahl matprofit[q,22] <- sum(sum(unique(temp$Total.verändert.abgegebene.Wahlzettel.der.Liste), sum(unique(temp$Total.unverändert.abgegebene.Wahlzettel.der.Liste)))) matprofit[q,23] <- total matprofit[q,24] <- sum(unique(temp$Total.der.Listenstimmen)) } } #/summe/as.numeric(anderePartei) mode(matprofit) <- "numeric" # Zeilen und Spalten der Matrix benennen rownames(matprofit) <- unique(Listenbezeichnung) colnames(matprofit) <- c(names(panasch)[7:27],"Wahlzettel", "Listenstimmentotal", "Listenstimmen") #Zeilen sortieren donne <- data.frame(matprofit) donne <- donne[c(liste2, "Leere.Liste","Wahlzettel","Listenstimmentotal", "Listenstimmen")] #nuller machen donne <- as.matrix(donne) x <- 0 q <- 0 for (w in 1:20){ x <- x+1 q <- q+1 donne[q,x] <- 0 } donne <- data.frame(donne) abgegeben <- colSums(donne[,1:20]) bekommen <- rowSums(donne[,1:20]) totalwahlzettel <- sum(donne$Wahlzettel) donne$bekommen <- bekommen donne$abgegeben <- abgegeben donne$totalwahlzettel <- sum(totalwahlzettel,8567) #8567 sind die "leeren Listen" donne$wahlzettelohneeigene <- donne$totalwahlzettel-donne$Wahlzettel donne$attraktiv <- donne$bekommen/donne$wahlzettelohneeigene*100 donne$loyal <- donne$abgegeben/donne$Wahlzettel*100 donne$wahlzettelschnitt <- donne$Wahlzettel/donne$wahlzettelohneeigene donne$Partei <- unique(Listenbezeichnung) donne <- donne[ order(-donne$Wahlzettel), ] donne$netto <- (donne$bekommen-donne$abgegeben) donne$wahlanteilecht <- donne$Listenstimmen/donne$Listenstimmentotal donne$wahlanteiltheo <- (donne$Listenstimmen-donne$netto)/donne$Listenstimmentotal donne$wahlanteildiff <- (donne$wahlanteilecht-donne$wahlanteiltheo) plotdata <- donne[1:7,] ######################### #Attraktivität vs. Treue# ######################### plotdata$Partei[5] = 'GP' plotdata <- plotdata[ order(-plotdata$wahlanteildiff), ] p <- ggplot(plotdata,aes(loyal,attraktiv)) + geom_point(colour=c('green','orange','blue','darkgreen', 'yellow' ,'red', 'yellow3'), size=15) + geom_text(aes(label=plotdata$Partei), size=5) + scale_x_reverse(name="Loyalität",limits=c(380,50))+ theme_bw()+ scale_y_continuous(name="Attraktivität",limits=c(0,60)) + ggtitle("Parteiattraktivität vs. Parteiloyalität") + theme( axis.title.y = element_text(size=15), axis.ticks.x=element_blank(), axis.text.x = element_text(size=15), axis.text.y = element_text(size=15), axis.title.x=element_text(size=15,vjust=-0.5), plot.title = element_text(face="bold", vjust=2, hjust=-0.0475), legend.position="none" ) p png('attrvsloy.png',width=668, height=422) p dev.off() ################################ #Gewinner und Verlierer plotten# ################################ plotdata <- plotdata[ order(-plotdata$wahlanteildiff), ] plotdata$Partei <- reorder(plotdata$Partei, -plotdata$wahlanteildiff) plotdata$color <- c("#009900","#00FF00","#99FF99","#FF9999", "#FF6666","#FF0000","#CC0000") p <- ggplot(plotdata, aes(x=Partei, y=wahlanteildiff)) + geom_bar(stat="identity",position="dodge", fill=plotdata$color) + theme_bw() + scale_x_discrete()+ scale_y_continuous(name="", breaks = c(seq(from =-0.005, to =0.005, by = 0.001)), labels = percent,limits=c(-0.005,0.005)) + ggtitle("Ab- bzw. Zunahme der Parteienstärke") + theme( axis.title.y = element_text(size=15), axis.ticks.x=element_blank(), axis.text.x = element_text(size=15), axis.text.y = element_text(size=15), axis.title.x=element_blank(), plot.title = element_text(face="bold", vjust=2, hjust=-0.09), legend.position="none" ) p png('VerliererundGewinner.png',width=668, height=422) p dev.off() ################### #rChart: von Liste# ################### donne <- data.frame(matprofit) donne <- donne[ order(-donne$Listenstimmen), ] colnamen <- rownames(donne) donne <- donne[c(colnamen, "Leere.Liste","Wahlzettel","Listenstimmentotal", "Listenstimmen")] #nuller machen donne <- as.matrix(donne) x <- 0 q <- 0 for (w in 1:20){ x <- x+1 q <- q+1 donne[q,x] <- 0 } donne <- data.frame(donne) vonListe <- donne[,c(1:20)] Parteien <- rownames(vonListe) nettomat <- matrix(NA,400,3) z <- 0 v <- 0 for (w in 1:20){ #x <- 0 y <- 0 v <- v+1 for (i in 1:20){ #x <- x+ 1 y <- y + 1 z <- z+1 weg <- vonListe[i,v] hin <- vonListe[v,i] nettozahl <- hin-weg nettomat[z,1] <- Parteien[w] nettomat[z,2] <- Parteien[i] nettomat[z,3] <- nettozahl } } options(stringsAsFactors = F) netmat <- data.frame(nettomat) colnames(netmat) <- c("Partei", "Parteien", "Nettostimmen") netmat$Nettstimmen <- as.numeric(netmat$Nettostimmen) test <- netmat[c(1:140),] q1 <- nPlot(Nettstimmen ~ Partei, group = "Parteien", data = test, type = "multiBarChart") q1$chart(margin = list(left = 80)) q1$chart(stacked = TRUE) q1$yAxis(axisLabel = "Nettofluss Panaschierstimmen") n1$yAxis(tickFormat = "#! function(d) {return d3.format('')(d)} !#") q1$xAxis(staggerLabels = TRUE) q1 ######################### #Platzverschiebungen FDP# ######################### p <- as.data.frame(matrix(NA,6,4)) p[,1]<- c("Ruedi Noser", "Markus Hutter", "Beat Walti", "Doris Fiala", "Hans-Peter Portmann", "Filippo Leutenegger") p[,2] <- c(1, #Partei Platzierung 2, 3, 4, 5, 6) p[,3] <- c(1, #echte Platzierung 4, 6, 3, 5, 2) p[,4] <- c((0), #Differenz 4, 6, 3, 5, 2) #Plot plot(y=c(p[,2]),x=c(rep(0,6)), ylim=c(9,-1), xlim=c(-6,6), type="n",axes=FALSE, ylab="", xlab="", main="", cex.lab=1.0) par(new=TRUE) plot(y=c(p[,3]),x=c(rep(0,6)), ylim=c(9,-1),xlim=c(-6,6), type="n",axes=FALSE, ylab="", xlab="", main="", cex.lab=1.0) segments(-4.3,4.5,4.7,4.5, lwd=1, col="gray33", lend=2)#Grenze text(-0.5,p[,2],p[,1], cex=1, adj = c(1,+0.5)) #Politikernamen 1 arrows(0,p[,2],2,p[,3],lwd=5) text(2.12,p[,2],p[,2], cex=1, adj = c(-1,+0.5)) #Platz endgültig text(-0.35,p[,2],p[,2], cex=1, adj = c(0,+0.5)) #Platz eigene Partei text(3.8,4.7," Wahl-\n grenze",cex=0.75,adj = c(0,0)) text(-4.3,-0.5,"Platzverschiebungen bei der FDP",cex=1.5,adj = c(0,0)) text(-4.3,7,"Lesebeispiel: Berücksichtigt man nur die Stimmen der eigenen Liste, lag Filippo Leutenegger parteiintern an \nsechster Stelle. Damit hätte es nicht für einen Platz im NR gereicht. Weil er jedoch sehr erfolgreich Stimmen \nanderer Parteien einsammelte, reichte es schlussendlich für Platz 2.",cex=0.5,ps=10,adj = c(0,0)) text(-0.12,0.3,"Rang nur Listenstimmen:", cex=0.8, adj = c(1,+0.5)) segments(-4.3,0.5,-0.12,0.5, lwd=1, col="gray33", lend=2)#Unterstrich text(2.12,0.3,"Rang alle Stimmen:", cex=0.8, adj = c(0,+0.5)) segments(2.12,0.5,4.7,0.5, lwd=1, col="gray33", lend=2)#Unterstrich ######################### #Platzverschiebungen SVP# ######################### dev.off() p <- as.data.frame(matrix(NA,6,3)) p[,1]<- c("Toni Bortoluzzi", "Jürg Stahl", "Hans Kaufmann", "Gregor A. Rutz", "Ernst Schibli", "Hans Egloff") #Partei Platzierung p[,2] <- c(8, 9, 10, 11, 12, 13) #echte Platzierung p[,3] <- c(8, 9, 11, 12, 13, 10) #Plot plot(y=c(p[,2]),x=c(rep(0,6)), ylim=c(9,-1), xlim=c(-6,6), type="n",axes=FALSE, ylab="", xlab="", main="", cex.lab=1.0) par(new=TRUE) plot(y=c(p[,3]),x=c(rep(0,6)), ylim=c(9,-1),xlim=c(-6,6), type="n",axes=FALSE, ylab="", xlab="", main="", cex.lab=1.0) segments(-4.3,4.5,4.7,4.5, lwd=1, col="gray33", lend=2)#Grenze text(-0.7,I(p[,2]-7),p[,1], cex=1, adj = c(1,+0.5)) #Politikernamen 1 arrows(0,I(p[,2]-7),2,I(p[,3]-7),lwd=5) text(2.4,I(p[,2]-7),p[,2], cex=1, adj = c(0.5,+0.5)) #Platz endgültig text(-0.35,I(p[,2]-7),p[,2], cex=1, adj = c(0.5,+0.5)) #Platz eigene Partei text(3.8,4.7," Wahl-\n grenze",cex=0.75,adj = c(0,0)) text(-4.3,-0.5,"Platzverschiebungen bei der SVP",cex=1.5,adj = c(0,0)) text(-4.3,-0.26,"(Für eine bessere Übersicht werden die Plätze 1-7 nicht dargestellt)",cex=0.5,adj = c(0,0)) text(-4.3,7,"Lesebeispiel: Berücksichtigt man nur die Stimmen der eigenen Liste, lag Hans Egloff parteiintern an dreizehnter \nStelle. Damit hätte es nicht für einen Platz im NR gereicht. Weil er jedoch sehr erfolgreich Stimmen anderer \nParteien einsammelte, reichte es schlussendlich für Platz 10.",cex=0.5,ps=10,adj = c(0,0)) text(-0.12,0.3,"Rang nur Listenstimmen:", cex=0.8, adj = c(1,+0.5)) segments(-4.3,0.5,-0.12,0.5, lwd=1, col="gray33", lend=2)#Unterstrich text(2.12,0.3,"Rang alle Stimmen:", cex=0.8, adj = c(0,+0.5)) segments(2.12,0.5,4.7,0.5, lwd=1, col="gray33", lend=2)#Unterstrich #################### #Interaktive Grafik# #################### #Der Datensatz für die interaktive Grafik wurde in Excel erstellt. #Muss im langen Format sein und die Spalten Partei, List, Anteil enthalten require(devtools) install_github('rCharts', 'ramnathv') library(rCharts) n1 <- nPlot(Anteil ~ Partei, group = "Liste", data = matexport, type = "multiBarChart") n1$yAxis(axisLabel = "Stimmen von parteifremden Listen") n1$chart(margin = list(left = 80)) n1$chart(color = c('darkgreen', 'red', 'blue', 'lightgreen', 'orange', 'olive', "yellow", "lightgrey", "grey")) n1$yAxis(tickFormat = "#! function(d) {return d3.format(',.0f')(d) + '%' } !#") n1$set(width = 550, height = 400) n1$chart(reduceXTicks = FALSE) n1$xAxis(staggerLabels = TRUE) n1$yAxis(staggerLabels = TRUE) n1$chart(stacked = TRUE, forceY = c(0, 100)) n1 setwd('~/Desktop') n1$save('zuListe.html', cdn = TRUE)