Я видел это в недавнем экономисте, и мне было интересно, есть ли у кого-нибудь код, который бы помог повторить его с помощью ggplot. Таблица экономистов
Спасибо!
Я видел это в недавнем экономисте, и мне было интересно, есть ли у кого-нибудь код, который бы помог повторить его с помощью ggplot. Таблица экономистов
Спасибо!
Я немного поиграл, используя только функциональность базового сюжета. Это результат:
Вот код, который его создал:
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)
Это может быть не точное совпадение (например, я не знаю, как правильно выравнивать, не вызывая прямой текст), и если вы попытаетесь изменить его размер, текст скатится, так что вам придется еще больше настроить параметры чтобы соответствовать вашим потребностям. Но это показывает, что вы можете далеко продвинуться с использованием только базовых функций в R.
EDIT: Как отмечалось, белые полосы пересекают полоски. Это неизбежно и не может быть скорректировано с помощью другого вызова barplot
, так как это изменит область графика. Таким образом, мы должны заглянуть в исходный код barplot
и настроить его для этой цели (любите, как легко это в R). Но теперь мы перешли за пределы удобных основ в R (т.е. Используя встроенный барплот). Вот еще один вопрос:
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")
}
Что создает это:
В пакете latticeExtra есть тема, созданная после The Economist, который должен помочь в начале.
Тем не менее, это использует lattice, тогда как все дети в эти дни жалуются на ggplot2...
Хороший обзор создания этих диаграмм с ggplot2 в блоге LearnR: http://learnr.wordpress.com/2009/06/01/ggplot2-positioning-of-barplot-category-labels/
Я думаю, что лучший (самый быстрый и простой) способ добиться точной наброски R-графики - использовать базовые функции R для создания основной детали (используйте ggplot с geom_bar в этом случае или базовый графический планшет), а затем сохраните сюжет в файл SVG. Откройте SVG в своем любимом пакете редактирования (Inkscape больше меня впечатляет каждый раз, когда я его использую), а затем делаю окончательный набор.
Затем вы можете делать такие вещи, как захватить легенду и перемещать ее, удалять элементы, добавлять текст в любом месте с любым форматированием любым шрифтом и т.д.
Пока он не может точно воспроизвести этот сюжет, я написал тему Economist для ggplot, https://github.com/jrnold/ggplotJrnold. См. Пример в README страницы github.
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'
)
Я знаю, что вы попросили ggplot, но я понятия не имею, как это сработало, но хотел сделать это для меня (по-моему).
Итак, я натолкнулся на это:
http://code.google.com/apis/visualization/documentation/reference.html#barformatter
Надеюсь, вам понравится!
Удачи!
Trufa