在轴标签ggplot2中混合字体样式

时间:2016-10-03 13:17:55

标签: r ggplot2

我想通过使一些文字加粗来设置ggplot2轴标签的样式。理想情况下我也想控制字体大小。一切皆有可能吗?以下是我想要做的例子:

qplot(x = x,  y = y, data = data.frame(x = rnorm(10), y = rnorm(10))) + 
labs(x = "14pt Bold text \n12pt normal text")

所以代替14pt Bold text我想要14pt粗体字体,而对于12pt普通文本我想要12pt普通文本。

我用谷歌搜索了一些例子,我发现的是改变所有标签外观的方法,或者使用plotmath表达式,奇怪的是对ggplot2没有任何影响,即做labs(x=expression("bold(Bold text)"))没有效果。

更新

一如既往,我试图提出一个过于普遍的问题。我想要实现的完整示例还涉及使用自定义字体。我使用的字体是AvenirNextLTPro,我想要的外观如下:

library(showtext)
library(ggplot2)

font.add("AvenirNextLTPro", 
         regular = "AvenirNextLTPro-Regular.otf", 
         bold="AvenirNextLTPro-Demi.otf",    
         italic = "AvenirNextLTPro-It.otf", 
         bolditalic = "AvenirNextLTPro-DemiIt.otf")
showtext.auto() 

ggplot(data = data.frame(x = rnorm(10), y = rnorm(10)), aes(x = x, y = y)) + 
    geom_point() + 
    labs(x = "14pt Bold text \n12pt normal text", 
         y = "14 pt Bold text\n\n 12pt\nnormal\ntext") + 
    theme(axis.title.y = element_text(angle = 0, hjust = 1, family = "AvenirNextLTPro"), axis.title.x = element_text(family = "AvenirNextLTPro"))

请注意,为此,您需要安装字体,即font.files()可见。对于Mac OS X,可以通过打开Font应用程序并添加下载的字体来实现。

2 个答案:

答案 0 :(得分:4)

皮埃尔的回答是一种非常好的方式,以更通用的方式处理这个问题。但是,使用新的caption plot / theme元素(安装ggp​​lot2的github版本,直到本月晚些时候发布)你可以快速破解,如果你想要的就是你所描述的

ggplot(data.frame(x=rnorm(10), y=rnorm(10))) +
  geom_point(aes(x, y)) +
  labs(x="14pt Bold text", caption="12pt normal text") +
  theme(axis.title.x=element_text(size=14, face="bold", hjust=0.5)) +
  theme(plot.caption=element_text(size=12, face="plain", hjust=0.5))

enter image description here

另外,请尽量避免使用qplot()的诱人捷径。我花了一些时间从绝大多数的例子中删除它,并且包裹作者本人不鼓励它的使用。

<强>更新

这是 gosh糟糕的黑客,但是......

ggplot(data.frame(x=rnorm(10), y=rnorm(10))) +
  geom_point(aes(x, y)) +
  labs(x="14pt Bold text", caption="12pt normal text") +
  theme(axis.title.x=element_text(size=14, face="bold", hjust=0.5)) +
  theme(plot.caption=element_text(size=12, face="plain", hjust=0.5)) -> gg

grid.arrange(gg, left=textGrob("Title", rot=90, hjust=-0.3,
                               gp=gpar(fontsize=14, fontface="bold")))

enter image description here

会在y轴上得到同样的东西。如果需要,您可以稍微修改一下间距,但毫无疑问,您需要为任何&#34;生产&#34; /发布图调整hjust

答案 1 :(得分:0)

根据@hrbmstr的建议,我提出的最终解决方案(接近某些调整)如下。

library(showtext)
library(ggplot2)
library(gridExtra)

font.add("AvenirNextLTPro", 
         regular = "AvenirNextLTPro-Regular.otf", 
         bold="AvenirNextLTPro-Demi.otf",    
         italic = "AvenirNextLTPro-It.otf", 
         bolditalic = "AvenirNextLTPro-DemiIt.otf")
showtext.auto() 

gg<-ggplot(data = data.frame(x = rnorm(10), y = rnorm(10)), aes(x = x, y = y)) + 
    geom_point()+
    theme(axis.title.y = element_blank(), axis.title.x = element_blank())

grid.newpage()
gt <- ggplot_gtable(ggplot_build(gg))

t1 <- textGrob("Left upper text",y=unit(0,"npc"),just="bottom",gp = gpar(fontsize=14,fontfamily="AvenirNextLTPro",fontface="bold.italic"))
t2 <- textGrob("Left lower text",y=unit(1,"npc"),just="top", gp = gpar(fontsize=12,fontfamily="AvenirNextLTPro",fontface="italic"))
b1 <- textGrob("Bottom upper text",y=unit(0,"npc"),just="bottom", gp = gpar(fontsize=14,fontfamily="AvenirNextLTPro",fontface="bold.italic"))
b2 <- textGrob("Bottom lower text",y=unit(1,"npc"),just="top", gp = gpar(fontsize=12,fontfamily="AvenirNextLTPro",fontface="italic"))

lay2 <- rbind(c(1,3),c(2,3),c(NA,4),c(NA,5))

grid.arrange(t1,t2,gt,b1,b2, layout_matrix = lay2, widths=unit(c(0.15,0.85),"npc"), heights=unit(c(0.9/2,0.9/2,0.1/2,0.1/2),"npc"))

enter image description here 它肯定不是一个最漂亮的黑客,但它允许相当大的灵活性,最重要的是在这种特殊情况下是足够的。