2014-12-17 13 views
5

Wprowadzenie

próbuję replikować w R wykres rozrzutu szeregów czasowych Mam utworzoną w Stata na podzbiór danych. Na wykresie rozrzutu znajduje się zmienna czasowa "data" na osi X (mm/dd/rrrr) oraz zmienna całkowita "koszt" na osi y (kwota pieniężna, w USD). Znaczniki znaczników są zmienną kategoryczną "nazwa firmy".Od Stata R: tworzenie rozrzutu z datą pionowych linii na podzbiorze

Rzeczywisty zestaw danych jest bardzo duży, ale próba wygląda następująco (patrz kod R poniżej), z obserwacjami (tj. Wierszami) wskazującymi transakcje (kolumna 1), a następnie zmiennymi wskazującymi datę transakcji (kolumna 2), koszt transakcji (kolumna 3) oraz nazwę firmy, która zainicjowała transakcję (kolumna 4).

#Sample Data Frame (R Code) 

transactionID <- c(1, 2, 3, 4) 
date <- as.Date(c("2006-08-06", "2008-07-30", "2009-04-16", "2013-02-05")) 
cost <- as.integer(c(1208, 23820, 402, 89943)) 
company <- c("ACo", "BInc", "CInd", "DOp") 
thedata <- data.frame(transactionID, date, cost, company) 

Robi to w Stata

wykresie rozrzutu Chcę będą mieć „data” na osi x i „koszt” na osi y, „Spółka” wymieniony jako etykiet markerów oraz będzie mają również 3 pionowe linie o różnym formatowaniu, które oznaczają ważne wydarzenia. Kroki do produkcji to w Stata są

  1. zidentyfikować punkty oś X dla linii pionowych w dniach 10 września 2007, 28 stycznia 2008 roku, 18 stycznia 2012, a 05 lutego 2013 r

MDR wyświetlacz (9,10,2007)

wyświetlacz MDR (1, 28, 2008)

wyświetlacz MDR (2, 5, 2013)

Trzy powyższe komendy wyświetlają wartości 17419, 17559, 19394, które są odczytywane wewnętrznie przez Statę, a które są osadzone w poniższym kodzie w celu wykreślenia wykresu rozrzutu.

  1. Utwórz wykres rozproszenia, dodając trzy pionowe linie z kroku 1, formatując je jako przerywane, przerywane i ciągłe linie w kolorach czerwonym, niebieskim i zielonym o różnych grubościach z „koszt” na osi y, „data” na osi x, a „Spółka” nazwy jako etykiety markera, bo tylko tych transakcji, które były mniejsze lub równe $ +3.000:

wykres data rozrzucenia twoway koszt, jeśli koszt < = 3000, mlabel (firma) xline (17419, lpatt (kropka) lwidth (gruby) lcol (czerwony)) xline (17559, lpatt (kreska) lwidth (medthick) lcol (niebieski)) xline (19394, lpatt (lite) lwidth (cienki) lcol (zielony))

Problemy robi to w R

Kiedy próbowałem powtórzyć go w RI napotkało następujące problemy

  1. nie może dowiedzieć się, jak dodać pionowe linie na tych konkretnych dat, ani jak zmienić format ich rozmiaru?
  2. Oś Y ("koszt") zapisana jest w notacji naukowej (np. 2e + 05) zamiast zwykłych liczb (to jest 200 000)
  3. Nie do końca rozumiem podzestawy w R; w Stata mogę z łatwością dodawać kwalifikatory "if" do badania określonych podzbiorów danych (np."jeśli koszt> 3000 & transactionID < 5"), a następnie łatwo modyfikować je, aby ponownie uruchomić analizy lub wykreślić wykresy na innych różnych podzbiorach. Ale w R wydaje się, że są dodatkowe kroki, w których trzeba najpierw dokonać podzbioru danych i zapisać go jako nowy obiekt, a następnie uruchomić analizę tego obiektu. Czy to prawda? Widzę w tym pewne korzyści, ale także pewne wady (na przykład setki różnych obiektów zaśmiecających środowisko pracy podczas eksploracji danych, na przykład).

Do tej pory przygotowałem następujący kod. Początkowo próbowałem to zrobić za pomocą podstawowych poleceń instalacji R plot plot() i text(), ale wydaje się, że nie można tego zrobić w bazie R. Więc spróbowałem użyć pakietu ggplot2, ale wciąż nie mogę tego zrozumieć mógłbym w Stata:

