将图例颜色方块插入r ggplot轴标签

时间:2017-11-20 20:38:27

标签: r ggplot2

我找到了许多关于如何在R中的ggplot中将特殊字符和希腊字母插入轴标签的文档,但没有将文档颜色粘贴到轴标签中的内容。我正在创建一个稍微复杂的x轴图形,并且协作者建议在轴标签文本中使用彩色正方形(与图例相同)格式化轴,以便读者可以参考哪个轴标签指哪个数据系列。

这是图传奇目前的样子:

[ORANGE SQUARE]系列1

[BLUE SQUARE]系列2

这就是我想要的x轴标签:

以km为单位的范围[ORANGE SQUARE]或km / yr [BLUE SQUARE]

是否可以在R中进行这种图形处理,还是需要在其他图像处理软件中创建这种标签?这是我正在使用的绘图代码,带有一些假数据:

SERIES1 <- as.data.frame(sample(1:100, 100, replace=TRUE)) %>% mutate(source="SERIES1") 
SERIES2 <- as.data.frame(sample(1:1000, 100, replace=TRUE)) %>% mutate(source="SERIES2")
SERIES3 <- as.data.frame(sample(1:10000, 100, replace=TRUE)) %>% mutate(source="SERIES3")
colnames(SERIES1) <- c("value","source")
colnames(SERIES2) <- c("value","source")
colnames(SERIES3) <- c("value","source")
gg_df <- rbind(SERIES1, SERIES2, SERIES3)

fig1A <- ggplot(gg_df) + 
  geom_density(alpha=0.5, size=0.2, aes(x=value, y=..scaled.., fill=factor(source, labels=c('SERIES1','SERIES2','SERIES3')))) + 
  scale_x_continuous(limits=c(0,16000), breaks=c(seq(0, 16000, by=2000))) + 
  labs(x='Extent (km) or (km/dec)',y='Density') +
  theme_bw() +
  theme(legend.position=c(0.8, 0.85), legend.title=element_blank()) + 
  scale_fill_brewer(type='qual',palette='Dark2')

1 个答案:

答案 0 :(得分:1)

cowplot包具有很好的功能,可以在ggplots上进行注释

require(cowplot)

首先,在x标签上添加空格,为正方形腾出空间

fig1A <- ggplot(gg_df) + 
  geom_density(alpha=0.5, size=0.2, aes(x=value, y=..scaled..,
        fill=factor(source, labels=c('SERIES1','SERIES2','SERIES3')))) + 
  scale_x_continuous(limits=c(0,16000), breaks=c(seq(0, 16000, by=2000))) + 
  labs(x='Extent (km)     or (km/dec)     ',y='Density') + 
  theme_bw() +
  theme(legend.position=c(0.8, 0.85), legend.title=element_blank()) + 
  scale_fill_brewer(type='qual',palette='Dark2')

制作包含正方形的x和y位置的数据框

squares <- data.frame(x = c(0.53, 0.75),  y = c(0.017,0.017))

使用牛皮图中的ggdraw函数绘制图形,然后在其上面注释方块。与ggplot中的annotategeom_rect不同,它只允许在绘图区域内进行注释,您可以使用牛皮图注释图形中的任何位置。您的方块的位置使用0 - 1比例给出,在您的图上从左到右,从下到上 - 您可能需要根据保存图形的大小来调整数字。

ggdraw(fig1A) + 
geom_rect(data = squares, aes(xmin = x, xmax = x + .02, 
                          ymin = y, ymax = y + .02),
        fill = c("orange", "blue"))

resulting plot