【问题标题】:Display y-axis for each subplot when faceting分面时显示每个子图的 y 轴
【发布时间】:2014-02-24 12:30:13
【问题描述】:

我正在使用 facet_grid 绘制三个相邻的图。

Facet grid 只会为第一个绘图绘制 y 轴。有没有办法为所有三个图绘制 y 轴?

这是一个可重现的例子:

require(ggplot2)
require(reshape)
require(grid)
a<-rnorm(100)
b<-runif(100)
c<-rpois(100,lambda=2)

abc<-cbind(a,b,c)
colnames(abc)<-c("a","b","c")
abc<-melt(abc,id.vars=1:1)
colnames(abc)<-c("c","variable","value")
d<-rep(c("a","b","c"),each=100)
abc<-cbind(d,abc)
colnames(abc)<-c("cond","c","variable","value")
plot1<-ggplot(abc,aes(x=c,y=value,colour=variable,size=variable))+geom_point()+theme(legend.position="right")+facet_grid(~cond)+theme_bw()+theme(axis.text=element_text(size=8),
          axis.title=element_text(size=8),
          text = element_text(size=14),
          axis.line = element_line(size=0.25),
          axis.ticks=element_line(size=0.25),
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(),
          panel.border = element_blank(),
          panel.background = element_blank(),
          legend.position="none" ,
          legend.direction="vertical", 
          legend.title=element_blank(),
          legend.text=element_text(size=8), 
          plot.margin=unit(c(0,0.3,0,0),"cm"),
          legend.background=element_blank(), 
          legend.key=element_blank())

【问题讨论】:

  • 我不太清楚你在追求什么,但你可以单独绘制每个图形,然后使用 gridExtra::grid.arrange 将它们组合在一起。
  • 是的,但是由于第一个图有一个 y 轴标题,而另一个没有,第一个图将被压缩以保持与其他三个图相同的空间量。
  • dl.dropboxusercontent.com/u/22681355/Rplot.pdf 这是当前情节的样子。我想为所有四个图绘制 y 轴
  • 重新访问这个...“我不太清楚你在追求什么,但你可以单独绘制每个图形并使用 gridExtra::grid.arrange 将它们组合在一起”(Luštrik,R, 2014)。请参阅theme 执行删除标签和轴标题的添加步骤。
  • 正如我之前所说,如果我使用 grid.arrange ,则图的大小将不相等。原因是 plot1 有一个 y 轴,而其余的则没有,因为 grid.arrange 为每个图分配了相等的空间,所以 plot1 看起来会更小!对于您的第二条评论:我已经在使用 theme() 但我只能为情节指定 1 个 theme() 而不是为我使用 facet_grid() 的每个情节指定。

标签: r ggplot2


【解决方案1】:

您可以复制(部分)y 轴并为每个面板放置副本,

g <- ggplotGrob(plot1)

require(gtable)
axis <- gtable_filter(g, "axis-l")[["grobs"]][[1]][["children"]][["axis"]][,2]
segment <- segmentsGrob(1,0,1,1)
panels <- subset(g$layout, name == "panel")
g <- gtable_add_grob(g, grobs=list(axis, axis), name="ticks",
                     t = unique(panels$t), l=tail(panels$l, -1)-1)

g <- gtable_add_grob(g, grobs=list(segmentsGrob(1,0,1,1), 
                                   segmentsGrob(1,0,1,1)), 
                     t = unique(panels$t), l=tail(panels$l, -1)-1, 
                     name="segments")
grid.newpage()
grid.draw(g)

【讨论】:

  • 我收到此错误:gtable_add_grob 中的错误(g,grobs = list(axis,axis),name =“ticks”,:并非所有输入的长度都为 1 或与“grobs”相同的长度,
  • 知道为什么我会得到这个吗?
  • 我不知道你在说什么。什么编辑? “这”是什么?
  • 我使用您的代码从 grob 中提取 y 轴,但我收到了我在第一条评论中粘贴的错误。问题是,为什么我会收到这个错误? (昨天我编辑了主要问题以插入 ggplotGrob() 的输出,但有人删除了它)
  • 对我来说很好,我不知道是什么导致了问题
猜你喜欢
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2018-10-07
  • 2023-03-03
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多