簡體   English   中英

縮小繪圖寬度,為ggrepel標簽騰出更多空間

[英]shrink plot width to make more room for ggrepel labels

我想縮小繪圖區域,以便有更多的空間可以將ggrepel標簽切斷。 我似乎無法通過nudge_x()來偏移標簽,我不想縮小文本大小。

我正試圖找到一種壓縮圖表的方法,以便所有組都移近中心,在x軸的極端處為標簽留出更多空間。

在此輸入圖像描述

具體來說,我試圖將這個數字編成一幅肖像PDF。 我嘗試在塊選項中控制fig.width ,但這只會使整個圖表變小。

我想最大化縱向頁面上的寬度,但縮小相對於標簽區域的繪圖區域。

---
title             : "The title"
shorttitle        : "Title"

author: 
  - name          : "Me"
    affiliation   : "1"
    corresponding : yes    # Define only one corresponding author
    address       : "Address"
    email         : "email"

affiliation:
  - id            : "1"
    institution   : "Company"

authornote: |
  Note here

abstract: |
  Abstract here.


floatsintext      : yes
figurelist        : no
tablelist         : no
footnotelist      : no
linenumbers       : no
mask              : no
draft             : no
note              : "\\clearpage"

documentclass     : "apa6"
classoption       : "man,noextraspace"
header-includes:
  - \usepackage{pdfpages}
  - \usepackage{setspace}
  - \AtBeginEnvironment{tabular}{\singlespacing}
  - \makeatletter\let\expandableinput\@@input\makeatother
  - \interfootnotelinepenalty=10000
  - \usepackage{float} #use the 'float' package
  - \floatplacement{figure}{H} #make every figure with caption = h
  - \raggedbottom
output            : papaja::apa6_pdf
---


