Changing the symbol in the legend key in ggplot2

后端 未结 2 539
南方客
南方客 2020-12-03 11:21

How do I change the geom_text legend key symbol? In the example below, I\'d like to change the symbol in the legend key from a lower case \"a\" to, say, an upper case \"N\".

相关标签:
2条回答
  • 2020-12-03 11:56

    With gtable version 0.2.0 (ggplot2 v 2.1.0) installed, Kohske's original solution (see the comments) can be made to work.

    # Some toy data
    df <- expand.grid(x = factor(seq(1:5)), y = factor(seq(1:5)), KEEP.OUT.ATTRS = FALSE)
    df$Count = seq(1:25)
    
    # Load packages
    library(ggplot2)
    library(grid)
    
    # A plot
    p = ggplot(data = df, aes( x = x, y = y, label = Count, size = Count)) + 
        geom_text() +
        scale_size(range = c(2, 10))
    p
    
    grid.ls(grid.force()) 
    grid.gedit("key-[-0-9]-1-1", label = "N")
    

    Or, to work on a grob object:

    # Get the ggplot grob
    gp = ggplotGrob(p)
    grid.ls(grid.force(gp)) 
    
    # Edit the grob
    gp = editGrob(grid.force(gp), gPath("key-[1-9]-1-1"), grep = TRUE, global = TRUE,  
             label = "N")
    
    # Draw it
    grid.newpage()
    grid.draw(gp)
    

    Another option

    Modify the geom

    # Some toy data
    df <- expand.grid(x = factor(seq(1:5)), y = factor(seq(1:5)), KEEP.OUT.ATTRS = FALSE)
    df$Count = seq(1:25)
    
    # Load packages
    library(ggplot2)
    library(grid)
    
    # A plot
    p = ggplot(data = df, aes( x = x, y = y, label = Count, size = Count)) + 
        geom_text() +
        scale_size(range = c(2, 10))
    p
    
    GeomText$draw_key <- function (data, params, size) { 
       pointsGrob(0.5, 0.5, pch = "N", 
       gp = gpar(col = alpha(data$colour, data$alpha), 
       fontsize = data$size * .pt)) }
    
    p
    
    0 讨论(0)
  • 2020-12-03 11:58

    EDIT: updating for ggplot version 0.9.2

    The original answer (see below) broke at about version 0.9.0 or 0.9.1. The following works in 0.9.2

    # Some toy data
    df <- expand.grid(x = factor(seq(1:5)), y = factor(seq(1:5)), KEEP.OUT.ATTRS = FALSE)
    df$Count = seq(1:25)
    
    # A plot
    library(ggplot2)
    p = ggplot(data = df, aes( x = x, y = y, label = Count, size = Count)) + 
       geom_point(colour = NA) +
       geom_text(show.legend = FALSE) +  
       guides(size = guide_legend(override.aes = list(colour = "black", shape = utf8ToInt("N")))) +
       scale_size(range = c(2, 10))
    
    p
    

    Original answer Answering my own question and using the snippet of code in @kohske's comment above:

    # Some toy data
    df <- expand.grid(x = factor(seq(1:5)), y = factor(seq(1:5)), KEEP.OUT.ATTRS = FALSE)
    df$Count = seq(1:25)
    
    # A plot
    library(ggplot2)
    p = ggplot(data = df, aes( x = x, y = y, label = Count, size = Count)) + 
        geom_text() +
        scale_size(range = c(2, 10))
    p
    
    library(grid)
    grid.gedit("^key-[-0-9]+$", label = "N")
    

    enter image description here

    0 讨论(0)
提交回复
热议问题