2010-10-14 4 views
15

Vi esto en un economista reciente y me preguntaba si alguien tiene código que ayudaría a replicarlo usando ggplot. Economist ChartPreguntándome cómo generar un gráfico que vi en la revista de economistas

alt text Gracias!

+2

¿No puedes usar los gráficos base R? Un 'barplot' horizontal y' abline' harán el trabajo. – nico

+8

¿Cuánto de una réplica quieres? No me gusta cuando la gente dice "¿Cómo puedo replicar esto?" sin dar el nivel de detalle. Por ejemplo, ¿necesita 'nil' en el punto cero de los EE. UU.? ¿Todas las notas al pie de la daga y la daga doble? El tipo de letra? También sería bueno tener un punto de partida de tu conocimiento, como "Sé cómo hacer una barra en ggplot" (y tal vez dar un ejemplo) "pero necesito más consejos sobre el diseño para producir algo así". . – Spacedman

+0

Tienes razón, debería haber sido más claro, pero realmente disfruto cómo la gente se tomó esta pregunta muy en serio. – datayoda

Respuesta

23

Jugué un poco con la funcionalidad de trama única base. Este es el resultado:

alt text

Este es el código que la produjo:

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) 

Puede que no sea la coincidencia exacta (por ejemplo, no sé cómo alinear a la derecha sin llamar. texto directamente), y si intenta redimensionarlo, el texto saltará, por lo que tendrá que modificar los parámetros para adaptarlos a sus necesidades. Pero demuestra que puede llegar lejos usando solo la funcionalidad de diagramación básica en R.

EDITAR: Como se comentó, las franjas blancas cruzan las barras. Esto es inevitable y no puede ajustarse con otra llamada al barplot, ya que eso redibujaría el área de trazado. Por lo tanto, tenemos que echar un vistazo al código fuente de barplot y personalizarlo para este propósito (me encanta lo fácil que es esto en R). Pero ahora nos hemos movido fuera de los básicos cómodos en R (es decir, utilizando barra de barras incorporada).Aquí está otra oportunidad en que:

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") 

} 

que crea esto:

alt text

+0

+1 ¡Buen trabajo, todo con el paquete básico también! –

+2

+1 Pasé algún tiempo aa? – VitoshKa

+0

Espectacular - ¡buen trabajo y gracias! – datayoda

9

El paquete latticeExtra tiene un tema de estilo después de The Economist revista que debería ayudar como punto de partida.

Sin embargo, que utiliza lattice mientras que todos los niños en estos días reclaman ggplot2 ...

+5

Esos niños locos ... – Shane

+0

+1 por llamarme un niño. eso se siente bien. Comprobará latticeExtra sin embargo ... realmente nunca oí hablar de Extra –

+0

Llámame un viejo pharte, pero todavía me gustan los gráficos de base y el enrejado. –

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

Esto no es exactamente una réplica ... Usaría texto() por cierto en lugar de abusar de la leyenda. Si lo ejecuto (R2.11.1), el texto flota sobre las barras. No piense que esto es lo que OP tenía en mente ... –

3

Creo que la mejor manera (más rápido, más fácil) para lograr la composición tipográfica precisa de una gráfica R es utilizar funciones R básicas para producir el detalle principal (use ggplot con geom_bar en este caso, o barra de gráficos de base) y luego guarde la gráfica en un archivo SVG. Abra el SVG en su paquete de edición favorito (Inkscape me impresiona más cada vez que lo uso) y luego realice la composición tipográfica final allí.

A continuación, puede hacer cosas como agarrar una leyenda y moverlo, eliminar elementos, añadir texto en cualquier lugar con cualquier formato en cualquier tipo de letra, etc.

+5

Esto contradice el principio de reproducibilidad. Tú y los demás no podrán recrear tu trama. – VitoshKa

+0

No estoy seguro acerca de Inkscape pero puede editar imágenes mediante programación mediante GIMP. http://www.gimp.org/tutorials/Basic_Batch/ –

+5

Como lo demuestra esta pregunta, la trama de The Economist también viola el principio de reproducibilidad. Entonces, para ser fiel al original, la reproducción también debería ser irreproducible. –

3

Aunque no se puede reproducir exactamente esa trama, escribí un tema de The Economist para ggplot, https://github.com/jrnold/ggplotJrnold. Vea el ejemplo en el archivo README de la página de github.

+1

+1 para pedirle a sus usuarios que nunca copien el tema de Excel. –

Cuestiones relacionadas