我正在使用ggplot2
制作散点图,我希望将大小美学映射到geom_point()
和geom_text()
geoms,但使用不同的连续变量来指示尺寸。
这个问题couple similar,但它们都不是我所要求的。我想在两个不同的geom上使用相同的美学,而不是在同一个geom上使用相同的美学。我想有一个标记的散点图,其中点的大小和文本的大小映射到不同的连续变量。我不需要文本映射来创建图例。以下是我的尝试。
library(ggplot2)
ggplot(data = mtcars) +
geom_point(aes(x = hp, y = mpg, size = qsec)) +
geom_text(aes(x = hp, y = mpg,
label = row.names(mtcars), size = wt))
正如你所看到的,第二种美学是唯一一种使它成为图形的美学,但似乎两种图例都是相互叠加的。这是可以做到的吗?
答案 0 :(得分:3)
geom_point
qsec
size
映射到geom_text
;在wt
中,您希望size
映射到ggplot2
。 gtable
不允许两种不同大小的映射。但是通过一点gtable
魔法,你可以得到你想要的结果。创建两个图:一个带点;第二个是文字。但是对于文本图,请确保背景是透明的,并且网格线是空白的。
然后使用library(ggplot2)
library(gtable)
library(grid)
p1 = ggplot(data = mtcars) +
geom_point(aes(x = hp, y = mpg, size = qsec))
p2 = ggplot(data = mtcars) +
geom_text(aes(x = hp, y = mpg,
label = row.names(mtcars), size = wt))
p2 = p2 +
theme(panel.background = element_rect(fill = "transparent", colour = NA),
panel.grid = element_blank())
gA = ggplotGrob(p1)
gB = ggplotGrob(p2)
gB = gtable_filter(gB, "panel") # grab the plot panel from gb
# Get the positions of the panel in gA in the layout: t = top, l = left, ...
pos <-c(subset(gA$layout, grepl("panel", gA$layout$name), select = t:r))
gC = gtable_add_grob(gA, gB, t = pos$t, l = pos$l) # overlay gB's panel into panel slot in gA
grid.newpage()
grid.draw(gC)
,从第二个文本图中抓取绘图面板,并插入第一个绘图中的绘图面板插槽。
{{1}}