代码之家  ›  专栏  ›  技术社区  ›  Daniel Valencia C.

当在aes()中包含图例标签时,ggplot中点的默认形状为什么会发生变化?

  •  0
  • Daniel Valencia C.  · 技术社区  · 3 年前

    我将默认点形状设置为17:

    update_geom_defaults("point", list(shape = 17))

    当我在没有指定内部形状的情况下打印时 aes() ,情节如预期。但当我把传奇标签放在 aes() ,点的形状完全不同。如何解决此问题,以便在所有绘图上重复默认形状?

    library(ggplot2)
    
    update_geom_defaults("point", list(shape = 17))
    
    X <- 1
    Y <- 2
    
    DF <- data.frame(X, Y)
    
    # OK
    ggplot(data = DF,
           aes(x = X,
               y = Y)) +
      geom_point()
    
    #Not OK
    ggplot(data = DF,
           aes(x = X,
               y = Y)) +
      geom_point(aes(shape = "Legend label"))
    

    enter image description here enter image description here

    0 回复  |  直到 3 年前
        1
  •  4
  •   eipi10    3 年前

    update_geom_defaults 仅更改调用时使用的单个默认形状 geom_point 而不将某些内容映射到 shape 内在审美 aes() .

    但是,当您添加 形状 在美学上,ggplot使用默认的形状调色板,该调色板将形状16作为其第一个值。形状调色板是为了获得作为第一值的期望形状17而需要改变的。可以通过添加(例如)对单个绘图执行此操作 + scale_shape_manual(values=c(17, 16)) 到绘图代码,这将使形状17成为第一个形状,使形状16成为第二个形状(当您将具有两个不同值的变量映射到 形状 美学但你必须对每一个情节都这样做。相反,您可以更改 违约 形状调色板一次,然后它将自动应用于后续的每个绘图。在下面的例子中,我用一个新的分类列扩充了您的样本数据以进行说明。

    library(ggplot2)
    library(patchwork)
    theme_set(theme_bw(base_size=9))
    
    update_geom_defaults("point", list(shape = 17))
    
    X <- 1:2
    Y <- 2:3
    group = c("A","B")
    
    DF <- data.frame(X, Y, group)
    
    p1 = ggplot(data = DF,
           aes(x = X,
               y = Y)) +
      geom_point(size=3) +
      labs(title="No shape aesthetic")
    
    p2 = ggplot(data = DF,
           aes(x = X,
               y = Y, 
               shape=group)) +
      geom_point(size=3) +
      labs(title="Add shape aesthetic")
    
    p3 = ggplot(data = DF,
           aes(x = X,
               y = Y)) +
      geom_point(aes(shape = "Legend label"), size=3) +
      labs(title="Add dummy shape aesthetic")
    
    p1 + p2 + p3
    

    在下面的第二张和第三张图中,请注意,填充的圆仍用作形状选项板中的第一个形状。

    enter image description here

    如果我们查看默认的形状调色板,我们可以看到它仍然以形状16(实心圆)作为第一个值。

    # View default shape palette
    scales:::shape_pal()
    #> function (n) 
    #> {
    #>     if (n > 6) {
    #>         msg <- paste("The shape palette can deal with a maximum of 6 discrete ", 
    #>             "values because more than 6 becomes difficult to discriminate; ", 
    #>             "you have ", n, ". Consider specifying shapes manually if you ", 
    #>             "must have them.", sep = "")
    #>         warning(paste(strwrap(msg), collapse = "\n"), call. = FALSE)
    #>     }
    #>     if (solid) {
    #>         c(16, 17, 15, 3, 7, 8)[seq_len(n)]
    #>     }
    #>     else {
    #>         c(1, 2, 0, 3, 7, 8)[seq_len(n)]
    #>     }
    #> }
    #> <bytecode: 0x7fa674bbcfb8>
    #> <environment: 0x7fa6762a8c60>
    

    下面我们将重新定义 scale_shape_discrete (这是默认的形状比例),以使用形状17(填充的三角形)作为第一个值。然后,当我们重做绘图时,我们会看到当我们使用 形状 美学

    # Redefine default shape palette
    scale_shape_discrete = function(...) {
      scale_shape_manual(values = c(17, 16, 15, 3, 7, 8))
    }
    
    p1 = ggplot(data = DF,
                aes(x = X,
                    y = Y)) +
      geom_point(size=3) +
      labs(title="No shape aesthetic")
    
    
    p2 = ggplot(data = DF,
                aes(x = X,
                    y = Y, 
                    shape=group)) +
      geom_point(size=3) +
      labs(title="Add shape aesthetic")
    
    p3 = ggplot(data = DF,
                aes(x = X,
                    y = Y)) +
      geom_point(aes(shape = "Legend label"), size=3) +
      labs(title="Add dummy shape aesthetic")
    
    p1 + p2 + p3
    

    enter image description here