Die Aussage, dass Tortendiagramme unnütz sind, findet man häufig im Internet. Bei der Beschäftigung damit, welche Grafik welche Aussage haben. So landete ich auch bei der im Titel genannten Aussage. Zum Beispiel dieser Artikel mit der Aussage "... one simple way is to eliminate pie charts from your repertoire". Oder dieser Artikel mit dem Tipp diese ab sofort nicht mehr zu benutzen. Selbst bei der Hilfe in R zu PieCharts steht: "Pie charts are a very bad way of displaying information. The eye is good at judging linear measures and bad at judging relative areas."
Grafiken werden benutzt um Daten einfacher verständlich zu machen. Speziell das Tortendiagramm ist einfach herzustellen und allseits bekannt und lesbar. Doch genau diese Aussagekraft könne bei Tortendiagrammen hinterfragt werden. Tortendiagramme seien zwar gut geeignet um Verhältnisse aufzuzeigen und Kinder lernten die Figur mit gleich großen Stücken kennen. Sobald diese Tortenstücke aber nicht mehr gleich groß seien, würde es schwierig die Verhältnisse zu erfassen. Dies läge auch an unserer räumlichen Auffassungsgabe. Ferner müssten Tortendiagramme eine gewisse Größe haben, um Daten aufzuzeigen; Linien- oder Balkendiagramme könnten hingegen auch schon in kleiner Größe Aussagen rüberbringen.
Nun, Zeit dies auszuprobieren. Von der Datenbank der Weltbank besorgte ich mir die BIP-Zahlen für die Euro-Länder für die Jahre 2000 und 2015. Die Rohdaten hierfür sehen wiefolgt aus:
Als Tortendiagramm dargestellt bekommen wir folgende Darstellung - tatsächlich wenig aufschlussreich:
Nun, Zeit dies auszuprobieren. Von der Datenbank der Weltbank besorgte ich mir die BIP-Zahlen für die Euro-Länder für die Jahre 2000 und 2015. Die Rohdaten hierfür sehen wiefolgt aus:
Als Tortendiagramm dargestellt bekommen wir folgende Darstellung - tatsächlich wenig aufschlussreich:
Aus dem Diagramm kann man verschiedene Informationen ziehen. Wenn es um die Verhältnisse der einzelnen Tortenstücke geht, würde sich zB ein Treemap-Diagramm anbieten:
Die größten Volkswirtschaften werden schon sichtbarer. Doch es geht noch detaillierter. Mit einem Balkendiagramm wird die Relation sichtbarer und man kann die einzelnen Balken sogar direkt beschriften!
Natürlich kann man auch an der Entwicklung selbst interessiert sein. Tatsächlich zeigt sich hier noch eine ganz andere Information - das absolute Wachstum über die 15 Jahre hinweg:
Wir sehen, dass es einige Alternativen zum Tortendiagramm gibt. Falls man doch nicht auf diese Grafiken verzichten will, so ist die Empfehlung, dass maximal fünf Tortenstücke zur Anzeige von Prozentwerten genutzt werden sollen.
Anbei noch mein Code für diese Grafiken:
library("RColorBrewer")
library(ggplot2)
require(gridExtra)
library("reshape2")
library("treemap")
#data prep
data_GDP <- read.csv("~/.../GDP & Pie Charts/data.csv", header=TRUE, stringsAsFactors=FALSE)
data_GDP[,5:ncol(data_GDP)] <- sapply(data_GDP[,5:ncol(data_GDP)], as.numeric)
data_GDP[is.na(data_GDP)] <- 0
data_GDP[data_GDP==".."]<- 0
sapply(data_GDP, class)
data_GDP[,5:ncol(data_GDP)] <- data_GDP[,5:ncol(data_GDP)] /10^9 #conversion to billion
data_GDP$Series.Code <- NULL
data_GDP$Series.Name <- NULL
data_GDP$Country.Code <- NULL
# Data for EURO Countries
Countries <- c("Austria", "Belgium", "Cyprus", "Estonia", "Finland", "France", "Germany", "Greece", "Ireland", "Italy", "Latvia", "Lithuania", "Luxembourg", "Malta", "Netherlands", "Portugal", "Slovac Republic", "Slovenia", "Spain")
data_GDP_EURO <- subset(data_GDP, Country.Name %in% Countries)
data_GDP_EURO <- data_GDP_EURO[,c(1,3,9)]
data_GDP_EURO$y2000_rel <- data_GDP_EURO$X2000..YR2000./sum(data_GDP_EURO$X2000..YR2000.)
data_GDP_EURO$y2015_rel <- data_GDP_EURO$X2015..YR2015./sum(data_GDP_EURO$X2015..YR2015.)
data_GDP_EURO <- data_GDP_EURO[order(data_GDP_EURO$y2000_rel, decreasing=TRUE),] #sort for coloring
data_GDP_EURO$color <- rainbow(nrow(data_GDP_EURO)) #assign colors to labels
# Analysis
sum_2000 = round(sum(data_GDP_EURO$X2000..YR2000.))
sum_2015 = round(sum(data_GDP_EURO$X2015..YR2015.))
# Pie Charts
par(mfrow=c(1,2))
data_GDP_EURO <- data_GDP_EURO[order(data_GDP_EURO$y2000_rel),]
pie(data_GDP_EURO$y2000_rel,
labels = paste(data_GDP_EURO$Country.Name,"(", round(data_GDP_EURO$y2000_rel*100,0),"%)"),
main=paste("GDP 2000 [$ billion]:", sum_2000),
init.angle=90, cex = 0.5, col=data_GDP_EURO$color)
data_GDP_EURO <- data_GDP_EURO[order(data_GDP_EURO$y2015_rel),]
pie(data_GDP_EURO$y2015_rel,
labels = paste(data_GDP_EURO$Country.Name,"(", round(data_GDP_EURO$y2015_rel*100,0),"%)"),
main=paste("GDP 2015 [$ billion]:", sum_2015),
init.angle=90, cex = 0.5, col=data_GDP_EURO$color)
# Tree Plots
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pushViewport(viewport(layout=grid.layout(1, 2, widths=c(2,2), heights=c(2,2))))
treemap(data_GDP_EURO, index = "Country.Name", vSize="X2000..YR2000.", type="color", vColor="color", vp=vplayout(1,1))
treemap(data_GDP_EURO, index = "Country.Name", vSize="X2015..YR2015.", type="color", vColor="color", vp=vplayout(1,2))
# Bar Plots
par(mfrow=c(1,2))
data_GDP_EURO <- data_GDP_EURO[order(data_GDP_EURO$X2000..YR2000.),]
plot2000_2 <- barplot(data_GDP_EURO$X2000..YR2000.,
names.arg=data_GDP_EURO$Country.Name,
main=paste("GDP 2000 [$ billion]:", sum_2000),
las=2, cex.label=.1, col=data_GDP_EURO$color)
text(plot2000_2, data_GDP_EURO$X2000..YR2000.+50, labels=round(data_GDP_EURO$X2000..YR2000.,0), xpd=TRUE, cex=0.7, srt=90)
data_GDP_EURO <- data_GDP_EURO[order(data_GDP_EURO$X2015..YR2015.),]
plot2015_2 <- barplot(data_GDP_EURO$X2015..YR2015.,
names.arg=data_GDP_EURO$Country.Name,
main=paste("GDP 2015 [$ billion]:", sum_2015),
las=2, cex.label=.1, col=data_GDP_EURO$color)
text(plot2015_2, data_GDP_EURO$X2015..YR2015.+70, labels=round(data_GDP_EURO$X2015..YR2015.,0), xpd=TRUE, cex=0.7, srt=90)
# Line Plots
data_GDP_EURO_long <- data_GDP_EURO[,c(1:3,6)]
data_GDP_EURO_long <- melt(data_GDP_EURO_long, id.vars = c("Country.Name","color")) #first get new dataframe shape
ggplot(data=data_GDP_EURO_long, aes(x=variable, y=value, group = Country.Name, color = color)) +
geom_line() +
geom_point( size=4, shape=21, fill="white") +
scale_color_identity(guide="legend", labels=data_GDP_EURO_long$Country.Name, breaks=data_GDP_EURO_long$color)