2016-02-16 13 views
15

Tufte Sparklines (jak zilustrowano na jego Piękne Evidence) zostały powtórzone w grafik bazowych jako część YaleToolkit i dalej do perfekcji w wyniku this question. Linie wzronione zostały również wykonane w kraty jako część mojego małego projektu bocznego Tufte in R (autopromocja nie jest przeznaczona). Moim celem jest teraz replikowanie linii błyskowych Tufte w ggplot2. Istnieje kilka skryptów: floating around on Gist, a także jako odpowiedź na this question on SO, ale żadna z nich nie stanowi solidnej podstawy do tworzenia powtarzalnych zestawów linii błyskowych.Sparklines w ggplot2

Teraz chciałbym, aby te wiele linii błyskowych wyglądało tak (zostało zrobione w podstawowej grafice i code is available here) - kropki oznaczają wartości maksymalne/minimalne, liczba na prawym końcu jest wartością końcową w określonych szeregach czasowych i szarości zespół przedstawia wzburzone kwantyle wynosić:

enter image description here

nie jestem daleko, ale utknąłem z cesją minimalnych wartości maksymalnych i etykiet /:

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

enter image description here

Odpowiedz

19

Oto jedno podejście do coraz jednokolorowych punktów, a także trzy zestawy etykiet i zacienione zakresy kwartylu:

# 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()) 

jestem przy założeniu, że nie chcesz tu legendę. Możesz prawie na pewno zrobić rzeczy zwięzłe, łącząc niektóre dane.frames, ale wiele połączeń geom wydaje się być najłatwiejszym tutaj.

enter image description here

+2

... i etykiety może być tylko dwa kolejne warstwy z '' geom_text' vjust' odpowiednio ustawione. – joran

+0

Właśnie zauważyłem, że zamieniłem kolory ... -.- – Axeman