2016-03-03 25 views
1

我正在使用ggplot2來創建散點圖,我想要一個尺寸審美映射到geom_point()geom_text()幾何,但使用不同的連續變量來規定該尺寸。ggplot2 - 文本和點Geoms的尺寸美學

有一個couple問題similar這個,但他們都不是我正在問。我想在兩種不同的幾何體上使用相同的美學,而不是在同一個幾何體上的美學。我希望有一個標記散點圖,點的大小和文本的大小映射到不同的連續變量。我不需要文本映射來創建圖例。以下是我的嘗試。

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)) 

enter image description here

正如你所看到的,第二審美是唯一的一個,使得它到圖形,但它似乎像兩個傳說都在彼此的頂部繪製。這是可以做到的嗎?

回答

2

geom_point你想要qsec映射到size;在geom_text中,您希望wt映射到sizeggplot2不允許兩種不同大小的映射。但有一點魔力,你可以得到你想要的結果。創建兩個情節:一個與點;第二個是文字。但對於文字情節,請確保背景是透明的,網格線是空白的。

然後使用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) 

enter image description here