2016-01-17 9 views
8

मैं डेटा के एक वर्ष के महत्वपूर्ण है कि इस तरह दिखता है:ggplot2 barplot साथ आर में एक द्विआधारी स्पार्कलाइन साजिश बिल्डिंग

datetime, key, value 
1/1/15, 7k Steps, 1 
1/1/15, Ate Poorly, 1 
1/1/15, Audiobook, 1 
1/1/15, Befriend, 1 
1/1/15, Called Mom, 1 
1/1/15, Code, 1 
1/1/15, Create, 1 
1/1/15, Critical, 1 
1/1/15, Emailed Friend, 1 
1/2/15, 10k Steps, 1 
1/2/15, Ate Poorly, 1 
1/2/15, Audiobook, 1 
1/2/15, Befriend, 1 
1/2/15, Called Mom, 1 
1/2/15, Create, 1 
1/2/15, Emailed Friend, 1 
1/2/15, Exercise, 1 
1/2/15, Friend Contact, 1 
1/2/15, Great Day, 1 
1/2/15, Write, 1 
1/3/15, 7k Steps, 1 
1/3/15, Ate Poorly, 1 
1/3/15, Befriend, 1 
1/3/15, Create, 1 
1/3/15, Emailed Friend, 1 
1/3/15, Friend Contact, 1 
1/3/15, Great Day, 1 
1/3/15, Happiness, 1 
1/3/15, Health, 1 
1/3/15, Videogame, 1 
1/3/15, Walked With Michelle, 1 
1/3/15, Write, 1 
1/4/15, 7k Steps, 1 
1/4/15, Ate Poorly, 1 
1/4/15, Audiobook, 1 
1/4/15, Great Day, 1 
1/4/15, Happiness, 1 
1/4/15, Health, 1 
1/4/15, Impatient, 1 
1/4/15, Love, 1 
1/4/15, Movie With Michelle, 1 

मैं एक साजिश है कि प्रत्येक दिन के लिए सलाखों के साथ प्रत्येक कुंजी के लिए एक पंक्ति प्रदर्शित करता है बनाना चाहते हैं, उस कुंजी के लिए 1 है।

enter image description here

यह एक मैं दर्दनाक अजगर और matplotlib का उपयोग कर गाया था है: यहाँ उत्पादन मैं इच्छा का एक उदाहरण है।

मैं आर, शायद, ggplot2 में इस तरह की साजिश प्रस्तुत करने का सबसे अच्छा और सरल तरीका ढूंढ रहा हूं। मैंने प्रत्येक कुंजी के लिए एक लूप के साथ ggplot2 में एक बार प्लॉट का उपयोग करने की योजना बनाई थी। यहां मेरे कोड का एक उदाहरण दिया गया है:

library(ggplot2) 
library(reshape) 
#library(ggtheme) 
# 2015 Lifedata Processing 
d <- read.csv("lifedata_2015.csv") 
d$datetime <- as.Date(d$datetime, "%m/%d/%Y") 

# Create a new dataframe with a subset of keys 
r <- d[d$key %in% c("Read", "Audiobook"), ] 
# Put 1s in all values. 
r$value <- 1 

# Generate a data frame for each day with a value of 1 and a key of "alldates" 
mydates <- data.frame("datetime" = seq(as.Date("2015/1/1"), as.Date("2015/12/31"), "days"), "key" = "alldates", "value" = 1) 

# combine two data frames, one after the other 
n <- rbind(r, mydates) 

# Transform into a wide data frame based on datetime and key with mean as the value. 
c <- cast(n, datetime~key, mean) 

# Turn NaNs into 0 
c[is.na(c)] = 0 
for(name in c("Read", "Audiobook")){ 
    plt <- c(plt, ggplot(data=c, aes_string(x="datetime", y=name)) + 
    geom_bar(stat="Identity", width=1)) 
    print(plot) 
} 
svg("~/Desktop/tagplot.svg") 
grid.arrange(plt, ncol = 1, main = "Read") 
dev.off() 

यह तकनीक काम नहीं कर रही थी।

घटना डेटा को साजिश करने का एक बेहतर तरीका क्या है जैसा कि मैंने उदाहरण में ऊपर दिया है?

+0

[वर्थ एक नज़र] (https://github.com/htmlwidgets/sparkline)? यह सुनिश्चित नहीं है कि यह कितना मजबूत है, लेकिन यह मेरी "कोशिश करने" सूची पर है। – alistaire

उत्तर

6

यहाँ, एक वैकल्पिक दृष्टिकोण है भारी @ TylerRinker के जवाब से उधार। जहां तक ​​मैं कह सकता हूं, उसका जवाब केवल कुछ दिखाता है यदि उस गतिविधि को लगातार दो दिन किया गया था।

सेटअप

library(dplyr) 
library(ggplot2) 

सबसे पहले, हम टायलर से इन टुकड़ों को उधार। हमें अच्छे लेबल की जरूरत है।

d <- d %>% 
    mutate(datetime = as.Date(datetime, "%m/%d/%y")) 

key <- d %>% 
    group_by(key) %>% 
    summarize(n = length(datetime), perc = n/length(unique(d$datetime))) %>% 
    arrange(perc) %>% 
    mutate(
    new = paste0(key, " - ", n, "(", 100*perc, "%)"), 
    new = factor(new, levels = new) 
) 

के बजाय geom_line हम geom_tile का उपयोग 1 का मान के साथ प्रत्येक दिन के लिए एक भरा आयत प्राप्त करने के लिए, लापता दिनों खाली रहते हैं। वाई दिशा में कुछ अलगाव बनाने के लिए हम geom_hline का उपयोग करते हैं।

प्लॉट कोड

left_join(d, key) %>% 
    ggplot(aes(datetime, y = new)) + 
    geom_tile(show.legend = FALSE, fill = 'grey50') + 
    geom_hline(yintercept = seq(0.5, length(levels(d$key))), 
      color = 'white', size = 2) + 
    theme_classic() + 
    scale_x_date(date_breaks = "1 month", date_labels = "%b", expand = c(0, 0)) + 
    ylab(NULL) + 
    xlab(NULL) 

परिणाम

enter image description here

+0

यह वास्तव में अच्छा काम किया। धन्यवाद! –

4

यहाँ एक अच्छी शुरुआत है, लेकिन छोटे विवरण में से कुछ बाहर काम करने की आवश्यकता होगी:

library(ggplot2) 
library(tidyr) 
library(dplyr) 

d <- d %>% 
    mutate(datetime = as.Date(datetime, "%m/%d/%y")) 


key <- d %>% 
    group_by(key) %>% 
    summarize(
     n = length(datetime), 
     perc = n/length(unique(d$datetime)) 
    ) %>% 
    arrange(perc) %>% 
    mutate(
     new = paste0(key, " - ", n, "(", 100*perc, "%)"), 
     new = factor(new, levels = new) 
    ) 

left_join(d, key) %>% 
    ggplot(aes(datetime, y = new)) + 
     geom_line(size = 6, alpha=.3) + 
     theme_minimal() + 
     scale_x_date(date_breaks = "1 month", date_labels = "%b", expand = c(0, 0)) + 
     ylab(NULL) + 
     xlab(NULL) 

enter image description here

+0

मुझे लगता है कि आप केवल लगातार दिनों पर घटनाओं को चिह्नित कर रहे हैं। – Axeman

+0

फिर geom_segment का उपयोग करें। –

संबंधित मुद्दे