Unset existing scale_fill_discrete in ggplot2 or suppress message for new scale

社会主义新天地 提交于 2019-12-13 07:26:12

问题


I am currently trying to knit an R markdown document to html (or pdf) where in a certain chunck I generate multiple plots. I specify the captions through the fig.cap argument in the chunck options with a vector of the same length as the number of plots. However, for this to work the cunck option message has to be TRUE. The issue starts when a ggplot2 object is generated by a function in the chucnk and I want to apply a new fill with viridis::scale_fill_viridis. Which is fine, but inevitably throws a message/warning that there is already a fill applied to the ggplot2 object and that the viridis will replace it (Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale). I do not want to get this into the output of my markdown html. Using suppressMessages apparently also suppresses the html (and pdf!) captions. So my question is: is there a way to "unset" the existing scales attribute to avoid this message being generated? Short from that my only other option would be to dive into the code that generated the object in the first place. Or: is there a way that knitr preserves captions when the cunck option messages=F?

Kind regards,

FM

A minimal working example would be the following code in an R markdown document:

---
title: "SOtest"
author: "FM Kerckhof"
date: "1/9/2017"
output: html_document
---

```{r setup, include=FALSE}
library(ggplot2)
library(ggthemes)
library(viridis)
knitr::opts_chunk$set(echo = TRUE)
#### custom function ####
creategg <- function(x,plot=FALSE)
{
  datnam <- names(x)
  p <- ggplot(data=x,aes(x=x[,datnam[1]],
                         y=x[,datnam[2]],
                         fill=factor(x[,datnam[ncol(x)]]))) + 
              geom_bar(stat="identity") + 
              scale_fill_gdocs()
  if(plot==TRUE){
    print(p)
  }
  reslist <- list(inputdata=x,ggplotobj=p)
}
```

## Lorem ipsum

Actual report

```{r iriscars, fig.cap=c("plot with default fill","same plot with viridis fill"), echo=FALSE}
a <- creategg(iris,plot=TRUE)
a$ggplotobj + scale_fill_viridis(discrete=TRUE)
```

If relevant, my session_info() output is:

Session info -------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.4.1 (2017-06-30)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.153)           
 language (EN)                        
 collate  en_US.UTF-8                 
 tz       Europe/Brussels             
 date     2017-09-01                  

