2013-09-21 33 views
5

Đây là dữ liệu của tôi:Hai huyền thoại cho ggplot cực (với một tùy chỉnh)

data <- structure(list(Indicator = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L, 6L, 6L, 6L, 6L, 4L, 4L, 5L, 5L, 1L, 1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 6L, 6L, 6L, 6L, 4L, 4L, 5L, 5L, 1L, 1L, 1L, 2L, 
2L, 2L, 3L, 3L, 3L, 6L, 6L, 6L, 6L, 4L, 4L, 5L, 5L, 1L, 1L, 1L, 
2L, 2L, 2L, 3L, 3L, 3L, 6L, 6L, 6L, 6L, 4L, 4L, 5L, 5L, 1L, 1L, 
1L, 2L, 2L, 2L, 3L, 3L, 3L, 6L, 6L, 6L, 6L, 4L, 4L, 5L, 5L), .Label = c("Causality", 
"Climatechangeriskperceptions", "Currentadaptationoptions", "Fishingasalivelihoodactivity", 
"Governance", "Roleofshadowstateactors"), class = "factor"), 
    Village = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
    5L), .Label = c("Andra", "lahapau", "Pelipowai", "Ponam", 
    "Tulu"), class = "factor"), Variables = structure(c(13L, 
    3L, 10L, 11L, 12L, 16L, 5L, 8L, 1L, 2L, 15L, 17L, 6L, 14L, 
    9L, 4L, 7L, 13L, 3L, 10L, 11L, 12L, 16L, 5L, 8L, 1L, 2L, 
    15L, 17L, 6L, 14L, 9L, 4L, 7L, 13L, 3L, 10L, 11L, 12L, 16L, 
    5L, 8L, 1L, 2L, 15L, 17L, 6L, 14L, 9L, 4L, 7L, 13L, 3L, 10L, 
    11L, 12L, 16L, 5L, 8L, 1L, 2L, 15L, 17L, 6L, 14L, 9L, 4L, 
    7L, 13L, 3L, 10L, 11L, 12L, 16L, 5L, 8L, 1L, 2L, 15L, 17L, 
    6L, 14L, 9L, 4L, 7L), .Label = c("alternativelivelihood", 
    "anyactorsinvolvedinsustainability", "Attributionfactors", 
    "discusswithelectedleaders", "Effortsdirectedtoreducerisks", 
    "fishercommunityinfluence", "Infrastructureeffectiveness", 
    "multiplicityofactors", "Occupationforchildren", "Reversibility", 
    "Riskasamajorconsideration", "Riskbeingaddressed", "Statusoffisheries", 
    "Timefishing", "Whatwasdone", "Whoisatrisk", "whowasinvolved?" 
    ), class = "factor"), legend.var = structure(c(1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
    17L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
    14L, 15L, 16L, 17L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 
    11L, 12L, 13L, 14L, 15L, 16L, 17L, 1L, 2L, 3L, 4L, 5L, 6L, 
    7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 1L, 2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
    16L, 17L), .Label = c("a", "b", "c", "d", "e", "f", "g", 
    "h", "i", "j", "k", "l", "m", "n", "o", "p", "q"), class = "factor"), 
    score = c(1, 0.97, 1, 0.76, 0.794, 1, 0.71, 0.9, 0.5, 1, 
    1, 1, 1, 0.49, 0.72, 1, 0.7, 1, 1, 0, 0.67, 0.5, 1, 0.2, 
    1, 1, 0.7, 0.4, 0.5, 0.3, 0.67, 0.5, 0.7, 0.8, 1, 0, 0.46, 
    0.56, 0.375, 1, 0.13, 0.3, 0.5, 0.3, 0.3, 0.4, 0.6, 1, 1, 
    0.7, 0.8, 1, 0.86, 0.69, 0.51, 0.429, 1, 0.44, 0.3, 0.5, 
    0.6, 0.6, 0.7, 0.8, 0.4, 0.79, 0.8, 1, 1, 0.82, 0.85, 0.25, 
    0.226, 1, 0.18, 0.1, 1, 0.7, 0.3, 0.6, 0.3, 0.48, 0.16, 0.4, 
    0.8)), .Names = c("Indicator", "Village", "Variables", "legend.var", 
"score"), class = "data.frame", row.names = c(NA, -85L)) 

Tôi đã thực hiện âm mưu cực như sau:

library(ggplot2) 
ggplot(data, aes(x = legend.var, y = score, fill = Indicator), color='black') + 
    geom_bar(width = 1, alpha=0.5, stat="identity") + 
    scale_y_continuous() + 
    coord_polar() + 
    theme(axis.ticks = element_blank()) + 
    facet_wrap(~Village, nrow=2, ncol=3) + 
    guides(colour = guide_legend(title.hjust = 0.5)) 

enter image description here