```{r test, fig.cap="Caption.", fig.height=8, include=TRUE, echo=FALSE}
library("papaja")
library(tidyverse)
library(ggrepel)

ageGenderF <- structure(list(genAge = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("Women, 15-19", 
"Women, 20-24", "Women, 25-35", "Women, 36+"), class = "factor"), 
    word_ = c("this is label 2", "this is label 3", "this is label 4", 
    "this is label 1", "this is label 7", "this is label 5", 
    "this is label 8", "this is label 10", "this is label 11", 
    "this is label 20", "this is label 12", "this is label 6", 
    "this is label 17", "this is label 9", "this is label 15", 
    "this is label 21", "this is label 31", "this is label 25", 
    "this is label 26", "this is label 19", "this is label 24", 
    "this is label 28", "this is label 29", "this is label 30", 
    "this is label 14", "this is label 22", "this is label 18", 
    "this is label 54", "this is label 32", "this is label 44", 
    "this is label 52", "this is label 34", "this is label 59", 
    "this is label 48", "this is label 23", "this is label 47", 
    "this is label 38", "this is label 35", "this is label 61", 
    "this is label 56", "this is label 39", "this is label 72", 
    "this is label 42", "this is label 16", "this is label 66", 
    "this is label 37", "this is label 51", "this is label 27", 
    "this is label 40", "this is label 73", "this is label 60", 
    "this is label 113", "this is label 50", "this is label 45", 
    "this is label 81", "this is label 84", "this is label 53", 
    "this is label 49", "this is label 67", "this is label 68", 
    "this is label 46", "this is label 65", "this is label 41", 
    "this is label 57", "this is label 1", "this is label 2", 
    "this is label 3", "this is label 4", "this is label 5", 
    "this is label 6", "this is label 7", "this is label 8", 
    "this is label 9", "this is label 10", "this is label 11", 
    "this is label 12", "this is label 13", "this is label 14", 
    "this is label 15", "this is label 16", "this is label 17", 
    "this is label 18", "this is label 19", "this is label 20", 
    "this is label 21", "this is label 22", "this is label 23", 
    "this is label 24", "this is label 25", "this is label 26", 
    "this is label 27", "this is label 28", "this is label 29", 
    "this is label 30", "this is label 31", "this is label 32", 
    "this is label 33", "this is label 34", "this is label 35", 
    "this is label 36", "this is label 37", "this is label 38", 
    "this is label 39", "this is label 40", "this is label 41", 
    "this is label 42", "this is label 43", "this is label 44", 
    "this is label 45", "this is label 46", "this is label 47", 
    "this is label 48", "this is label 49", "this is label 50", 
    "this is label 51", "this is label 52", "this is label 53", 
    "this is label 54", "this is label 55", "this is label 56", 
    "this is label 57", "this is label 58", "this is label 59", 
    "this is label 60", "this is label 61", "this is label 62", 
    "this is label 63", "this is label 64", "this is label 1", 
    "this is label 2", "this is label 3", "this is label 6", 
    "this is label 4", "this is label 5", "this is label 12", 
    "this is label 7", "this is label 8", "this is label 9", 
    "this is label 10", "this is label 14", "this is label 11", 
    "this is label 18", "this is label 29", "this is label 45", 
    "this is label 27", "this is label 15", "this is label 26", 
    "this is label 71", "this is label 37", "this is label 13", 
    "this is label 25", "this is label 23", "this is label 22", 
    "this is label 41", "this is label 42", "this is label 55", 
    "this is label 52", "this is label 36", "this is label 34", 
    "this is label 17", "this is label 63", "this is label 24", 
    "this is label 19", "this is label 28", "this is label 38", 
    "this is label 32", "this is label 21", "this is label 30", 
    "this is label 35", "this is label 16", "this is label 64", 
    "this is label 20", "this is label 31", "this is label 53", 
    "this is label 77", "this is label 39", "this is label 70", 
    "this is label 57", "this is label 48", "this is label 43", 
    "this is label 132", "this is label 51", "this is label 66", 
    "this is label 58", "this is label 85", "this is label 120", 
    "this is label 65", "this is label 40", "this is label 121", 
    "this is label 78", "this is label 59", "this is label 141", 
    "this is label 1", "this is label 12", "this is label 6", 
    "this is label 2", "this is label 3", "this is label 5", 
    "this is label 4", "this is label 45", "this is label 52", 
    "this is label 26", "this is label 77", "this is label 8", 
    "this is label 7", "this is label 10", "this is label 14", 
    "this is label 31", "this is label 59", "this is label 178", 
    "this is label 18", "this is label 27", "this is label 42", 
    "this is label 70", "this is label 29", "this is label 37", 
    "this is label 330", "this is label 78", "this is label 25", 
    "this is label 34", "this is label 21", "this is label 450", 
    "this is label 83", "this is label 185", "this is label 57", 
    "this is label 16", "this is label 50", "this is label 126", 
    "this is label 895", "this is label 63", "this is label 402", 
    "this is label 19", "this is label 724", "this is label 40", 
    "this is label 11", "this is label 43", "this is label 758", 
    "this is label 1099", "this is label 73", "this is label 62", 
    "this is label 46", "this is label 183", "this is label 819", 
    "this is label 295", "this is label 1100", "this is label 17", 
    "this is label 282", "this is label 153", "this is label 1101", 
    "this is label 41", "this is label 1102", "this is label 446", 
    "this is label 216", "this is label 13", "this is label 109", 
    "this is label 20"), n = c(774L, 635L, 618L, 495L, 329L, 
    284L, 259L, 217L, 197L, 181L, 163L, 163L, 162L, 160L, 138L, 
    124L, 114L, 112L, 110L, 107L, 99L, 98L, 97L, 92L, 85L, 84L, 
    84L, 78L, 74L, 72L, 68L, 67L, 66L, 66L, 65L, 60L, 60L, 60L, 
    58L, 57L, 55L, 51L, 51L, 51L, 50L, 50L, 48L, 47L, 47L, 46L, 
    46L, 44L, 44L, 44L, 43L, 43L, 43L, 43L, 42L, 41L, 41L, 41L, 
    41L, 41L, 1568L, 1366L, 1220L, 1012L, 687L, 682L, 633L, 516L, 
    464L, 374L, 372L, 326L, 326L, 304L, 293L, 292L, 274L, 261L, 
    259L, 257L, 236L, 232L, 229L, 223L, 223L, 221L, 221L, 213L, 
    210L, 205L, 198L, 191L, 189L, 167L, 165L, 164L, 146L, 142L, 
    140L, 140L, 139L, 136L, 134L, 129L, 122L, 121L, 115L, 115L, 
    115L, 113L, 112L, 110L, 110L, 109L, 107L, 104L, 103L, 102L, 
    99L, 99L, 99L, 97L, 96L, 93L, 426L, 332L, 310L, 290L, 197L, 
    166L, 147L, 134L, 125L, 113L, 105L, 104L, 97L, 83L, 78L, 
    77L, 77L, 74L, 69L, 69L, 69L, 69L, 68L, 61L, 61L, 59L, 59L, 
    58L, 58L, 58L, 57L, 57L, 56L, 54L, 51L, 48L, 47L, 46L, 43L, 
    42L, 38L, 38L, 36L, 34L, 34L, 33L, 32L, 32L, 32L, 32L, 31L, 
    29L, 29L, 28L, 28L, 27L, 27L, 27L, 27L, 27L, 26L, 26L, 25L, 
    24L, 37L, 26L, 26L, 20L, 19L, 18L, 17L, 15L, 14L, 12L, 12L, 
    12L, 12L, 12L, 11L, 10L, 9L, 9L, 9L, 9L, 8L, 7L, 7L, 7L, 
    7L, 7L, 7L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 5L, 5L, 5L, 5L, 5L, 
    5L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 3L), rank = c(1L, 2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
    16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 
    28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 
    40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 
    52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 
    64L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 
    14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 
    26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 
    38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 
    50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 60L, 61L, 
    62L, 63L, 64L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 
    12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 
    24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 33L, 34L, 35L, 
    36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 
    48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 57L, 58L, 59L, 
    60L, 61L, 62L, 63L, 64L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 
    9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
    21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 
    33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 
    45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 
    57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L)), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -256L), groups = structure(list(
    genAge = structure(1:4, .Label = c("Women, 15-19", "Women, 20-24", 
    "Women, 25-35", "Women, 36+"), class = "factor"), .rows = list(
        1:64, 65:128, 129:192, 193:256)), row.names = c(NA, -4L
), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

ageGenderFLow <- 
  ageGenderF %>%
  filter(genAge=="Women, 15-19") %>%
  filter(rank<=10)

ageGenderFHigh <- 
  ageGenderF %>%
  filter(genAge=="Women, 36+") %>%
  filter(rank<=10)

ageGenderF_ <-
  ageGenderF %>%
  filter(word_ %in% ageGenderFLow$word_ |
         word_ %in% ageGenderFHigh$word_)

# get rank order of words for low set
ageGenderFLowRank <- 
  ageGenderF_ %>%
  filter(genAge=="Women, 15-19") %>%
  arrange(rank) %>%
  mutate(order = 1:n()) 

ageGenderF_ %>%
  mutate(word = factor(word_, ordered=TRUE, levels=ageGenderFLowRank$word_)) %>%
  # https://ibecav.github.io/slopegraph/
  ggplot(., aes(x = genAge, y = reorder(rank, -rank), group = word_)) +
  geom_line(aes(color = word_, alpha = 1), size = 1.5) +
  #geom_line(size = 0.5, color="lightgrey") +
  geom_text_repel(data = . %>% filter(genAge == "Women, 15-19"), 
                  aes(label = word) , 
                  hjust = "left", 
                  #fontface = "bold", 
                  size = 3, 
                  nudge_x = -3, 
                  direction = "y") +
  geom_text_repel(data = . %>% filter(genAge == "Women, 36+"), 
                  aes(label = word) , 
                  hjust = "right", 
                  #fontface = "bold", 
                  size = 3, 
                  nudge_x = 3, 
                  direction = "y") +
  geom_label(aes(label = rank), 
             size = 2.5, 
             label.padding = unit(0.15, "lines"), 
             label.size = 0.0) +
  scale_x_discrete(position = "top") +
  theme_bw() +
  # Remove the legend
  theme(legend.position = "none") +
  # Remove the panel border
  theme(panel.border     = element_blank()) +
  # Remove just about everything from the y axis
  theme(axis.title.y     = element_blank()) +
  theme(axis.text.y      = element_blank()) +
  theme(panel.grid.major.y = element_blank()) +
  theme(panel.grid.minor.y = element_blank()) +
  # Remove a few things from the x axis and increase font size
  theme(axis.title.x     = element_blank()) +
  theme(panel.grid.major.x = element_blank()) +
  theme(axis.text.x.top      = element_text(size=10)) +
  # Remove x & y tick marks
  theme(axis.ticks       = element_blank()) +
  # Format title & subtitle
  theme(plot.title       = element_text(size=10, face = "bold", hjust = 0.5)) +
  theme(plot.subtitle    = element_text(hjust = 0.5))
```



