更新scale_area
已棄用;改用scale_size
。 gtable
函數gtable_filter()
用於提取圖例。修改後的代碼用於替換其中一個圖例中的默認圖例關鍵字。
如果你仍然在尋找你的問題的答案,這裏似乎是你想要的大部分,儘管這是一個地方的黑客。圖例中的符號可以使用kohske's comment here
難度試圖應用兩種不同大小的映射。所以,我在美學聲明中留下了點尺寸映射,但是從美學聲明中刪除了標籤尺寸映射。這意味着標籤大小必須根據samplesize(fsamplesize)的因子版本的離散值進行設置。得到的圖表幾乎是正確的,但標籤大小的圖例(即樣本大小)未繪製。爲了解決這個問題,我繪製了一個圖表,其中包含根據樣本大小因子版本(但忽略點大小映射)的標籤大小映射,以便提取其圖例,然後可以將其插入到第一個圖表中。
## Your data
ib<- data.frame(
category = factor(c("Cat1","Cat2","Cat1", "Cat1", "Cat2","Cat1","Cat1", "Cat2","Cat2")),
city = c("CITY1","CITY1","CITY2","CITY3", "CITY3","CITY4","CITY5", "CITY6","CITY7"),
median = c(1.3560, 2.4830, 0.7230, 0.8100, 3.1480, 1.9640, 0.6185, 1.2205, 2.4000),
samplesize = c(851, 1794, 47, 189, 185, 9, 94, 16, 65)
)
## Load packages
library(ggplot2)
library(gridExtra)
library(gtable)
library(grid)
## Obtain the factor version of samplesize.
ib$fsamplesize = cut(ib$samplesize, breaks = c(0, 100, 1000, Inf))
## Obtain plot with dot size mapped to median, the label inside the dot set
## to samplesize, and the size of the label set to the discrete levels of the factor
## version of samplesize. Here, I've selected three sizes for the labels (3, 6 and 10)
## corresponding to samplesizes of 0-100, 100-1000, >1000. The sizes of the labels are
## set using three call to geom_text - one for each size.
p <- ggplot(data=ib, aes(x=city, y=category)) +
geom_point(aes(size = median, colour = category), alpha = .6) +
scale_size("Median", range=c(0, 15)) +
scale_colour_hue(guide = "none") + theme_bw()
p1 <- p +
geom_text(aes(label = ifelse(samplesize > 1000, samplesize, "")),
size = 10, color = "black", alpha = 0.6) +
geom_text(aes(label = ifelse(samplesize < 100, samplesize, "")),
size = 3, color = "black", alpha = 0.6) +
geom_text(aes(label = ifelse(samplesize > 100 & samplesize < 1000, samplesize, "")),
size = 6, color = "black", alpha = 0.6)
## Extracxt the legend from p1 using functions from the gridExtra package
g1 = ggplotGrob(p1)
leg1 = gtable_filter(g1, "guide-box")
## Keep p1 but dump its legend
p1 = p1 + theme(legend.position = "none")
## Get second legend - size of the label.
## Draw a dummy plot, using fsamplesize as a size aesthetic. Note that the label sizes are
## set to 3, 6, and 10, matching the sizes of the labels in p1.
dummy.plot = ggplot(data = ib, aes(x = city, y = category, label = samplesize)) +
geom_point(aes(size = fsamplesize), colour = NA) +
geom_text(show.legend = FALSE) + theme_bw() +
guides(size = guide_legend(override.aes = list(colour = "black", shape = utf8ToInt("N")))) +
scale_size_manual("Sample Size", values = c(3, 6, 10),
breaks = levels(ib$fsamplesize), labels = c("< 100", "100 - 1000", "> 1000"))
## Get the legend from dummy.plot using functions from the gridExtra package
g2 = ggplotGrob(dummy.plot)
leg2 = gtable_filter(g2, "guide-box")
## Arrange the three components (p1, leg1, leg2) using functions from the gridExtra package
## The two legends are arranged using the inner arrangeGrob function. The resulting
## chart is then arranged with p1 in the outer arrrangeGrob function.
ib.plot = arrangeGrob(p1, arrangeGrob(leg1, leg2, nrow = 2), ncol = 2,
widths = unit(c(9, 2), c("null", "null")))
## Draw the graph
grid.newpage()
grid.draw(ib.plot)
我認爲挑戰將是嘗試應用兩種不同大小的映射。請參閱@ joran的評論[這裏](http://stackoverflow.com/questions/10359963/edits-in-a-ggplot2-geom-line)和解決方案(指不同的顏色映射)。但我不明白這種解決方案如何輕鬆應用於您的問題。 – 2012-04-28 22:38:47
根據[kohske的評論](http://stackoverflow.com/questions/10405823/changing-the-symbol-in-the-legend-key-in-ggplot2),我改變了情節,繪製情況「N」而不是小寫「a」。 – 2012-05-02 02:55:19