Như bạn có thể thấy trong dữ liệu, cột legend.var được nhóm theo cột indicator. Tôi muốn chèn một bảng hoặc một chú giải thứ hai liên kết từng chỉ báo với cột legend.varvariables. Lý tưởng nhất nếu điều này được chèn vào như một huyền thoại thứ hai, các mục duy nhất bao gồm trong cột legend.var sẽ có cùng màu tô như chỉ báo tương ứng. Chú thích điền được dựa trên cột indicator. Bảng được chèn/chú giải thêm sẽ bao gồm các cột legend.var với một bảng chữ cái và cột duy nhất variables với ý nghĩa của bảng chữ cái tương ứng. Sau đó, những màu này có thể có cùng màu tô như tương ứng indicator. Tôi hy vọng điều này là rõ ràng.

+2

Tôi đã chỉnh sửa mã của bạn để chạy mà không có cảnh báo với phiên bản ggplot2 hiện tại. Tuy nhiên, tôi không hiểu mục tiêu của bạn. Bạn có thể cung cấp mô hình không? – Roland

+1

@ Roland Tôi nghĩ rằng những gì OP muốn là cung cấp một bảng tra cứu cho các chữ cái. Anh ta vẽ các chữ cái trên trục x của cốt truyện vì tên quá dài. Bây giờ anh ta muốn một bảng có chữ cái và tên đầy đủ như được cung cấp trong 'Biến '. – nograpes

Trả lời

4

Đây là một giải pháp sử dụng một gtable:

library(ggplot2) 
p <- ggplot(data, aes(x = legend.var, y = score, fill = Indicator), color='black') + 
    geom_bar(width = 1, alpha=0.5, stat="identity") + 
    scale_y_continuous() + 
    coord_polar() + 
    theme(axis.ticks = element_blank()) + 
    facet_wrap(~Village, nrow=2, ncol=3) + 
    guides(colour = guide_legend(title.hjust = 0.5)) + 
    theme(legend.position=c(0.85,0.25)) 

#create table 
library(gridExtra) 
tab <- tableGrob(unique(data[, c("legend.var", "Variables")]), 
       show.rownames=FALSE, gpar.coretext=gpar(fontsize=10), 
       gpar.coltext=gpar(fontsize=10, fontface='bold'), 
       gpar.corefill = gpar(fill = "grey90", col = "white"), 
       gpar.colfill = gpar(fill = "grey80", col = "white")) 

#arrange grobs 
library(gtable) 
a <- gtable(unit(c(0.7, 0.3) ,c("npc")), unit(1, "npc")) 
a <- gtable_add_grob(a, ggplotGrob(p),1,1) 
a <- gtable_add_grob(a, tab,1,2) 

#plot 
grid.draw(a) 

enter image description here

+1

Giải pháp tốt đẹp! +1 – Henrik

4

Để bắt đầu, bạn có thể thử một cái gì đó như thế này. Bạn cần phải điều chỉnh sắp xếp và bố trí theo sở thích của riêng bạn.

library(ggplot2) 
library(gridExtra) 

gg <- ggplot(data, aes(x = legend.var, y = score, fill = Indicator), color='black') + 
    geom_bar(width = 1, alpha=0.5, stat="identity") + 
    coord_polar() + 
    theme(axis.ticks = element_blank()) + 
    facet_wrap(~Village, nrow=2, ncol = 3) 

# create a table that translates legend.var to Variables 
tbl <- unique(data[ , c("legend.var", "Variables")]) 

# create a table grob 
tt <- tableGrob(d = tbl, 
       col.just = "left", 
       gpar.coretext = gpar(col = "black", cex = 0.5), 
       gpar.coltext = gpar(col = "black", cex = 0.5, fontface = "bold"), 
       gpar.rowtext = gpar(col = "black", cex = 0.5, fontface = "italic")) 

# arrange plot and table grob 
grid.arrange(gg, tt, ncol = 2) 

cập nhật với một cách nhanh chóng và dơ bẩn ggplot chỉ thay thế

# create labels 
labs <- with(tbl, paste(legend.var, Variables)) 

gg <- ggplot(data, aes(x = legend.var, y = score, fill = Indicator, col = Variables)) + 
    geom_bar(width = 1, alpha = 0.5, stat = "identity") + 
    coord_polar() + 
    theme(axis.ticks = element_blank()) + 
    facet_wrap(~ Village, nrow = 2, ncol = 3) + 
    scale_color_grey(labels = labs, start = 0.8, end = 0.9) 

gg 

enter image description here

+1

Điều này làm việc ... nhưng có cách nào "kinh điển" 'ggplot' để làm điều này? Có cách nào để có được 'scale_x_discrete' để có một" hướng dẫn "mà bạn có thể đưa ra các nhãn thay thế? – nograpes

+0

@nograpes, điểm tốt! Tôi đặt cược có một cách ggplot chỉ. Tôi đã suy nghĩ theo lộ trình đó nhưng bị kẹt ... – Henrik

+0

@nograpes Tôi không nghĩ thế. Và tôi không chắc chắn tôi có thể làm theo các khái niệm về một hướng dẫn cho 'scale_x_discrete'. – Roland

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