如果您願意更改方法,可以進行大轉換並使用您用作標簽的文本作為軸標簽。 您可以利用輔助軸為繪圖的每一側執行單獨的標注,因此事情看起來很像您現在正在做的事情。

我看到的優點是文本適合,因為它現在是軸的一部分。

首先,這是一個使用rank作為因子的例子。 您必須通過as.numeric()將該因子轉換為數字,以獲得重復的軸(到目前為止,離散軸沒有輔助軸)。 然后還需要做一些工作來獲取每一側的軸的斷點和標簽,因此我將數據操作移到第二步(並將rank2作為重新排序的因子,以便以后進行breaks )。

另請注意,在scale_x_discrete()使用expand可以從面板區域的邊緣移除空間。

ageGenderF_ = ageGenderF_ %>%
    ungroup() %>%
    mutate(word = factor(word_, ordered = TRUE, levels = ageGenderFLowRank$word_),
           rank2 = reorder(rank, -rank) )

ageGenderF_ %>%
    # https://ibecav.github.io/slopegraph/
    ggplot(., aes(x = genAge, y = as.numeric(rank2), group = word_)) +
    geom_line(aes(color = word_, alpha = 1), size = 1.5) +
    geom_label(aes(label = rank), 
           size = 2.5, 
           label.padding = unit(0.15, "lines"), 
           label.size = 0.0) +
    scale_x_discrete(position = "top", expand = c(0, .05) ) +
    scale_y_continuous(breaks = filter(ageGenderF_, genAge == "Women, 15-19") %>% pull(rank2) %>% as.numeric(), 
                    labels = filter(ageGenderF_, genAge == "Women, 15-19") %>% pull(word),
                    sec.axis = dup_axis(~., 
                                        breaks = filter(ageGenderF_, genAge == "Women, 36+") %>% pull(rank2) %>% as.numeric(), 
                                        labels = filter(ageGenderF_, genAge == "Women, 36+") %>% pull(word) ) ) +
    theme_bw() +
    # Remove the legend
    theme(legend.position = "none",
          # Remove the panel border
          panel.border     = element_blank(),
          # Remove just about everything from the y axis
          axis.title.y     = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          # Remove a few things from the x axis and increase font size
          axis.title.x     = element_blank(),
          panel.grid.major.x = element_blank(),
          axis.text.x.top      = element_text(size=10),
          # Remove x & y tick marks
          axis.ticks       = element_blank(),
          axis.ticks.length = unit(0, "cm"),
          # Format title & subtitle
          plot.title       = element_text(size=10, face = "bold", hjust = 0.5),
          plot.subtitle    = element_text(hjust = 0.5) )

