ggplot2::geom_text字体与图表其余部分一致

4
我使用下面的代码得到了以下图表:

enter image description here enter image description here enter image description here


注意:请勿删除HTML标记。
library(ggplot2)
library(ggthemes)

p <- ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) + 
     geom_point() +
     theme_igray()
p
p + geom_text(mapping = aes(label = rownames(mtcars)))

p + geom_text(mapping = aes(label = rownames(mtcars)), family = "Times New Roman")
geom_text的字体与图表其余部分的字体不同。我想知道如何使geom_text的字体与图表其余部分的字体相同。
sessionInfo()
R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.2 LTS

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggthemes_4.2.0 ggplot2_3.1.1 

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.1       rstudioapi_0.10  magrittr_1.5     tidyselect_0.2.5
 [5] munsell_0.5.0    colorspace_1.4-1 R6_2.4.0         rlang_0.3.4.9003
 [9] stringr_1.4.0    plyr_1.8.4       dplyr_0.8.1      tools_3.6.0     
[13] grid_3.6.0       gtable_0.3.0     withr_2.1.2      lazyeval_0.2.2  
[17] assertthat_0.2.1 tibble_2.1.1     crayon_1.3.4     purrr_0.3.2     
[21] vctrs_0.1.0.9003 zeallot_0.1.0    glue_1.3.1       labeling_0.3    
[25] stringi_1.4.3    compiler_3.6.0   pillar_1.4.0     scales_1.0.0    
[29] backports_1.1.4  pkgconfig_2.0.2 

1
geom_text()theme_bw()中分别设置family="serif"对我很有效,也许你应该添加更多关于你的会话sessionInfo()的信息,如果问题仍然存在。 - RLave
可能不是您所寻找的,但在绘制 ggplot 图之前调用 windows(family = "serif") 可以将所有文本设置为“serif”,但会在单独的窗口中显示。这可能与平台有关,我正在运行 Windows。 - RLave
2个回答

4

我不确定为什么你的图表中轴标签的字体与使用 geom_text 呼叫生成的字体不同。如果我运行你的代码,字体是相同的。

根据 Hadley Wickham 的「ggplot2: Elegant Graphics for Data Analysis」(第二版),只有三种字体可以保证在任何地方都能正常工作:「sans」、「serif」和「mono」(第 37 页)。

如果你使用以下代码,我认为你将获得与轴和 geom_text 相同的字体。

# solution for text family
### explicitely setting "family" twice
p <- ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) + 
  geom_point() +
  theme_igray(base_family = "sans")                                     ## <----

p + geom_text(mapping = aes(label = rownames(mtcars)), family = "sans") ## <----

在我的电脑上,这产生了以下图形:

enter image description here

我可以在图表的两种文本类型中的任何组合中切换“sans”、“serif”和“mono”字体。

请让我知道这是否对您有用。


感谢@KoenV的回答。我认为字体仍然不同。 - MYaseen208
@MYaseen208我更新了代码:将“family”设置为“sans”两次。希望这样可以工作。请运行代码并让我知道。 - KoenV
感谢 @KoenV 的努力。但是问题仍然存在。 - MYaseen208

3
这对您有用吗?我通过运行theme_igray%>%View()查看了主题参数,并发现基线文本大小和颜色为12pt黑色,但是axis.textgrey30,相对大小为0.8,即9.6pt。略微比黑色浅的颜色创建了与使用较轻字重的字体相似的外观,与全黑字体相比。
由于神秘原因,如此注明heregeom_text中的文本大小按比例缩放近0.353 [EDIT,请参见@zeehio的评论;它是25.4/72]与主题大小相比。有了颜色和大小,这些应该匹配。
library(ggplot2)
library(ggthemes)

p <- ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) + 
  geom_point() +
  theme_igray()
p
p + geom_text(mapping = aes(label = rownames(mtcars)),
              color = "gray30", size = 12 * 5/14 * 0.8)

在这里输入图片描述

这是另一个例子。在我的系统上(OSX 10.13,R 3.5.1),它们匹配,我通过在GIMP中使用“差异”过滤器来确认它们对齐。

base_size = 36
ggplot(data = mtcars, mapping = aes(x = wt, y = mpg)) + 
  annotate("text", x = 1, y = 5*3:6, label = 5*3:6,
           color = "gray30", size = 12 * 0.353 * 0.8) +
  annotate("text", x = 10, y = 5*3:6, label = 5*3:6,
           color = "gray30", size = 12 * 0.353 * 0.8) +
  theme_igray() +
  theme(panel.grid = element_blank())

enter image description here

enter image description here


感谢@JonSpring提供的出色答案和解释。您的代码提供了非常相似的字体,但仍然存在一些细微差别。无论如何还是非常感谢。 - MYaseen208
2
字体大小的奥秘在这里描述:https://dev59.com/wWQm5IYBdhLWcg3w0RtV#17312440。它不是5/14,而是25.4/72。 - zeehio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接