2016-02-16 22 views
15

Tufte Sparklines (come illustrato nel suo bella Evidence) sono stati replicati in grafici di base come parte di YaleToolkit e ulteriormente perfezionato come risultato di this question. Le spline sono state fatte anche nel reticolo come parte del mio piccolo progetto parallelo Tufte in R (auto-promozione non intesa). Il mio obiettivo ora è replicare le sparkline di Tufte in ggplot2. Ci sono alcuni script floating around on Gist e anche come risposta a this question on SO, ma nessuno di questi fornisce una solida base per creare serie replicabili di sparkline.Sparklines in ggplot2

Ora, mi piacerebbe che le linee di spigoli multipli assomiglino a questo (è stato fatto nella grafica di base e nello code is available here) - i punti indicano i valori massimo/minimo, il numero all'estremità destra è un valore finale in serie temporali specifiche e grigio banda mostra un quantili grezzi variano:

enter image description here

io non sono lontano, ma mi sono bloccato con l'assegnazione di valori minimi/massimi e le etichette:

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

risposta

19

Ecco un approccio per ottenere i singoli punti colorati, così come i tre set di etichette e gli intervalli quartile ombreggiati:

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

Sto assumendo che non si vuole una leggenda qui. Puoi quasi sicuramente rendere le cose più concise unendo alcuni data.frames, ma più chiamate geom sembrano essere più semplici qui.

enter image description here

+2

... e le etichette possono essere solo due strati più '' geom_text' con vjust' impostato in modo appropriato. – joran

+0

Ho appena notato che ho scambiato i colori ... -.- – Axeman