library(ggplot2) 
ggplot(thedata, aes(date, cost)) + 
     geom_text(label = thedata$company, color="blue", vjust = 0) + 
     geom_vline(xintercept = as.numeric(thedata$date[ 
         c(I don't know what goes here, or here)]), 
        linetype="dotted", color="red") 

jak widać, nie mogę dowiedzieć się, jak współrzędne dla xintercept prac poleceń geom_vline (i nie można go znaleźć w oficjalnym pliku pomocy), szczególnie kiedy chcę mają być datami (szczególnie datami, które mogą lub nie muszą być w ramce danych), ani nie mogę wymyślić, jak zmienić grubość linii.

+0

To pytanie jest zbyt długa. W każdym razie pomocne byłoby zdjęcie twojego wykresu danych. I mylisz się w przekonaniu, że musisz przechowywać podzbiory jako nowe obiekty. Możesz łatwo zrobić coś takiego jak 'someFunction (yourData [subsettingCondition,])'. – Roland

+2

W Stata można oceniać daty w linii: możesz mieć '' xline ('= mdy (9,10,2007) ', lpatt (kropka) lwidth (gruby) lcol (czerwony))' 'itd., Osadzone w kodzie 'graph'. –

Odpowiedz

3

bardzo ładnie wykonane pytanie. Jeśli nadal jesteś zainteresowany w roztworze podstawowym:

transactionID <- c(1, 2, 3, 4) 
date <- as.Date(c("2006-08-06", "2008-07-30", "2009-04-16", "2013-02-05")) 
cost <- as.integer(c(1208, 23820, 402, 89943)) 
company <- c("ACo", "BInc", "CInd", "DOp") 
thedata <- data.frame(transactionID, date, cost, company) 


par(mar = c(5,7,3,2), tcl = .2, las = 1) 
with(thedata, 
    plot(date, cost, xlab = 'Date', ylab = '', axes = FALSE, main = 'a plot')) 
dseq <- seq.Date(as.Date('2006-01-01'), as.Date('2013-01-01'), by = 'year') 
axis.Date(1, at = dseq, labels = format(dseq, format = '%Y')) 
# axis.Date(1, at = seq.Date(min(date), max(date), by = 'year')) 
axis(2, at = pretty(cost), 
    labels = format(pretty(cost), scientific = FALSE, big.mark = ',')) 
## add lines at specified dates 
abline(v = as.Date(c('2007-09-10','2008-01-28','2012-01-18')), lwd = 1:3, 
     lty = c('dotted','dashed','solid'), col = c('red','blue','green')) 
## add company labels 
text(x = date, y = cost, pos = 3, xpd = NA, 
    labels = ifelse(cost <= 3000, company, '')) 
title(ylab = 'Cost', line = 5) 
box('plot', bty = 'l') 

enter image description here

Aby rozwiązać kilka konkretnych pytań:

  1. używam as.Date. sklepy R pochodzi podobnie jak Stata

    abline(v = as.Date(c('2007-09-10','2008-01-28','2012-01-18')), lwd = 1:3, 
         lty = c('dotted','dashed','solid'), col = c('red','blue','green')) 
    
  2. stosowanie formatowania

    format(pretty(cost), scientific = FALSE, big.mark = ',') 
    # [1] "  0" " 20,000" " 40,000" " 60,000" " 80,000" "100,000" 
    
  3. można oczywiście tworzyć pewne podzbiory jeśli są bardziej wygodne, ale zazwyczaj istnieje sposób, aby zrobić jedno liniowej w r

    ifelse(cost <= 3000, company, '') 
    # [1] "ACo" ""  "CInd" "" 
    

Większość podstawy funkcje poletku wektorowy, który jest dlaczego to takie proste. Nie jestem też czarodziejem ggplota i zwykle powoduje to ból głowy, gdy próbuję wykonywać bardzo dokładnie sformatowane wątki, takie jak te. Generalnie ggplot jest dobry na ładne, szybkie i brudne wykresy. Jeśli chcesz coś bardzo konkretnego lub opublikować, podstawowa grafika jest do zrobienia.

+1

Prawa ręka do wtyczki dla grafiki podstawowej. Mam taką samą trudność. Dodanie adnotacji opartej na danych do obiektów ggplot pozostaje dla mnie zagadką. Poza tym nie mogę uzyskać kodu tak, jak potrafię z grafiką bazową lub graficzną.Nie mogę powiedzieć, ile razy spotkałem się z linkiem do funkcji 'ggplot2 :: layer', aby znaleźć .... w zasadzie pustą przestrzeń, kiedy podążam za łączem. Właśnie sprawdziłem, znowu. Tam nie ma. –

+0

ggplot to gra dla młodego mężczyzny, @BondedDust, i dobrze .. – rawr

+2

Jeśli Twój wykres jest zgodny z filozoficznymi punktami Hadleya, możesz łatwo stworzyć wysokiej jakości wykresy do publikacji (zazwyczaj z mniejszą ilością kodu, niż jest to wymagane w przypadku grafiki podstawowej). Tylko wtedy, gdy chcesz zrobić coś nieobsługiwanego przez ggplot2, masz kłopoty i lepiej z bazą. W dzisiejszych czasach zwykle używam wykresów bazowych do szybkiego i brudnego oraz ggplot2 do publikacji (o ile nie potrzebuję osi pomocniczej). – Roland

3

Tak oto jest metoda ggplot, która, jak sądzę, produkuje to, o co prosisz.

library(ggplot2) 
key.events <- data.frame(date=as.Date(c("2007-09-10","2008-01-28","2012-01-18"))) 
ggplot(thedata[thedata$cost>3000,],aes(x=date,y=cost))+ 
    geom_point(shape=1,size=3)+ 
    geom_text(aes(label=company),vjust=-1)+ 
    scale_y_continuous(expand=c(0.2,0.2))+ 
    geom_vline(data=key.events, size=1, 
      aes(xintercept=as.integer(date),color=factor(date),linetype=factor(date)))+ 
    scale_color_manual(values=c("red","blue","green"))+ 
    scale_linetype_manual(values=c("dotted","dashed","solid"))+ 
    theme_bw() 

+0

Jest to bardzo pomocne, dzięki! Właśnie napotkałem dwa problemy, gdy próbowałem zastosować je do mojego pełnego zestawu danych: (1) znaczniki znaczników y-value są nadal zapisane w notacji naukowej (np. 8e + 05 zamiast 800 000) i (2) oś x ma nie pasuje do 0, więc istnieje duża luka białego odstępu między miejscem, w którym wykreślone obserwacje zaczynają się pojawiać w punkcie 0 i powyżej, a linią osi x. Czy wiesz, dlaczego tak się stało? – coip

Powiązane problemy