2014-11-04 29 views
8

Tôi đang cố tạo một biểu đồ trục y kép bằng ggplot. Trước tiên hãy để tôi nói rằng tôi không tìm kiếm một cuộc thảo luận về giá trị của việc có hay không thực hành tốt để làm như vậy. Tôi thấy chúng đặc biệt hữu ích khi xem dữ liệu dựa trên thời gian để xác định xu hướng trong 2 biến riêng biệt. Một cuộc thảo luận thêm về điều này là phù hợp hơn với crossvalidated theo ý kiến ​​của tôi.cách hiển thị chú giải trên ggplot trục y kép

Kohske cung cấp ví dụ rất hay về cách thực hiện, mà tôi đã sử dụng để có hiệu quả tuyệt vời cho đến thời điểm này. Tuy nhiên tôi ở giới hạn của tôi để bao gồm một huyền thoại cho cả hai trục y. Tôi cũng đã thấy các câu hỏi tương tự herehere nhưng không có câu hỏi nào giải quyết vấn đề bao gồm cả truyền thuyết.

Tôi đã có ví dụ có thể sao chép bằng cách sử dụng tập dữ liệu kim cương từ ggplot.

liệu

library(ggplot2) 
library(gtable) 
library(grid) 
library(data.table) 
library(scales) 

grid.newpage() 

dt.diamonds <- as.data.table(diamonds) 

d1 <- dt.diamonds[,list(revenue = sum(price), 
         stones = length(price)), 
        by=clarity] 

setkey(d1, clarity) 

Charts

p1 <- ggplot(d1, aes(x=clarity,y=revenue, fill="#4B92DB")) + 
    geom_bar(stat="identity") + 
    labs(x="clarity", y="revenue") + 
    scale_fill_identity(name="", guide="legend", labels=c("Revenue")) + 
    scale_y_continuous(labels=dollar, expand=c(0,0)) + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1), 
     axis.text.y = element_text(colour="#4B92DB"), 
     legend.position="bottom") 

p2 <- ggplot(d1, aes(x=clarity, y=stones, colour="red")) + 
    geom_point(size=6) + 
    labs(x="", y="number of stones") + expand_limits(y=0) + 
    scale_y_continuous(labels=comma, expand=c(0,0)) + 
    scale_colour_manual(name = '',values =c("red","green"), labels = c("Number of Stones"))+ 
    theme(axis.text.y = element_text(colour = "red")) + 
    theme(panel.background = element_rect(fill = NA), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.border = element_rect(fill=NA,colour="grey50"), 
     legend.position="bottom") 

# extract gtable 
g1 <- ggplot_gtable(ggplot_build(p1)) 
g2 <- ggplot_gtable(ggplot_build(p2)) 


pp <- c(subset(g1$layout, name == "panel", se = t:r)) 
g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, 
        pp$l, pp$b, pp$l) 
# axis tweaks 
ia <- which(g2$layout$name == "axis-l") 
ga <- g2$grobs[[ia]] 
ax <- ga$children[[2]] 
ax$widths <- rev(ax$widths) 
ax$grobs <- rev(ax$grobs) 
ax$grobs[[1]]$x <- ax$grobs[[1]]$x - unit(1, "npc") + unit(0.15, "cm") 
g <- gtable_add_cols(g, g2$widths[g2$layout[ia, ]$l], length(g$widths) - 1) 
g <- gtable_add_grob(g, ax, pp$t, length(g$widths) - 1, pp$b) 
# draw it 
grid.draw(g) 

HỎI: Có ai có một số lời khuyên về cách để có được phần 2 của huyền thoại để hiển thị?

Sau đây là các biểu đồ được tạo theo thứ tự p1, p2, kết hợp p1 & p2, bạn sẽ nhận thấy rằng chú thích cho p2 không hiển thị trong biểu đồ kết hợp.

p1

p1

p2

p2

kết hợp p1 p2 &

combined p1 & p2

Trả lời

6

Tương tự như kỹ thuật bạn sử dụng ở trên, bạn có thể trích xuất chú thích, ràng buộc chúng và sau đó ghi đè chú thích cốt truyện với chúng.

Vì vậy, bắt đầu từ # draw it trong mã của bạn

# extract legend 
leg1 <- g1$grobs[[which(g1$layout$name == "guide-box")]] 
leg2 <- g2$grobs[[which(g2$layout$name == "guide-box")]] 

g$grobs[[which(g$layout$name == "guide-box")]] <- 
            gtable:::cbind_gtable(leg1, leg2, "first") 
grid.draw(g) 

enter image description here

+0

đó làm việc một điều trị tuyệt đối. Nếu tôi muốn mở rộng nó để đưa vào một chức năng như câu hỏi của tôi [ở đây] (http://stackoverflow.com/questions/26728852/create-function-to-ggplot-with-data-table) làm cách nào để buộc huyền thoại với màu sắc của tôi đặt bên ngoài 'aes'? hoặc luân phiên có thể chuyển một cột màu hoặc cột data.table thành 'aes_string' để đặt điền? – Dan

+0

Tôi đã tìm thấy một giải pháp hack cho bây giờ. Khi 'aes_string' dường như lấy chuỗi và chuyển đổi chúng thành tên biến, tôi đã thoát khỏi màu đỏ của tôi thành' "\" đỏ \ "" 'và có vẻ như nó hoạt động tốt. – Dan

+0

Bạn có vẻ khá quen thuộc với grob, tôi tự hỏi làm thế nào điều này có thể được mở rộng để cho phép các khía cạnh quá? Tôi có nên hỏi câu hỏi này như một câu hỏi mới không? – Dan

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