ggtern отключает некоторые темы из 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.

3 ответа

Решение

ggtern маскирует КАЖДУЮ тему по умолчанию от ggplot2, и это потому, что при написании этого программного обеспечения было создано около 60 новых элементов темы, которые существуют для того, чтобы ggtern сделать правильно. Чтобы получить полный список новых элементов темы, выполните следующую команду:

library(ggtern)
?theme_elements

Сказав выше, я знал о некоторых столкновениях, как вы определили, из-за ggtern также изменяет некоторые базовые элементы темы, а также о версии 2.1.2 - 2.1.3 Я полностью переработал темы так, чтобы ggtern больше не изменяет ни один из базовых элементов - надеюсь, это раздражающее поведение исчезло навсегда!

Я нахожусь в процессе подготовки публикации о пакете, и я уточняю многие многие долгосрочные неприятности, поэтому, пожалуйста, загрузите и установите самую последнюю версию (2.1.4) из моего ( хранилище битбакетов). Смущающе даже последнее 2.1.3 версия на CRAN, я обнаружил довольно значительную ошибку при запуске двух графиков в grid.arrange Тип ситуации. Это проблема с обтравочной маской, и что-то, что было решено in 2.1.4 пока что отправили в CRAN, что я планирую сделать в ближайшее время.

В любом случае, чтобы ответить на ваш вопрос, пожалуйста, обновите свою версию, вы используете версию 2.1.0, которая была выпущена вскоре после ОГРОМНОЙ редакции в ggplot2 - на самом деле, не так давно, предыдущие версии были настолько сильно сломаны, что требовало почти всего переписывания ggtern Поэтому идеальные темы были наименьшим из моих приоритетов. В последних версиях, поскольку у меня было время для уточнения и выявления проблем, это поведение должно было быть решено - продемонстрировано следующими двумя (2) командами (в этом порядке, из чистого сеанса), которые, за исключением Очевидная разница в названиях, должна давать одинаковые результаты:

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')

ggplot2version

ggternversion

Если я могу просто сказать, это может показаться немного не по теме, но на самом деле вся эта проблема изначально возникла из-за пары степеней отделения от одного. ggplot2 был спроектирован без обтравочных масок, он использует видовую область сетки как по существу псевдо обтравочную маску, потому что все ее графики (за исключением полярного преобразования) отображаются в прямоугольной области. Отображения данных, которые находятся за пределами прямоугольной области, впоследствии отбрасываются в окне просмотра. ggtern с другой стороны, он нужен, потому что он должен отображаться в многоугольной области треугольной формы, размещенной в прямоугольном окне просмотра - и, как всем известно, "треугольники не помещаются в квадратные отверстия" или, как говорится в поговорке! Когда пределы оси уменьшены, отображения данных могут и часто находятся вне треугольной области, и они должны быть либо удалены, либо замаскированы (или показаны, если пользователь этого пожелает). Удаление - это не вариант, так как это может повлиять на некоторые графики, такие как полигоны, пути, плотности или контурные графики (я думаю, что точечные геометрии - единственные, на которые это потенциально не влияет), что оставляет только один вариант - реализацию маски отсечения., В некоторых более ранних версиях маска отсечения не была реализована (в пользу поднабора данных), поэтому требовались модификации элементов базовой темы. Во всяком случае, возможно, первоначальный "плохой дизайн" перешел во многих поколениях к разочаровывающему поведению.

ggtern маски theme_bw(), означающий, что ggtern имеет свою версию theme_bw() который отменяет ggplot2 версия. Как ни странно, ggternверсия theme_bw() похоже theme_grey()так что, возможно, это ошибка.

Если вы хотите сохранить ggtern загружен, другой вариант заключается в обеспечении ggplot2 версия theme_bw():

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

К сожалению, вы не можете просто загрузить ggplot2 после загрузки ggtern (чтобы избежать проблемы маскировки), потому что ggtern грузы ggplot2,

Чтобы увидеть разницу в коде для каждой версии theme_bw() введите в консоли следующее:

ggplot2::theme_bw

ggtern::theme_bw

ОБНОВЛЕНИЕ: вышеупомянутое столкновение между темами в ggplot2 а также ggtern произошло в ggtern версии 2.1.2 и более ранних, но столкновение больше не происходит в версии 2.1.3, поэтому все, что вам нужно сделать, это обновить до последней версии ggtern, Смотрите @NicolasHamilton ответ для более подробной информации.

Я решил свою проблему, отсоединив ggtern.

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

Другие вопросы по тегам