2014-10-08 3 views
8

я не знаю название этого типа сюжета (комментарии вокруг этого приветствуется). По сути, это штрих-код с глифами, которые заполняются для обозначения потери/усиления. Глиф представляет собой стрелку, подобную информации кодирования о направлении, величине и разрешающей видимость столбца.разница сюжет

enter image description here

Это выглядит интересно, но не могу думать о том, как сделать это в ggplot2 (кадр работы сетки). Как можно воссоздать этот сюжет в ggplot2/grid framework (базовые решения также приветствуются для полноты вопроса). В частности, глифы, а не текст, поскольку это уже довольно прямо в ggplot2.

Вот несколько кодов для создания данных и традиционных накладных & координаты перевернутых уклонированных графиков и линейных графиков, чтобы показать типичные способы визуализации данных этого типа.

set.seed(10) 
x <- sample(30:60, 12) 
y <- jitter(x, 60) 

library(ggplot2) 
dat <- data.frame(
    year = rep(2012:2013, each=12), 
    month = rep(month.abb, 2), 
    profit = c(x, y) 
) 


ggplot() + 
geom_bar(data=subset(dat, year==2012), aes(x=month, weight=profit)) + 
geom_bar(data=subset(dat, year==2013), aes(x=month, weight=profit), width=.5, fill="red") 

ggplot(dat, aes(x=month, fill=factor(year))) + 
    geom_bar(position="dodge", aes(weight=profit)) + 
    coord_flip 

ggplot(dat, aes(x=month, y=profit, group = year, color=factor(year))) + 
    geom_line(size=1) 

enter image description here

enter image description here

enter image description here

+0

'' annotation_custom' с polygonGrob' лет мог бы работать. – hrbrmstr

+4

Ваши примеры лучше, чем исходный граф. В лучшем случае глифы сбивают с толку, вводя в заблуждение в худшем случае. – thelatemail

+0

Как @thelatemail сказал! Построение двух разных наборов данных (значение и дельта) на одном графике обычно не рекомендуется, поскольку его трудно расшифровать. –

ответ

11

Вот пример, возможно, есть и другие способы, хотя,

dat <- data.frame(
    year = rep(2012:2013, each=12), 
    month = factor(rep(1:12, 2), labels=month.abb), 
    profit = c(x, y) 
) 
dat2 <- reshape2::dcast(dat, month~ year, value.var = "profit") 
names(dat2)[2:3] <- paste0("Y", names(dat2)[2:3]) 

ggplot(dat2) + 
    geom_bar(aes(x=month, y = Y2012), stat = "identity", fill = "grey80", width = 0.6) + 
    geom_segment(aes(x=as.numeric(month)-0.4, xend = as.numeric(month)+0.4, y = Y2013, yend = Y2013)) + 
    geom_segment(aes(x = month, xend = month, y = Y2013, yend = Y2012, colour = Y2013 < Y2012), 
       arrow = arrow(60, type = "closed", length = unit(0.1, "inches")), size = 1.5) + 
    theme_bw() 

enter image description here

+0

Perfect. +1 Я согласен с @thelatemail, это может быть не лучший подход, если вы ищете более крупные шаблоны. Я думаю, что линейные диаграммы сделают это лучше. Но график здесь действительно улучшает дизайн, который я демонстрировал тем, что стрелки покрывают меньше бара geom. Если бы кто-то хотел более точные измерения по месяцам, этот подход может иметь некоторые преимущества. Я не знаю эмпирического исследования, которое сравнило восприятие такого графика для такой задачи, но я вижу, что это может иметь достоинства, позволяя быстро определить месячную изменчивость и величину, не теряя информацию о общей прибыли. –

+0

Можно сосредоточиться на любой цветной стрелкой или обратить внимание на прутья или внимание на разницу линии (не знаю, техническое название для них, но год 2 горизонтальные линии), не будучи слишком отвлекаться на конкурирующих preattentive атрибутов. Графическое качество и дизайн - это целевое назначение. Я вижу, что этот тип графа может иметь достоинство при правильных обстоятельствах. Спасибо за этот подход. –

Смежные вопросы