2012-04-18 3 views
5

I mają następujące daneTworzenie pogrupowanych słupkowy wykres danych wielu kolumn w R

 Input Rtime Rcost Rsolutions Btime Bcost 
1 12 proc.  1 36  614425  40 36 
2 15 proc.  1 51  534037  50 51 
3 18-proc  5 62 1843820  66 66 
4 20-proc  4 68 1645581 104400 73 
5 20-proc(l)  4 64 1658509 14400 65 
6 21-proc 10 78 3923623 453600 82 

że aby utworzyć zgrupowanego wykres słupkowy z tych danych, tak że oś X zawiera Input pola (jako grupy) a oś y reprezentuje skalę logarytmu dla pól Rtime i Btime (dwa słupki).

Wszystkie rozwiązania/przykłady Sprawdziłem w Internecie miał podobne dane umieszczone w układzie trzy kolumny. Nie wiem, jak wykorzystać dane, które mam, aby wygenerować zgrupowany wykres słupkowy. Lub jeśli istnieje sposób, aby przekształcić te dane (ręcznie przekształcenie nie stanowi opcji, ponieważ jest to ogromny plik z wielu wierszy) do R i ggplot kompatybilnego formatu danych.

EDIT:

Wykres generowany przy użyciu gncs rozwiązanie

enter image description here

Odpowiedz

17

Zgodnie z wnioskiem, o ggplot2 rozwiązanie:

df <- read.table(text = "  Input Rtime Rcost Rsolutions Btime Bcost 
1 12-proc.  1 36  614425  40 36 
2 15-proc.  1 51  534037  50 51 
3 18-proc  5 62 1843820  66 66 
4 20-proc  4 68 1645581 104400 73 
5 20-proc(l)  4 64 1658509 14400 65 
6 21-proc 10 78 3923623 453600 82",header = TRUE,sep = "") 

dfm <- melt(df[,c('Input','Rtime','Btime')],id.vars = 1) 

ggplot(dfm,aes(x = Input,y = value)) + 
    geom_bar(aes(fill = variable),stat = "identity",position = "dodge") + 
    scale_y_log10() 

enter image description here

Uwaga różnica styl tutaj, gdzie od log(1) = 0, ggplot2 traktuje to jako pasek zerowej wysokości i robi” t narysuj cokolwiek, natomiast barplot kreśli mały stub (co moim zdaniem jest trochę mylące).

+1

niesamowite. Chciałbym wiedzieć, to przed napisaniem skryptu Pythona głupi {Python jest dobre, choć!} Dziękuję Joran – Ankit

+2

Warto zauważyć, że 'melt' znajduje się w pakiecie' reshape2' – Serenthia

+0

także potrzebne, aby dodać 'stat =„tożsamość”w' 'geom_bar' gdyż zamiast domyślnie' stat = „bin” ' – Serenthia

5

myślę zrozumieć problem i to jest to, co chciałbym zaproponować (krótką metę - opcja):

data <- read.table("data.txt", header=TRUE) 
subset <- t(data.frame(data$Rtime, data$Btime)) 
barplot(subset, legend = c("Rtime", "Btime"), names.arg=data$Input, log="y", beside=TRUE) 

Czy tego chcesz? To jest trochę brudne, ale spełnia swoją rolę.

Aktualizacja: Kod poprawione.

+0

Jesteś mężczyzną! Wielkie dzięki. Czy wiesz, jak to zrobić, używając ggplota? – Ankit

2

Jøran za odpowiedź bardzo mi pomogło, ale musiałem użyć stat = "tożsamość" w rachunku ggplot tak:

ggplot(dfm, aes(x = Input,y = value)) + 
geom_bar(aes(fill = variable), position = "dodge", stat="identity") + 
scale_y_log10() 

Moja wersja jest 3.2.2 i R w wersji 1.0 ggplot2. 1

Dzięki.