2013-02-27 11 views
5

Mam ramki danych all że wyglądać tak:R - Tworzenie wykres punktowy z ramki danych

http://pastebin.com/Xc1HEYyH

Teraz chcę utworzyć wykres punktowy z nagłówków kolumn w osi x i odpowiednie wartości jako punkty danych. Na przykład:

7|     x 
6|   x  x 
5| x  x  x  x  
4| x  x   x 
3|        x  x 
2|        x  x 
1| 
--------------------------------------- 
    STM STM STM PIC PIC PIC 
    cold normal hot cold normal hot 

To powinno być łatwe, ale nie wiem jak.

Pozdrowienia

Odpowiedz

8

Podstawową ideą, jeśli chcesz wykreślić używając Hadley ggplot2 jest, aby dane w postaci:

 x   y 
col_names  values 

I można to zrobić za pomocą melt funkcję z Hadley reshape2. Wykonaj ?melt, aby zobaczyć możliwe argumenty. Jednak tutaj, ponieważ chcemy, aby stopić cały data.frame, musimy tylko,

melt(all) 
# this gives the data in format: 
# variable value 
# 1 STM_cold 6.0 
# 2 STM_cold 6.0 
# 3 STM_cold 5.9 
# 4 STM_cold 6.1 
# 5 STM_cold 5.5 
# 6 STM_cold 5.6 

Tutaj x będzie następnie kolumna variable i y zostaną odpowiadające value kolumnę.

require(ggplot2) 
require(reshape2) 
ggplot(data = melt(all), aes(x=variable, y=value)) + 
      geom_point(aes(colour=variable)) 

Jeśli nie chcesz kolory, a potem po prostu usunąć aes(colour=variable) wewnątrz geom_point tak, że staje się geom_point().

enter image description here

Edit: powinienem chyba wspomnieć tutaj, że można również zastąpić geom_point z geom_jitter że dam ci dobrze, jittered punkty:

enter image description here

+0

Dzięki, że jest świetny. Czy istnieje sposób na ustawienie innego kształtu dla każdej z różnych wartości osi X? – user1192748

+0

tak, po prostu użyj 'shape = variable' wewnątrz' aes' jak 'colour'. – Arun

+2

+1. Nie jestem zwykłym użytkownikiem ggplot2, więc zawsze miło jest zobaczyć alternatywne opcje, które są dostępne w użyciu. Jednak kilka krytyk. Po pierwsze, czy legenda jest naprawdę potrzebna w tym przypadku? Nie widzę żadnej wartości dodanej dla tego konkretnego przykładu. Jeśli w * każdej zmiennej znajdują się dalsze grupy *, może być sens mieć różne kolory lub kształty i legendę. Po drugie, czy można bardziej kontrolować jittera? Uważam, że nieco rozprasza to, jak drgania pozostawiają duże dziury dla niektórych zmiennych, ale sprawiają, że inni wydają się bardziej skupieni. – A5C1D2H2I1M1N2O1R2T1

5

Oto dwa opcje do rozważenia. Pierwsza wykorzystuje dotplot z "kraty" pakietu:

library(lattice) 
dotplot(values ~ ind, data = stack(all)) 

enter image description here

Drugi wykorzystuje dotchart z opcji zasady R jest "grafika". Aby skorzystać z funkcji dotchart, trzeba owinąć data.frame w as.matrix:

dotchart(as.matrix(all), labels = "") 

Należy pamiętać, że punkty w tej grafice są nie „jittered”, ale raczej przedstawiane w kolejności, w jakiej zostały nagrane. To znaczy, najniższym punktem jest pierwszy rekord, a najwyższym punktem jest ostatni rekord. Jeśli przybliżysz wykres do tego przykładu, zobaczysz, że masz 16 bardzo słabych poziomych linii. Każda linia reprezentuje jeden wiersz z każdej kolumny. Tak więc, jeśli spojrzysz na kropki dla "STM_cold" lub innych zmiennych, które mają wartości NA, zobaczysz kilka pustych wierszy u góry, gdzie nie ma dostępnych danych.

Ma to swoje zalety, ponieważ może wykazywać trend w czasie, jeśli wartości są rejestrowane chronologicznie, ale może być także wadą, jeśli w źródłowej ramce danych znajduje się zbyt wiele wierszy.

enter image description here

3

Trochę manualną wersji zastosowaniem zasady grafiki R tylko dla zabawy.

Pobierz dane:

test <- read.table(text="STM_cold STM_normal STM_hot PIC_cold PIC_normal PIC_hot 
6.0 6.6 6.3 0.9 1.9 3.2 
6.0 6.6 6.5 1.0 2.0 3.2 
5.9 6.7 6.5 0.3 1.8 3.2 
6.1 6.8 6.6 0.2 1.8 3.8 
5.5 6.7 6.2 0.5 1.9 3.3 
5.6 6.5 6.5 0.2 1.9 3.5 
5.4 6.8 6.5 0.2 1.8 3.7 
5.3 6.5 6.2 0.2 2.0 3.5 
5.3 6.7 6.5 0.1 1.7 3.6 
5.7 6.7 6.5 0.3 1.7 3.6 
NA NA NA 0.1 1.8 3.8 
NA NA NA 0.2 2.1 4.1 
NA NA NA 0.2 1.8 3.3 
NA NA NA 0.8 1.7 3.5 
NA NA NA 1.7 1.6 4.0 
NA NA NA 0.1 1.7 3.7",header=TRUE) 

Skonfiguruj podstawowe działki:

plot(
    NA, 
    ylim=c(0,max(test,na.rm=TRUE)+0.3), 
    xlim=c(1-0.1,ncol(test)+0.1), 
    xaxt="n", 
    ann=FALSE, 
    panel.first=grid() 
    ) 

axis(1,at=seq_along(test),labels=names(test),lwd=0,lwd.ticks=1) 

Plot niektórych punktach, z pewnymi osi x jitter ing więc nie są one drukowane na górze siebie.

invisible(
    mapply(
     points, 
     jitter(rep(seq_along(test),each=nrow(test))), 
     unlist(test), 
     col=rep(seq_along(test),each=nrow(test)), 
     pch=19 
     ) 
) 

Wynik:

enter image description here

edit

Oto przykład za pomocą przezroczystości alfa na punkty i pozbycie się jitter jak omówiono w poniższych uwag Ananda.

invisible(
    mapply(
     points, 
     rep(seq_along(test),each=nrow(test)), 
     unlist(test), 
     col=rgb(0,0,0,0.1), 
     pch=15, 
     cex=3 
     ) 
) 

enter image description here

+0

+1, Początkowo myślałem o czymś, używając pasków ze stosowaniem jittera, ale wtedy przyszło mi do głowy, że kropka pokaże mi oddzielne punkty, które nie są * zaśmiecone, ale zamiast tego kolejność, w jakiej pojawiają się w zbiorze danych. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto - To był twój przykład, który zainspirował tę próbę. Sądzę, że inną opcją, która przyszła mi do głowy, byłoby narysowanie punktów z niską kryciem (używając wartości kolorów rgba) i wyeliminowanie drgań. – thelatemail

+0

Uznałem, że tak, więc zaktualizowałem swoją odpowiedź, aby odzwierciedlić fakt, że odpowiedź na temat dotchart w rzeczywistości * nie jest * zaśmiecona. Podoba mi się pomysł wykorzystania kanału alfa w jakiś sposób bez drgań. Lub używając otwartych kształtów (nie wypełnionych) wraz z przezroczystością. – A5C1D2H2I1M1N2O1R2T1