2010-10-14 6 views
15

Ich sah dies in einem neuen Wirtschaftswissenschaftler und ich fragte mich, ob jemand Code hat, der helfen würde, ihn mit ggplot zu replizieren. Economist ChartIch frage mich, wie ich ein Diagramm ausgeben kann, das ich im Wirtschaftsmagazin gesehen habe

alt text Vielen Dank!

+2

Können Sie nicht einfach Base-R-Grafik verwenden? Ein horizontaler "Barplot" und "Abline" werden die Arbeit erledigen. – nico

+8

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

+0

Sie haben recht, ich sollte ich klarer gewesen sein - aber ich genieße wirklich, wie Leute diese Frage zu Herzen nahmen! – datayoda

Antwort

23

ich um ein wenig mit nur Grundstück Funktionalität gespielt. Dies ist das Ergebnis:

alt text

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:

alt text

+0

+1 Netter Job, alles mit dem Basispaket auch! –

+2

+1 Verbrachte einige Zeit aa? – VitoshKa

+0

Spektakulär - gute Arbeit & danke! – datayoda

9

Das latticeExtra Paket hat ein Thema gestylt nach The Economist Magazin, das als Starthilfe dienen sollte.

jedoch die lattice während alle Kinder verwendet in diesen Tagen Lärm für ggplot2 ...

+5

Diese verrückten Kinder ... – Shane

+0

+1 für callin mich ein Kind. das fühlt sich gut an. Will gitterExtra aber überprüfen ... eigentlich noch nie von dem Extra gehört –

+0

Nennen Sie mich eine alte Pharte, aber ich mag immer noch Base-Grafiken und Gitter. –

1
bigmacprice=rnorm(10) 

names(bigmacprice)=1:10 

par(bg="lightblue") 
barplot(sort(bigmacprice), 
     horiz=T, 
     legend="Bunfight!! \nBigmac index \nyadda \nyadda \nmmnnnkay ", 
     args.legend = list( x = "topleft", 
          bty="n" 

          ), 
    col='darkblue' 
) 
+1

Dies ist nicht genau ein Replikat ... Ich würde übrigens text() verwenden anstatt die Legende zu missbrauchen. Wenn ich es starte (R2.11.1), schwebt der Text über den Balken. Denken Sie nicht, dass OP dies im Sinn hatte ... –

3

Ich denke, die beste (schnellste, einfachste) Art und Weise präzisen Satz einer R Grafik zu erreichen, ist zu verwenden, grundlegende R-Funktionen, um das Hauptdetail zu erzeugen (benutzen Sie ggplot mit geom_bar in diesem Fall, oder Basisgrafikbarplot) und speichern Sie dann das Diagramm in einer SVG-Datei. Öffnen Sie das SVG in Ihrem bevorzugten Bearbeitungspaket (Inkscape beeindruckt mich jedes Mal, wenn ich es benutze) und mache dann den letzten Satz dort.

Sie können dann Dinge wie Greifer eine Legende und verschieben Sie sie um, löschen Elemente, fügen Sie Text überall mit jeder Formatierung in jeder Schriftart usw.

+5

Dies widerspricht dem Prinzip der Reproduzierbarkeit. Sie und andere wären nicht in der Lage, Ihre Handlung neu zu erstellen. – VitoshKa

+0

Nicht sicher über Inkscape, aber Sie können Bilder mit dem GIMP programmatisch bearbeiten. http://www.gimp.org/tutorials/Basic_Batch/ –

+5

Wie aus dieser Frage hervorgeht, verstößt die Handlung von The Economist auch gegen das Reproduzierbarkeitsprinzip. Um also dem Original treu zu bleiben, sollte die Reproduktion auch nicht reproduzierbar sein. –

3

Zwar ist es nicht genau das Grundstück wiedergeben kann, schrieb ich ein Economist Thema für ggplot, https://github.com/jrnold/ggplotJrnold. Siehe das Beispiel in der README der github-Seite.

+1

+1, um Ihre Benutzer zu bitten, niemals das Excel-Design zu kopieren. –

Verwandte Themen