從簡單的r markdown文檔看起來與您的示例類似(盡管不完全相同): 在此輸入圖像描述

你可以用rank作為數字做同樣的事情,使用scale_y_reverse()來反轉y軸。

ageGenderF_ = ageGenderF_ %>%
    ungroup() %>%
    mutate(word = factor(word_, ordered = TRUE, levels = ageGenderFLowRank$word_))

ageGenderF_ %>%
    # https://ibecav.github.io/slopegraph/
    ggplot(., aes(x = genAge, y = rank, group = word_)) +
    geom_line(aes(color = word_, alpha = 1), size = 1.5) +
    geom_label(aes(label = rank), 
               size = 2.5, 
               label.padding = unit(0.15, "lines"), 
               label.size = 0.0) +
    scale_x_discrete(position = "top", expand = c(0, .05) ) +
    scale_y_reverse(breaks = filter(ageGenderF_, genAge == "Women, 15-19") %>% pull(rank), 
                    labels = filter(ageGenderF_, genAge == "Women, 15-19") %>% pull(word),
                    sec.axis = dup_axis(~., 
                                        breaks = filter(ageGenderF_, genAge == "Women, 36+") %>% pull(rank), 
                                        labels = filter(ageGenderF_, genAge == "Women, 36+") %>% pull(word) ) ) +
    theme_bw() +
    # Remove the legend
    theme(legend.position = "none",
          # Remove the panel border
          panel.border     = element_blank(),
          # Remove just about everything from the y axis
          axis.title.y     = element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.minor.y = element_blank(),
          # Remove a few things from the x axis and increase font size
          axis.title.x     = element_blank(),
          panel.grid.major.x = element_blank(),
          axis.text.x.top      = element_text(size=10),
          # Remove x & y tick marks
          axis.ticks       = element_blank(),
          axis.ticks.length = unit(0, "cm"),
          # Format title & subtitle
          plot.title       = element_text(size=10, face = "bold", hjust = 0.5),
          plot.subtitle    = element_text(hjust = 0.5) )

一種選擇是將繪圖保存為對象( p ),然后使用egg包中的set_panel_size參數顯式設置面板的高度和寬度(如本答案中所述 )。 這樣的事情會讓你接近:

library(egg)
library(grid)

p2 <- set_panel_size(p, width=unit(7,"in"), height=unit(10, "in"))

grid.draw(p2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM