简体   繁体   English

在R中的刻面图上添加刻度线

[英]Add tick marks to facet plots in R

I wish to add tick marks to facet plots. 我希望在刻面图上添加刻度线。 For instance, to a facet plot like this: 例如,对于这样的方面图:

require(ggplot2)

p <- ggplot(mpg, aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl) +   
     theme(panel.margin.x=unit(1.2, "lines"),
     panel.margin.y=unit(1.2, "lines"))
p

在此输入图像描述

I wish to add tick marks so that it could look like this (please note that although tick marks are added to all facets, tick labels are displayed only at the left and bottom facets): 我希望添加刻度线,使其看起来像这样(请注意,虽然刻度标记添加到所有刻面,刻度标签仅显示在左侧和底部刻面):

在此输入图像描述

I've tried using the annotation_custom function to add line grobs to the axis. 我已经尝试使用annotation_custom函数向轴添加行凹凸。 However my attempts are not working. 但是我的尝试不起作用。

require(gridExtra)
require(grid)   
x.breaks = rep(2:7)
y.breaks = c(20,30,40)

for (i in 1:length(x.breaks))   {
  p = p + annotation_custom(grob = linesGrob(y = unit(c(0, 5), "npc"),
                       gp=gpar(col= "black")),  
                       xmin = x.breaks[i], 
                       xmax = x.breaks[i], 
                       ymin = 8.69, 
                       ymax = 8.89)
  }

for (i in 1:length(y.breaks))   {
  p = p + annotation_custom(grob = linesGrob(x = unit(c(0, 5), "npc"),
                       gp=gpar(col= "black")),  
                       xmin = 0.769,
                       xmax = 0.809,                           
                       ymin = y.breaks[i], 
                       ymax = y.breaks[i])
  }

gt = ggplotGrob(p)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid.draw(gt)

Does anyone have any suggestion? 有没有人有任何建议? Thanks in advance. 提前致谢。

Here's a low-level way of axing the numbers, 这是一种削减数字的低级方法,

p <- ggplot(mpg, aes(displ, hwy)) + 
  geom_point() + 
  theme_bw() +
  geom_hline(yintercept=10, linetype="solid") +
  geom_vline(xintercept=1.0, linetype="solid") +
  scale_x_continuous(limits=c(1,8), expand =c(0,0), 
                     breaks = rep(2:7)) +
  scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
                     breaks = c(20,30,40)) +
  facet_wrap(~cyl, scales="free") 

g <- ggplotGrob(p)
g$grobs$axis_b1$children[[2]][["grobs"]][[2]] <- nullGrob()
g$grobs$axis_b2$children[[2]][["grobs"]][[2]] <- nullGrob()
grid.newpage()
grid.draw(g)

在此输入图像描述

one could also remove the corresponding space in the gtable. 也可以删除gtable中的相应空格。

Here is a solution using grid.arrange function and grid package : 这是使用grid.arrange函数和grid包的解决方案:

在此输入图像描述

p_top = ggplot(subset(mpg, cyl %in% c(4,5)), aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl, ncol = 2) +
     theme(axis.ticks.x = element_line(), axis.text.x = element_blank()) + 
     labs(x=NULL, y = NULL)

p_bot = ggplot(subset(mpg, cyl %in% c(6,8)), aes(displ, hwy)) + 
     geom_point() + 
     theme_minimal() +
     geom_hline(yintercept=10, linetype="solid") +
     geom_vline(xintercept=1.0, linetype="solid") +
     scale_x_continuous(limits=c(1,8), expand =c(0,0), 
     breaks = rep(2:7)) +
     scale_y_continuous(limits = c(10, 50), expand = c(0,0), 
     breaks = c(20,30,40)) +
     facet_wrap(~cyl, ncol = 2) +
     theme(axis.ticks.x = element_line()) + 
     labs(y = NULL)

library(grid)
grid.arrange(p_top, p_bot, left = textGrob("hwy", rot = 90, vjust = 1))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM