ggplot boxplot 在提供休息时不绘制

ggplot boxplot not plotting when supplying breaks

我尝试使用 geom_boxpot 绘制 7 个值,我希望只在图例中显示某些值,因此我在 scale_linetype_manual 函数中使用 breaks 参数但它根本不绘制那些箱线图,

Boxplot using scale_linetype_manual

但是,如果我将相同的代码与 scale_linetype_discrete 一起使用,它可以正常工作并绘图,并且只在图例中提供所需的值。但是,我无法使用 values 参数控制函数中的线型。有没有办法为 scale_linetype_discrete 函数添加值?

Boxplot using scale_linetype_discrete

编辑 - 更新了虚假数据 + 代码

> head(debug)
# A tibble: 6 × 4
   subj time  cond        y
  <dbl> <chr> <chr>   <dbl>
1     1 one   one_A       2
2     1 two   two_A       1
3     1 two   two_B       5
4     1 two   two_C       0
5     1 three three_A     4
6     1 four  four_A      4

> dput(debug)
structure(list(subj = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 
2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4), time = c("one", 
"two", "two", "two", "three", "four", "four", "one", "two", "two", 
"two", "three", "four", "four", "one", "two", "two", "two", "three", 
"four", "four", "one", "two", "two", "two", "three", "four", 
"four"), cond = c("one_A", "two_A", "two_B", "two_C", "three_A", 
"four_A", "four_B", "one_A", "two_A", "two_B", "two_C", "three_A", 
"four_A", "four_B", "one_A", "two_A", "two_B", "two_C", "three_A", 
"four_A", "four_B", "one_A", "two_A", "two_B", "two_C", "three_A", 
"four_A", "four_B"), y = c(2, 1, 5, 0, 4, 4, 2, 2, 4, 3, 0, 1, 
5, 3, 1, 5, 4, 2, 0, 4, 4, 0, 0, 4, 2, 1, 5, 5)), row.names = c(NA, 
-28L), spec = structure(list(cols = list(subj = structure(list(), class = c("collector_double", 
"collector")), time = structure(list(), class = c("collector_character", 
"collector")), cond = structure(list(), class = c("collector_character", 
"collector")), y = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), delim = ","), class = "col_spec"), problems = <pointer: 0x600004737380>, class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))

# Scale_linetype_discrete (would like to add linetype values to this)

ggplot() +
  geom_boxplot(debug,
               mapping = aes(x = time, 
                             y = y, 
                             linetype = cond),
               show.legend = TRUE) +
  scale_x_discrete(limits = c("one","two","three","four"),
                   labels = c("one","two","three","four")) +
  scale_linetype_discrete(name = "My legend",
                          breaks = c("two_A","two_B","two_C","four_A","four_B"),
                          labels = c("two_A","two_B","two_C","four_A","four_B")) 

# Scale_linetype_manual (would like 'one' and 'three' to be actually plotted but not showing in my legend)

ggplot() +
  geom_boxplot(debug,
               mapping = aes(x = time, 
                             y = y, 
                             linetype = cond),
               show.legend = TRUE) +
  scale_x_discrete(limits = c("one","two","three","four"),
                   labels = c("one","two","three","four")) +
  scale_linetype_manual(name = "My legend",
                        breaks = c("two_A","two_B","two_C","four_A","four_B"),
                        labels = c("two_A","two_B","two_C","four_A","four_B"),
                        values = c("solid","dashed","solid","dashed","solid", "dashed","solid")) 

不确定您的代码不起作用的原因。但是解决您的问题的一种选择是使用命名向量将线型分配给您 cond 变量的类别:

library(ggplot2)

lty <- c("solid", "dashed", "solid", "dashed", "solid", "dashed", "solid")
names(lty) <- c("four_A", "four_B", "one_A", "three_A", "two_A", "two_B", "two_C")

ggplot() +
  geom_boxplot(debug,
    mapping = aes(
      x = time,
      y = y,
      linetype = cond
    )
  ) +
  scale_x_discrete(
    limits = c("one", "two", "three", "four"),
    labels = c("one", "two", "three", "four")
  ) +
  scale_linetype_manual(
    name = "My legend",
    breaks = c("two_A", "two_B", "two_C", "four_A", "four_B"),
    values = lty
  )