【问题标题】:R markdown: Reduce the space between two plots in pdf output documentR markdown:减少pdf输出文档中两个图之间的空间
【发布时间】:2021-05-30 11:04:36
【问题描述】:
  • 目标:R markdown:构建一个 DinA4 pdf 页面,左上角有一个矩形和两个绘图。
  • 问题:绘制矩形后,下一个绘图距离很远,中间有一大块空白。
  • 所需的输出:热图应立即出现在矩形之后,可能带有一两条白线。

我猜问题是矩形的绘制。在这里我需要一些帮助。谢谢。

---
output:
  pdf_document
documentclass: article
classoption: a4paper
geometry: margin=1cm

subparagraph: yes
header-includes: |
  \usepackage{titlesec}
  \titlespacing{\title}{0pt}{\parskip}{-\parskip}

title: "Example of Title to Body Text"
subtitle: Subtitle Places Here
---

\vspace{-5truemm}
\pagenumbering{gobble}
#``` {r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(draw)
library(ggplot2)
library(dplyr)
# ```
#```{r rectangle}
drawBox(x =2, y = 3.5, width = 2.5, height = 1)
#```
#```{r heatmap}
df <- data.frame(
  test_id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
              3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4),
  test_nr = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 
              1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2),
  region = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", 
             "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", 
             "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
  test_value = c(3, 1, 2, 2, 2, 1, 2, 2, 3, 2, 2, 3, 2, 1, 2, 2, 1, 2, 3, 
                 4, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 99, 99, 3, 3, 3, 3)
)

# named vector for heatmap
cols <-  c("1" = "green", 
           "2" = "darkgreen", 
           "3" = "orange", 
           "4" = "red",
           "99" = "black")
labels_legend <- c("1" = "very good", 
                   "2" = "good", 
                   "3" = "not so good", 
                   "4" = "bad", 
                   "99" = "NA")

df <- df %>% 
  filter(test_id==1)

ggplot(
  df, 
  aes(region, test_nr)) +
  geom_tile(aes(fill= factor (test_value))) +
  geom_text(aes(label = test_value), size = 10, color = "white") + # text in tiles
  scale_colour_manual(
    values = cols, 
    breaks = c("1", "2", "3", "4", "99"),
    labels = labels_legend,
    aesthetics = c("colour", "fill")
  ) +
  theme(text = element_text(size = 14)) + # this will change all text size
  labs(title =  "Test (Individual heatmap)", x = "Region", y = "Event") +
  labs(fill = "Test") +
  coord_fixed(ratio=1, clip="on") +
  theme(axis.text.y = element_text(face = "bold", size = 12)) +
  theme(axis.text.x = element_text(angle = 0, face = "bold", size = 12)) +
  theme(axis.line = element_line(colour = "darkblue", 
                                 size = 1, linetype = "solid")
  )
# ```

## Information

【问题讨论】:

    标签: r r-markdown


    【解决方案1】:

    您可以使用 subfigure 环境并排显示多个绘图,但您可能不希望将矩形放置在与热图相同的主标题下。

    ---
    output:
      pdf_document:
        extra_dependencies: "subfig"
    documentclass: article
    classoption: a4paper
    geometry: margin=1cm
    
    subparagraph: yes
    header-includes: |
      \usepackage{titlesec}
      \titlespacing{\title}{0pt}{\parskip}{-\parskip}
    
    title: "Example of Title to Body Text"
    subtitle: Subtitle Places Here
    ---
    
    \vspace{-5truemm}
    \pagenumbering{gobble}
    
    ``` {r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE)
    library(draw)
    library(ggplot2)
    library(dplyr)
    ```
    
    ```{r rectangle}
    drawBox(x =2, y = 3.5, width = 2.5, height = 1)
    ```
    
    ```{r heatmap-data}
    df <- data.frame(
      test_id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
                  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4),
      test_nr = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 
                  1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2),
      region = c("A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", 
                 "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", 
                 "C", "D", "A", "B", "C", "D", "A", "B", "C", "D", "A", "B", "C", "D"),
      test_value = c(3, 1, 2, 2, 2, 1, 2, 2, 3, 2, 2, 3, 2, 1, 2, 2, 1, 2, 3, 
                     4, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 3, 2, 2, 2, 99, 99, 3, 3, 3, 3)
    )
    
    # named vector for heatmap
    cols <-  c("1" = "green", 
               "2" = "darkgreen", 
               "3" = "orange", 
               "4" = "red",
               "99" = "black")
    labels_legend <- c("1" = "very good", 
                       "2" = "good", 
                       "3" = "not so good", 
                       "4" = "bad", 
                       "99" = "NA")
    
    df <- df %>% 
      filter(test_id==1)
    ```
    
    ```{r heatmap, fig.show="hold", fig.cap='Rectangle and Heatmap', fig.subcap=c('LEFT', 'RIGHT'), out.width='50%', fig.align = "center"}
    drawBox(x =2, y = 3.5, width = 2.5, height = 1)
    
    ggplot(
      df, 
      aes(region, test_nr)
      ) +
      geom_tile(aes(fill= factor (test_value))) +
      geom_text(aes(label = test_value), size = 10, color = "white") + # text in tiles
      scale_colour_manual(
        values = cols, 
        breaks = c("1", "2", "3", "4", "99"),
        labels = labels_legend,
        aesthetics = c("colour", "fill")
      ) +
      theme(text = element_text(size = 14)) + # this will change all text size
      labs(title =  "Test (Individual heatmap)", x = "Region", y = "Event") +
      labs(fill = "Test") +
      coord_fixed(ratio=1, clip="on") +
      theme(axis.text.y = element_text(face = "bold", size = 12)) +
      theme(axis.text.x = element_text(angle = 0, face = "bold", size = 12)) +
      theme(
        axis.line = element_line(
          colour = "darkblue", 
          size = 1, linetype = "solid"
          )
      )
    ```
    
    ## Information
    

    【讨论】: