2012-10-08 27 views
52

Tôi đang cố gắng để thực hiện một heatmap sử dụng ggplot2 bằng cách sử dụng chức năng geom_tiles đây là mã của tôi dưới đây:Làm thế nào để bạn đặc biệt đặt ggplot2 x trục thay vì thứ tự chữ cái?

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")). 

dữ liệu là tập tin data.csv tôi
trục X của tôi là loại điều trị
Y của tôi trục là các loại sinh vật

Tôi không quá quen thuộc với các lệnh và lập trình và tôi tương đối mới ở đây. Tôi chỉ muốn có thể chỉ định thứ tự của các nhãn trên trục x. Trong trường hợp này, tôi đang cố gắng xác định thứ tự "Điều trị". Theo mặc định, nó đặt hàng theo thứ tự bảng chữ cái. Làm cách nào để ghi đè/giữ dữ liệu theo thứ tự giống như trong tệp csv gốc của tôi?

Tôi đã thử lệnh này

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

trong đó x, y, z là để tình trạng điều trị của tôi. Tuy nhiên nó không hoạt động tốt lắm, và cho tôi những hộp nhiệt bị thiếu.

Trả lời

85

Hơi khó trả lời câu hỏi cụ thể của bạn mà không có ví dụ đầy đủ, có thể tái sản xuất. Tuy nhiên, một cái gì đó như thế này sẽ hoạt động:

#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)) 

Trong ví dụ này, thứ tự của hệ số sẽ giống như trong tệp data.csv.

Nếu bạn thích một thứ tự khác nhau, bạn có thể ra lệnh cho họ bằng tay:

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

Tuy nhiên điều này rất nguy hiểm nếu bạn có rất nhiều các cấp: nếu bạn nhận được bất kỳ trong số họ sai, mà sẽ gây ra vấn đề.

+0

OMG! Tôi đạt được rồi! Cảm ơn rất nhiều, đây chính xác là những gì tôi cần! :) Bạn đã làm ngày hôm nay của tôi trở nên thú vị. –

+10

Hãy tự hỏi tại sao điều này thậm chí còn cần thiết. Tại sao các trục được sắp xếp lại bởi ggplot ngay từ đầu? Có vẻ nguy hiểm nếu ai đó không biết điều này sẽ xảy ra. –

+0

Tôi chỉ chạy vào vấn đề này bản thân mình làm cho một [heatmap với qplot] (http://martinsbioblogg.wordpress.com/2013/03/21/using-r-correlation-heatmap-with-ggplot2/) và tự động áp dụng tên biến . Nó có nên được báo cáo không? –

0

Tình cờ gặp câu trả lời này do câu hỏi trùng lặp hiện tại. Câu trả lời hiện tại chỉ cung cấp giải pháp yêu cầu thay đổi khung dữ liệu cơ bản. Nhưng điều đó không cần thiết. Người ta cũng có thể chỉ xác định một vector cho sự sắp xếp và sử dụng nó trong cuộc gọi thẩm mỹ trực tiếp. Giải pháp sau đây rõ ràng không khác nhiều so với câu trả lời ở trên, với sự khác biệt quan trọng là khung dữ liệu gốc không bị thay đổi.

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

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

hoặc

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

Các vấn đề liên quan