Change thickness of a marker in ggplot2

后端 未结 1 1939
名媛妹妹
名媛妹妹 2020-12-18 04:44

I am using the following code to make a map with proportional points to an outter characteristic (Total), but i would like to change the width of the marker.



        
相关标签:
1条回答
  • 2020-12-18 05:27

    Is it the thickness of the boundary of a hollow point that you want to change? It can be done with grid.edit from the grid package.

    library(ggplot2)
    library(grid)
    
    ggplot(data = data.frame(x = 1:10, y = 1:10), aes(x=x, y=y)) + 
       geom_point(size = 10, shape = 1)
    
    grid.force()  # To make the grobs visible to grid editing tools
    
    grid.edit("geom_point.points", grep = TRUE, gp = gpar(lwd = seq(1, 5.5, .5)))
    

    enter image description here

    EDIT To get legend keys to match the points

    library(ggplot2)
    library(grid)
    library(gtable)
    
    p = ggplot(data = data.frame(x = 1:10, y = 1:10, c = c(rep("a", 5), rep("b", 5))), 
       aes(x=x, y=y, colour = c)) + 
       geom_point(shape = 1, size = 10)
    
    lwd = 8   # Set line width
    
    g = ggplotGrob(p); dev.off()  # Get the plot grob
    
    # Get the indices for the legend: t = top, r = right, ...
    indices <- c(subset(g$layout, name == "guide-box", select = t:r))
    
    # Get the row number of the legend in the layout
    rn <- which(g$layout$name == "guide-box")
    
    # Extract the legend
    legend <- g$grobs[[rn]]
    
    # Get the legend keys
    pointGrobs = which(grepl("points", legend$grobs[[1]]$grobs))
    
    # Check them out - no line width set
    # for (i in pointGrobs) str(legend$grobs[[1]]$grobs[[i]])
    
    # Set line width
    for (i in pointGrobs) legend$grobs[[1]]$grobs[[i]]$gp$lwd = lwd
    
    # Check them out - line width set
    # for (i in pointGrobs) str(legend$grobs[[1]]$grobs[[i]])
    
    # Put the modified legend back into the plot grob
    g = gtable_add_grob(g, legend, t=indices$t, l=indices$l)
    
    # g$grobs[[4]]$children[[2]]$gp$lwd = lwd  # Alternative for setting lwd for points in the plot
    
    grid.newpage()
    grid.draw(g)
    
    grid.force()  # To make the grobs visible to grid editing tools
    
    grid.edit("geom_point.points", grep = TRUE, gp = gpar(lwd = lwd))
    
    0 讨论(0)
提交回复
热议问题