Packages -----------------------------------------------------------------------------------------------
 package      * version date       source        
 ade4           1.7-8   2017-08-09 CRAN (R 3.4.1)
 ape            4.1     2017-02-14 CRAN (R 3.3.2)
 assertthat   * 0.2.0   2017-04-11 CRAN (R 3.3.3)
 backports      1.1.0   2017-05-22 CRAN (R 3.4.0)
 base         * 3.4.1   2017-07-08 local         
 bindr          0.1     2016-11-13 CRAN (R 3.4.0)
 bindrcpp       0.2     2017-06-17 CRAN (R 3.4.0)
 Biobase      * 2.36.2  2017-05-09 Bioconductor  
 BiocGenerics * 0.22.0  2017-05-04 Bioconductor  
 biomformat     1.4.0   2017-05-04 Bioconductor  
 Biostrings     2.44.2  2017-07-24 Bioconductor  
 bitops         1.0-6   2013-08-17 CRAN (R 3.2.4)
 caTools        1.17.1  2014-09-10 CRAN (R 3.2.4)
 cluster        2.0.6   2017-03-16 CRAN (R 3.4.0)
 codetools      0.2-15  2016-10-05 CRAN (R 3.3.1)
 colorspace     1.3-2   2016-12-14 CRAN (R 3.3.2)
 compiler       3.4.1   2017-07-08 local         
 data.table     1.10.4  2017-02-01 CRAN (R 3.3.2)
 datasets     * 3.4.1   2017-07-08 local         
 devtools     * 1.13.3  2017-08-02 CRAN (R 3.4.1)
 digest         0.6.12  2017-01-27 CRAN (R 3.3.2)
 dplyr        * 0.7.2   2017-07-20 CRAN (R 3.4.1)
 evaluate       0.10.1  2017-06-24 CRAN (R 3.4.0)
 extrafont    * 0.17    2014-12-08 CRAN (R 3.4.0)
 extrafontdb    1.0     2012-06-11 CRAN (R 3.4.0)
 foreach        1.4.3   2015-10-13 CRAN (R 3.2.4)
 gdata          2.18.0  2017-06-06 CRAN (R 3.4.0)
 ggplot2      * 2.2.1   2016-12-30 CRAN (R 3.3.2)
 ggthemes     * 3.4.0   2017-02-19 CRAN (R 3.3.2)
 glue           1.1.1   2017-06-21 CRAN (R 3.4.0)
 gplots       * 3.0.1   2016-03-30 CRAN (R 3.2.4)
 graphics     * 3.4.1   2017-07-08 local         
 grDevices    * 3.4.1   2017-07-08 local         
 grid           3.4.1   2017-07-08 local         
 gridExtra      2.2.1   2016-02-29 CRAN (R 3.3.1)
 gtable         0.2.0   2016-02-26 CRAN (R 3.2.4)
 gtools       * 3.5.0   2015-05-29 CRAN (R 3.2.4)
 htmltools      0.3.6   2017-04-28 CRAN (R 3.4.0)
 igraph         1.1.2   2017-07-21 CRAN (R 3.4.1)
 IRanges        2.10.2  2017-06-01 Bioconductor  
 iterators      1.0.8   2015-10-13 CRAN (R 3.2.4)
 jsonlite       1.5     2017-06-01 CRAN (R 3.4.0)
 KernSmooth     2.23-15 2015-06-29 CRAN (R 3.4.0)
 knitr          1.17    2017-08-10 CRAN (R 3.4.1)
 labeling       0.3     2014-08-23 CRAN (R 3.2.4)
 lattice      * 0.20-35 2017-03-25 CRAN (R 3.3.3)
 lazyeval       0.2.0   2016-06-12 CRAN (R 3.3.1)
 magrittr       1.5     2014-11-22 CRAN (R 3.2.4)
 MASS           7.3-47  2017-04-21 CRAN (R 3.4.0)
 Matrix         1.2-11  2017-08-16 CRAN (R 3.4.1)
 memoise        1.1.0   2017-04-21 CRAN (R 3.4.0)
 methods      * 3.4.1   2017-07-08 local         
 mgcv           1.8-19  2017-08-29 CRAN (R 3.4.1)
 multtest       2.32.0  2017-05-04 Bioconductor  
 munsell        0.4.3   2016-02-13 CRAN (R 3.2.4)
 nlme           3.1-131 2017-02-06 CRAN (R 3.3.2)
 parallel     * 3.4.1   2017-07-08 local         
 permute      * 0.9-4   2016-09-09 CRAN (R 3.3.1)
 phyloseq       1.20.0  2017-05-04 Bioconductor  
 pkgconfig      2.0.1   2017-03-21 CRAN (R 3.4.0)
 plyr         * 1.8.4   2016-06-08 CRAN (R 3.3.1)
 R6             2.2.2   2017-06-17 CRAN (R 3.4.0)
 Rcpp           0.12.12 2017-07-15 CRAN (R 3.4.1)
 reshape2     * 1.4.2   2016-10-22 CRAN (R 3.3.2)
 rhdf5          2.20.0  2017-05-04 Bioconductor  
 rlang          0.1.2   2017-08-09 CRAN (R 3.4.1)
 rmarkdown      1.6     2017-06-15 CRAN (R 3.4.0)
 rprojroot      1.2     2017-01-16 CRAN (R 3.3.2)
 Rttf2pt1       1.3.4   2016-05-19 CRAN (R 3.4.0)
 S4Vectors      0.14.3  2017-06-06 Bioconductor  
 scales         0.5.0   2017-08-24 CRAN (R 3.4.1)
 splines        3.4.1   2017-07-08 local         
 stats        * 3.4.1   2017-07-08 local         
 stats4         3.4.1   2017-07-08 local         
 stringi        1.1.5   2017-04-07 CRAN (R 3.3.3)
 stringr        1.2.0   2017-02-18 CRAN (R 3.3.2)
 survival       2.41-3  2017-04-04 CRAN (R 3.3.3)
 tibble         1.3.4   2017-08-22 CRAN (R 3.4.1)
 tools          3.4.1   2017-07-08 local         
 utils        * 3.4.1   2017-07-08 local         
 vegan        * 2.4-4   2017-08-24 CRAN (R 3.4.1)
 viridis      * 0.4.0   2017-03-27 CRAN (R 3.4.1)
 viridisLite  * 0.2.0   2017-03-24 CRAN (R 3.3.3)
 withr          2.0.0   2017-07-28 CRAN (R 3.4.1)
 XVector        0.16.0  2017-05-04 Bioconductor  
 yaml           2.1.14  2016-11-12 CRAN (R 3.3.2)
 zlibbioc       1.22.0  2017-05-04 Bioconductor 

回答1:


Take a look at a ggplot object, here p:

str(p)

There's a lot of sub-structure. Take a look at p$scales. It's a ScalesList. The following might help you:

i <- which(sapply(p$scales$scales, function(x) 'fill' %in% x$aesthetics)) p$scales$scales[[i]] <- NULL



来源:https://stackoverflow.com/questions/45998396/unset-existing-scale-fill-discrete-in-ggplot2-or-suppress-message-for-new-scale

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!