2012-10-08 9 views
52

Próbuję dokonać heatmap użyciu ggplot2 pomocą geom_tiles funkcję tutaj jest mój kod poniżej:Jak konkretnie zamówić ggplot2 x axis zamiast kolejności alfabetycznej?

p<-ggplot(data,aes(Treatment,organisms))+geom_tile(aes(fill=S))+ 
    scale_fill_gradient(low = "black",high = "red") + 
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0)) + 
    theme(legend.position = "right", 
    axis.ticks = element_blank(), 
    axis.text.x = element_text(size = base_size, angle = 90, hjust = 0, colour = "black"), 
    axis.text.y = element_text(size = base_size, hjust = 1, colour = "black")). 

danych jest mój plik Data.csv
moja oś X oznacza rodzaje leczenia
mój Y Oś to typy organizmów

Nie jestem zbyt zaznajomiony z komendami i programowaniem i jestem stosunkowo nowy w tym. Chcę tylko móc określić kolejność etykiet na osi X. W tym przypadku próbuję określić kolejność "Leczenia". Domyślnie zamawia alfabetycznie. Jak mogę to zmienić/zachować dane w tej samej kolejności, jak w moim oryginalnym pliku csv?

Próbowałem tę komendę

scale_x_discrete(limits=c("Y","X","Z")) 

gdzie x, y i z są mojego stanu leczenie zamówienia. To jednak nie działa zbyt dobrze i daj mi brakujące skrzynki ciepła.

Odpowiedz

85

Jest trochę trudno odpowiedzieć na twoje pytanie bez pełnego, powtarzalnego przykładu. Jednak coś jak to powinno działać:

#Turn your 'treatment' column into a character vector 
data$Treatment <- as.character(data$Treatment) 
#Then turn it back into an ordered factor 
data$Treatment <- factor(data$Treatment, levels=unique(data$Treatment)) 

W tym przykładzie kolejność czynnika będzie taka sama jak w pliku data.csv.

Jeśli wolisz inną kolejność, można zamówić je ręcznie:

data$Treatment <- factor(data$Treatment, levels=c("Y", "X", "Z")) 

jednak jest to niebezpieczne, jeśli masz dużo poziomach: jeśli któryś z nich tak, że będzie powodować problemy.

+0

OMG! Mam to! Wielkie dzięki, to było dokładnie to, czego potrzebowałem! :) Dzięki Tobie mój dzień jest lepszy. –

+10

Zastanawiam się, dlaczego jest to konieczne. Dlaczego topory są ponownie uporządkowane przez ggplot? Wydaje się niebezpieczne, jeśli ktoś nie jest świadomy, że tak się stanie. –

+0

Po prostu wpadłem na ten problem sam tworząc [mapę cieplną z qplot] (http://martinsbioblogg.wordpress.com/2013/03/21/using-r-correlation-heatmap-with-ggplot2/) i automatycznie zastosowałem nazwy zmiennych . Czy należy to zgłosić? –

0

Natknąłem się na tę odpowiedź z powodu bieżącego duplikatu pytania. Obecnie jedyna odpowiedź oferuje rozwiązanie, które wymaga zmiany podstawowej ramki danych. Ale to nie jest konieczne. Można również po prostu zdefiniować wektor do aranżacji i użycia, który bezpośrednio wywołuje estetykę. Poniższe rozwiązanie nie różni się znacząco od powyższej odpowiedzi, z tą różnicą, że oryginalna ramka danych nie została zmieniona.

level_order <- c('virginica', 'versicolor', 'setosa') 

ggplot(iris, aes(x = factor(Species, level = level_order), y = Petal.Width)) + geom_col() 

lub

level_order <- factor(iris$Species, level = c('virginica', 'versicolor', 'setosa')) 

ggplot(iris, aes(x = level_order, y = Petal.Width)) + geom_col() 

that's for the first version

Powiązane problemy