Искры в ggplot2
Tufte Sparklines (как показано в его великолепном доказательстве) были воспроизведены в базовой графике как часть YaleToolkit и далее совершенствуется в результате этого вопроса. Искры также были сделаны в решетке как часть моего небольшого побочного проекта Tufte в R (самореклама не предназначена). Моя цель теперь состоит в том, чтобы воспроизвести искровые линии Туфте в ggplot2. Есть несколько сценариев плавающие вокруг Gist, а также как ответ на этот вопрос на SO, но ни одна из них не дает прочной основы для создания реплицируемых наборов искровых линий.
Теперь я хотел бы, чтобы эти несколько искровых линий выглядели так (это было сделано в базовой графике, а код доступен здесь) - точки обозначают максимальные/минимальные значения, число на правом конце - конечное значение в определенных временных рядах, а серая полоса показывает приблизительный диапазон квантилей:
![введите описание изображения здесь]()
Я не за горами, но я застрял в задании минимальных/максимальных значений и меток:
library(ggplot2)
library(ggthemes)
library(dplyr)
library(reshape)
library(RCurl)
dd <- read.csv(text =
getURL("https://gist.githubusercontent.com/GeekOnAcid/da022affd36310c96cd4/raw/9c2ac2b033979fcf14a8d9b2e3e390a4bcc6f0e3/us_nr_of_crimes_1960_2014.csv"))
d <- melt(dd, id="Year")
names(d) <- c("Year","Crime.Type","Crime.Rate")
dd <- group_by(d, Crime.Type) %>%
mutate(color = (min(Crime.Rate) == Crime.Rate | max(Crime.Rate) == Crime.Rate))
ggplot(dd, aes(x=Year, y=Crime.Rate)) +
facet_grid(Crime.Type ~ ., scales = "free_y") +
geom_line(size=0.3) + geom_point(aes(color = color)) +
scale_color_manual(values = c(NA, "red"), guide=F) +
theme_tufte(base_size = 15) +
theme(axis.title=element_blank(),
axis.text.y = element_blank(), axis.ticks = element_blank()) +
theme(strip.text.y = element_text(angle = 0, vjust=0.2, hjust=0))
![введите описание изображения здесь]()
Ответы
Ответ 1
Вот один из подходов к получению отдельных цветных точек, а также трех наборов меток и оттененных диапазонов квартилей:
# Calculate the min and max values, which.min returns the first (like your example):
mins <- group_by(d, Crime.Type) %>% slice(which.min(Crime.Rate))
maxs <- group_by(d, Crime.Type) %>% slice(which.max(Crime.Rate))
ends <- group_by(d, Crime.Type) %>% filter(Year == max(Year))
quarts <- d %>%
group_by(Crime.Type) %>%
summarize(quart1 = quantile(Crime.Rate, 0.25),
quart2 = quantile(Crime.Rate, 0.75)) %>%
right_join(d)
ggplot(d, aes(x=Year, y=Crime.Rate)) +
facet_grid(Crime.Type ~ ., scales = "free_y") +
geom_ribbon(data = quarts, aes(ymin = quart1, max = quart2), fill = 'grey90') +
geom_line(size=0.3) +
geom_point(data = mins, col = 'blue') +
geom_text(data = mins, aes(label = Crime.Rate), vjust = -1) +
geom_point(data = maxs, col = 'red') +
geom_text(data = maxs, aes(label = Crime.Rate), vjust = 2) +
geom_text(data = ends, aes(label = Crime.Rate), hjust = 0) +
geom_text(data = ends, aes(label = Crime.Type), hjust = 0, nudge_x = 5) +
expand_limits(x = max(d$Year) + (0.25 * (max(d$Year) - min(d$Year)))) +
scale_x_continuous(breaks = seq(1960, 2010, 10)) +
scale_y_continuous(expand = c(0.1, 0)) +
theme_tufte(base_size = 15) +
theme(axis.title=element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
strip.text = element_blank())
Я предполагаю, что вам здесь не нужна легенда. Вы почти наверняка можете сделать вещи более краткими, объединив некоторые data.frames, но несколько запросов geom кажутся наиболее легкими здесь.
![введите описание изображения здесь]()