对齐ggplot多个多面图和自定义字体

时间:2015-05-26 12:49:12

标签: r ggplot2 facet

我得到的一些数据分为三个子类别(A,B和C)。我已经使用ggplot的facet_wrap函数来绘制这些子类别,到目前为止一切都很好。

但是,每个A的子类别不重叠。当使用不同的线条类型或颜色绘制不同的类别时,很难找出它们之间的区别(特别是示例中的B6和B8)。

Code I迄今为止,(原谅半熟人的名字,它是半敏感的)基本负载:

library('ggplot2')
library('extrafonts')
loadfonts()
all_d <- read.table(url('http://pastebin.com/raw.php?i=WArS8GZM'), header=TRUE)

所以,这就是我对平面情节的看法:

ggplot(all_d, aes(x=Q, y=T, linetype=B)) +
  stat_summary(fun.y=median, geom="line") +
  facet_wrap(A~M, scales='free', ncol=2)

这导致下面的情节,因为你可以看到线条并没有真正区分得太好。 enter image description here

要解决这个问题,我发现的唯一解决方案是将它们分开绘制,因为ggplot不会处理重新启动线型(?)

现在来了&#34;有趣&#34;部分。轴具有不同的刻度,并且图例具有不同的长度,因此排列图像成为至少可以说的问题。经过一番修剪和整理:

g_legend <- function(a.gplot){ 
  tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
  return(tmp$grobs[[leg]])
}    

get_plot <- function(data, C) {
  data <- data[which(data$M == C),]
  p <- ggplot(data, aes(x=Q, y=T, linetype=B)) + 
    theme(legend.position='bottom') +
    stat_summary(fun.y=median, geom="line") +
    labs(x='Q', y='T')
  p
}

a1 <- all_d[which(all_d$A == 'A1'),]
a2 <- all_d[which(all_d$A == 'A2'),]
a3 <- all_d[which(all_d$A == 'A3'),]

plots <- list(get_plot(a1, 'C1'), get_plot(a1, 'C2'), 
          get_plot(a2, 'C1'), get_plot(a2, 'C2'),
          get_plot(a3, 'C1'), get_plot(a3, 'C2'))
grobs <- list()
widths <- list()
legend <- list()

for (i in 1:length(plots)){
  legend[[i]] <- g_legend(plots[[i]])
  grobs[[i]] <- ggplotGrob(plots[[i]] + theme(legend.position='none'))
  widths[[i]] <- grobs[[i]]$widths[2:5]
}
maxwidth <- do.call(grid::unit.pmax, widths)
for (i in 1:length(grobs)){
  grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
t <- gtable(widths=unit(c(1,1), "null"), heights=unit(rep(c(.5,6,.5), 3), "null"))
t <- gtable_add_grob(t, textGrob("A1"), 1, 1, 1, 2)
t <- gtable_add_grob(t, grobs[[1]], 2, 1)
t <- gtable_add_grob(t, grobs[[2]], 2, 2)
t <- gtable_add_grob(t, legend[[1]], 3, 1, 3, 2)
t <- gtable_add_grob(t, textGrob("A2"), 4, 1, 4, 2)
t <- gtable_add_grob(t, grobs[[3]], 5, 1)
t <- gtable_add_grob(t, grobs[[4]], 5, 2)
t <- gtable_add_grob(t, legend[[3]], 6, 1, 6, 2)
t <- gtable_add_grob(t, textGrob("A3"), 7, 1, 7, 2)
t <- gtable_add_grob(t, grobs[[5]], 8, 1)
t <- gtable_add_grob(t, grobs[[6]], 8, 2)
t <- gtable_add_grob(t, legend[[5]], 9, 1, 9, 2)

grid.newpage()
grid.draw(t)

这导致下面的情节,一切都排成一行,有相同的情节区域,传说至少,不是问题在底部。

enter image description here

然而,我想使用Computer Modern字体绘制这些图,以便它适合我的乳胶文档的其余部分。将+ theme_grey(base_family='CM Roman')添加到单独的图表会产生:

Error in grid.Call(L_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  polygon edge not found
In addition: Warning message:
In grid.Call(L_textBounds, as.graphicsAnnot(x$label), x$x, x$y,  :
  no font could be found for family "CM Roman"

但是从loadfonts()执行extrafonts表示已加载CM罗马字体。该字体是使用font_install('fontcm')

安装的

添加指定字体的相同主题适用于第一个刻面图。

0 个答案:

没有答案