ggtern 禁用了 ggplot2 的一些主题

ggtern disables some themes from ggplot2

尝试将主题切换为 theme_bw() 无效,theme_grey() 似乎优先。有什么想法吗?

ggplot(data=mpg,aes(y=year,x=cyl)) + geom_point() + theme_bw()

编辑:

正如评论中所建议的,这在 运行 干净的 R 会话中有效。但是当我在加载了 ggtern 的会话中实现代码时,问题就出现了。

library(ggplot2)
#Warning message:
#package ‘ggplot2’ was built under R version 3.2.5 
ggplot(data=mpg,aes(y=year,x=cyl)) + geom_point() + theme_bw()

# sessionInfo()
# R version 3.2.2 (2015-08-14)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 8 x64 (build 9200)
# 
# locale:
#   [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
# [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
# [5] LC_TIME=English_United States.1252    
# 
# attached base packages:
#   [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
#   [1] ggplot2_2.1.0
# 
# loaded via a namespace (and not attached):
#   [1] labeling_0.3     colorspace_1.2-6 scales_0.4.0     plyr_1.8.3       tools_3.2.2      gtable_0.1.2    
# [7] Rcpp_0.12.2      grid_3.2.2       munsell_0.4.2 

library(ggtern)
#Loading required package: ggplot2

#Attaching package: ‘ggtern’

#The following objects are masked from ‘package:ggplot2’:

    #aes, calc_element, ggplot, ggplot_build, ggplot_gtable, ggplotGrob, ggsave, is.ggplot, layer_data,
    #layer_grob, layer_scales, theme, theme_bw, theme_classic, theme_dark, theme_get, theme_gray,
    #theme_light, theme_linedraw, theme_minimal, theme_set, theme_void

#Warning messages:
#1: package ‘ggtern’ was built under R version 3.2.5 
#2: package ‘ggplot2’ was built under R version 3.2.5 
ggplot(data=mpg,aes(y=year,x=cyl)) + geom_point() + theme_bw()

# sessionInfo()
# R version 3.2.2 (2015-08-14)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 8 x64 (build 9200)
# 
# locale:
#   [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
# [3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
# [5] LC_TIME=English_United States.1252    
# 
# attached base packages:
#   [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
#   [1] ggtern_2.1.1  ggplot2_2.1.0
# 
# loaded via a namespace (and not attached):
#   [1] Rcpp_0.12.2         lattice_0.20-33     MASS_7.3-45         grid_3.2.2          plyr_1.8.3         
# [6] bayesm_3.0-2        gtable_0.1.2        magrittr_1.5        scales_0.4.0        stringi_1.0-1      
# [11] compositions_1.40-1 robustbase_0.92-5   latex2exp_0.4.0     boot_1.3-17         labeling_0.3       
# [16] proto_0.3-10        tools_3.2.2         stringr_1.0.0       energy_1.6.2        DEoptimR_1.0-4     
# [21] munsell_0.4.2       colorspace_1.2-6    tensorA_0.36        gridExtra_2.0.0    

看起来 ggtern 掩盖了 ggplot2 的很多主题。

我通过分离 ggtern 解决了我的问题。

detach("package:ggtern",unload=T)

ggtern 掩码 theme_bw(),这意味着 ggtern 有自己的 theme_bw() 版本,它覆盖了 ggplot2 版本。奇怪的是,ggterntheme_bw() 版本看起来像 theme_grey(),所以这可能是一个错误。

如果您想保持 ggtern 加载,另一种选择是强制执行 theme_bw()ggplot2 版本:

ggplot(data=mpg,aes(y=year,x=cyl)) + geom_point() + ggplot2::theme_bw()

不幸的是,您不能在加载 ggtern 之后只加载 ggplot2(以避免屏蔽问题),因为 ggtern 加载 ggplot2

要查看 theme_bw() 每个版本的代码差异,请在控制台中键入以下内容:

ggplot2::theme_bw

ggtern::theme_bw

更新: ggplot2ggtern 中的上述主题冲突发生在 ggtern 版本 2.1.2 和更早版本中,但是2.1.3版本不再出现冲突,所以你需要做的就是更新到最新版本ggtern。有关详细信息,请参阅@NicolasHamilton 的回答。

ggtern 掩码 EVERY 来自 ggplot2 的默认主题,这是因为在编写此软件时,已经创建了约 60 个新主题元素,这些元素按顺序存在使 ggtern 正确呈现。如需新主题元素的完整列表,运行以下命令:

library(ggtern)
?theme_elements

综上所述,正如您所指出的那样,由于 ggtern 还修改了一些基本主题元素,并且从大约版本 2.1.2 - 2.1.3 开始,我发现了一些冲突完全 re-worked 主题,以便 ggtern 不再修改任何基本元素 -- 希望这种烦人的行为现在已经永远消失了!

我正在制作关于这个包的出版物,并且已经提炼了很多很多long-tern烦恼,所以请从我的网站下载并安装最新版本(2.1.4) (Bitbucket Repository)。令人尴尬的是,即使是 CRAN 上的最后一个 2.1.3 版本,当 运行 在 grid.arrange 类型的情况下绘制两个图时,我也发现了一个非常重要的错误。这是剪贴蒙版的问题,已经解决 in 2.1.4 尚未发送到 CRAN,我计划立即进行。

无论如何,为了回答你的问题,请升级你的版本,你是 运行ning 版本 2.1.0,这是在 ggplot2 中进行巨大修改后不久发布的版本 - - 事实上,就在不久之前,之前的版本被严重破坏,几乎需要 ggtern 的整个 re-writing,所以拥有完美的主题是我最不优先考虑的事情。在最近的版本中,由于我有时间细化和识别问题,这种行为应该已经得到解决——由以下两 (2) 个命令 运行 证明(按此顺序,来自干净的 session ),除了标题明显不同外,应该会产生相同的结果:

library(ggplot2)
ggplot(data=mpg,aes(y=year,x=cyl)) + 
    geom_point() + theme_bw() + 
    labs(title='From ggplot2')

library(ggtern)
ggplot(data=mpg,aes(y=year,x=cyl)) + 
    geom_point() + theme_bw() + 
    labs(title='From ggtern')

如果我只能说,这可能看起来有点 off-topic,但整个问题实际上最初源于一件事,通过几度的分离。 ggplot2 的设计没有剪贴蒙版,它使用网格视口作为一个伪剪贴蒙版,因为它的所有绘图(极坐标变换除外)都在矩形区域上渲染。位于矩形区域之外的数据映射随后被视口丢弃。 ggtern 另一方面需要一个,因为它需要在位于 矩形 视口中的 三角形 形状的多边形区域中渲染 --众所周知,'三角形不适合方孔' 或者俗话说!当轴限制减少时,数据映射可以并且经常位于三角形区域之外,这些需要删除或屏蔽(或者如果用户愿意则显示)。删除不是一种选择,因为它会影响某些图,如多边形图、路径图、密度图或等高线图(我认为点几何可能是唯一不受潜在影响的几何图),这只剩下一个选项——剪贴蒙版的实现.在某些较早的版本中,未实现剪贴蒙版(有利于对数据进行子集化),因此需要修改基本主题元素。如果有的话,也许是最初的 'poor design',在许多代之后流传到令人沮丧的行为。