ich um ein wenig mit nur Grundstück Funktionalität gespielt. Dies ist das Ergebnis:
Hier ist der Code, der es produziert:
bigmacprice <- data.frame(
country = c("Switzerland", "Brazil", "Euro area",
"Canada", "Japan", "United States",
"Britain", "Singapore", "South Korea",
"South Africa", "Mexico", "Thailand",
"Russia", "Malaysia", "China"),
price = c(6.78, 5.26, 4.79, 4.18, 3.91, 3.71,
3.63, 3.46, 3.03, 2.79, 2.58, 2.44,
2.39, 2.25, 2.18)
)
plotbigmac <- function(mac, base = "United States", xlim = c(-40, 100)) {
mac <- mac[order(mac$price),]
base = which(mac$country == base)
height <- (mac$price/mac[base, "price"] - 1) * 100
par(bg = "#d0e0e7", col.main = "#262324", col.axis = "#393E46",
mar = c(8, 8, 6, 6), las = 1)
barplot(height, width = .1, space = .4,
names.arg = mac$country, #cex.names = .8,
col = "#01516c", border = "#7199a8", # border = "#577784",
horiz = TRUE, xlim = c(-40, 100), axes = FALSE)
axis(3, lty = 0)
title(main = "Bunfight\nBig Mac index", col = "#393E46")
abline(v = seq(-100, 100, 10), col = "white", lwd = 2)
abline(v = 0, col = "#c8454e", lwd = 2)
par(xpd = TRUE)
for (i in 1:nrow(mac)) {
rect(105, (i - 1)/7, 118, i/7 - 0.05,
col = "white", border = "#7199a8")
text(112, (i - 1)/7 + 0.05, mac$price[i], cex = 0.8, col = "#393E46")
}
rect(-120, 2.5, -90, 3, col = "#c8454e", border = "#c8454e")
text(-68, -.2, "Sources:", col = "#393E46")
text(-64, -.3, "McDonald's;", col = "#393E46")
text(-60, -.4, "The Economist", col = "#393E46")
}
plotbigmac(bigmacprice)
Es ist vielleicht nicht die genaue Übereinstimmung sein (ex ich weiß nicht, wie ausrichten nach rechts ohne Aufruf. Text direkt), und wenn Sie versuchen, die Größe zu ändern, springt der Text herum, also müssten Sie die Parameter weiter an Ihre Bedürfnisse anpassen. Aber es zeigt, dass Sie mit der Verwendung nur grundlegender Plotfunktionen in R weit kommen können.
EDIT: Wie bereits erwähnt, kreuzen die weißen Streifen die Balken. Dies ist unvermeidlich und kann nicht mit einem weiteren Aufruf an barplot
angepasst werden, da dies den Diagrammbereich neu zeichnen würde. Daher müssen wir einen Blick in den Quellcode von barplot
werfen und ihn für diesen Zweck anpassen (wie einfach das in R ist). Aber jetzt haben wir uns von den bequemen Grundlagen in R entfernt (d. H. Mit eingebautem Barplot).Hier ist ein andere geht es:
plotBigMac <- function(mac, base = "United States") {
old.par <- par(no.readonly = TRUE)
on.exit(par(old.par))
# Create data:
mac <- mac[order(mac$price),]
base = which(mac$country == base)
height <- (mac$price/mac[base, "price"] - 1) * 100
# Costume 'barplot'
NN <- length(height)
width <- rep(1, length.out = NN)
delta <- width/2
w.r <- cumsum(width + 0.5)
w.m <- w.r - delta
w.l <- w.m - delta
xlim <- c(range(-.01 * height, height)[1], 100)
ylim <- c(min(w.l), max(w.r))
par(bg = "#d0e0e7", col.main = "#262324", col.axis = "#393E46",
mar = c(8, 8, 6, 6), las = 1, cex = 0.9)
plot.new()
plot.window(xlim, ylim)
abline(v = seq(-100, 100, 20), col = "white", lwd = 2)
rect(0, w.l, height, w.r, col = "#01516c", border = "#7199a8", lwd = 1)
# Lines and axis
abline(v = 0, col = "#c8454e", lwd = 2)
axis(3, axTicks(3), abs(axTicks(3)), lty = 0)
axis(2, labels = mac$country, at = w.m, lty = 0)
# Move outside of plot area
par(xpd = TRUE)
# Text misc.
text(5, (w.l[base] + w.r[base])/2, "nil", font = 3)
text(8, w.r[NN] + 2.3, "+")
text(-8, w.r[NN] + 2.3, "-")
# Create price boxes:
rect(105, w.l, 125, w.r,
col = "white", border = "#7199a8", lwd = 1)
text(115, (w.r + w.l)/2, mac$price, cex = 0.8, col = "#393E46")
}
Welche das schafft:
Können Sie nicht einfach Base-R-Grafik verwenden? Ein horizontaler "Barplot" und "Abline" werden die Arbeit erledigen. – nico
Wie viel von einer Replik willst du? Ich mag es nicht, wenn Leute sagen "Wie kann ich das wiederholen?" ohne die Detailgenauigkeit zu geben. Benötigen Sie zum Beispiel "Null" am Nullpunkt der USA? Alle Dolch- und Doppel-Dolch-Fußnoten? Die Schrift? Es wäre auch schön, einen Ausgangspunkt für Ihr Wissen zu haben, wie "Ich weiß, wie man ein Barplot in ggplot macht" (und vielleicht ein Beispiel), aber ich brauche noch ein paar Tipps zum Styling, um etwas ähnliches zu produzieren. . – Spacedman
Sie haben recht, ich sollte ich klarer gewesen sein - aber ich genieße wirklich, wie Leute diese Frage zu Herzen nahmen! – datayoda