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ự here và here 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
p2
kết hợp p1 p2 &
đó 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
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
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