2010-10-14 3 views
15

'da gördüğüm bir grafiğin nasıl çıkarıldığını merak ettim. Bunu son zamanlardaki bir ekonomistte gördüm ve kimsenin ggplot kullanarak çoğaltmaya yardımcı olacak bir kodu olup olmadığını merak ediyorum. Economist ChartEkonomist dergisi

alt text Teşekkürler!

+2

Yalnızca temel R grafiklerini kullanamaz mısınız? Yatay bir 'barplot' ve 'abline' işi yapacak. – nico

+8

Bir çoğaltma ne kadar istiyorsun? İnsanlar "Bunu nasıl kopyalayabilirim?" Dediğinde sevmiyorum detay seviyesini vermeden. Örneğin, ABD'nin sıfır noktasında 'nil' ye ihtiyacınız var mı? Tüm hançer ve çift hançer dipnotları? Yazı tipi? Ayrıca, "ggplot'ta bir barplotun nasıl yapıldığını biliyorum" (ve belki de bir örnek verelim) gibi bilginizin bir başlangıç ​​noktasına sahip olmak da güzel olurdu, ama biraz bunun gibi bir şey üretmek için stil konusunda daha fazla tavsiyeye ihtiyacım var. . – Spacedman

+0

Haklısın Daha açık olmalıyım - ama insanların bu soruyu nasıl yüreklendirdiğinden gerçekten zevk aldım! – datayoda

cevap

23

Biraz kullanan tek baz arsa işlevselliği etrafında oynanan herhangi biçimlendirme ile her yerde metin ekleyebilirsiniz.

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) 

O (tam eşleşme olmayabilir ex i uğramadan hizaya sağa nasıl bilmiyorum.

İşte alt text

bunu üreten kod şudur: Bu sonuç metni doğrudan) ve metni yeniden boyutlandırmaya çalışırsanız, metin etrafta zıplayacaktır, bu nedenle parametrelerinizi ihtiyaçlarınıza uyacak şekilde daha fazla ayarlamalısınız. Ancak, yalnızca temel çizim fonksiyonunu kullanarak çok uzaklaştığınızı göstermeye devam ediyor.

DÜZENLEME: Yorum edildiği gibi, beyaz şeritler çubukları geçiyor. Bu kaçınılmazdır ve arsa alanını yeniden çizeceğinden, barplot numarasına başka bir çağrı ile ayarlanamaz. Dolayısıyla, barplot kaynak koduna bir göz atmalı ve bu amaç için özelleştirmeliyiz (bunun R'de ne kadar kolay olduğunu sevin). Ancak şimdi, R'deki rahat temellerin dışına taşındık (yani, barplotta inşa edilmiş).Burada başka Yine de oraya edilir:

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

} 

bu oluşturur Hangi:

alt text

+0

+1 Üstelik hepsi de temel paketiyle! –

+2

+1 Biraz zaman geçirdim mi? – VitoshKa

+0

Muhteşem - iyi iş ve teşekkür ederim! – datayoda

9

latticeExtra paketinin bir teması , bir başlangıç ​​olarak yardımcı olacak The Economist dergisinden sonra biçimlendirilmiştir. Bugünlerde ggplot2 için feryat tüm çocuklar ise lattice kullanır Ancak

...

+5

Bu çılgın çocuklar ... bana bir çocuk için – Shane

+0

+1. bu iyi hissettiriyor. LatticeExtra kontrol edecek mi ... aslında Ekstra –

+0

duymadım Bana bir eski pharte, ama hala temel grafikler ve kafes gibi. –

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

Bu tam olarak bir kopya değildir ... Metni(), efsaneyi kötüye kullanmak yerine kullanırdım. Eğer çalıştırırsam (R2.11.1), çubuklar üzerinde yüzen metin. OP'in aklında ne olduğunu düşünmeyin ... –

3

temel R fonksiyonları ana detayı (bu durumda geom_bar ile ggplot'u veya taban grafikleri) kullanın ve arsaları bir SVG dosyasına kaydedin. Favori düzenleme paketinizde SVG'yi açın (Inkscape her kullandığımda beni daha fazla etkiliyor) ve daha sonra buradaki son dizgiyi yap.

Daha sonra kepçeye gibi bir efsane şeyler yapmak ve etrafında hareket, elemanları silmek için, herhangi yazı vb

+5

Bu tekrarlanabilirlik ilkesi ile çelişiyor. Siz ve diğerleri arsalarınızı yeniden oluşturamayacaksınız. – VitoshKa

+0

Inkscape hakkında emin değilim, ancak GIMP'yi kullanarak görüntüleri program aracılığıyla düzenleyebilirsiniz. http://www.gimp.org/tutorials/Basic_Batch/ –

+5

Bu sorudan da anlaşılacağı gibi The Economist'in planı da tekrarlanabilirlik ilkesini ihlal ediyor. Bu nedenle, orijinaline sadık kalmak için, reprodüksiyon da kabul edilemez olmalıdır. –