When using ggplot, I can set shape
to 21-25 to get shapes that have independent setting for the internal (fill
) and border (col
) colors, like so:
df <- data.frame(id=runif(12), x=1:12, y=runif(12)) ggplot(df, aes(x=x, y=y)) + geom_point(aes(fill=id, size=id), colour="black", shape=21)
However, I can't figure out how to control the thickness of the shape borders, either setting them absolutely or as an aesthetic mapping. I note that if I set an lwd
value, it overrides the size
aesthetic:
ggplot(df, aes(x=x, y=y)) + geom_point(aes(fill=id, size=id), colour="black", shape=21, lwd=2)
How do I control the border thickness?
Now to change the thickness of border, we simply use a parameter inside geom_point() function called stroke, which specify the thickness of the border of points in Scatterplot.
To change line width, just add argument size=2 to geom_line().
Change point shapes, colors and sizes manually : The functions below can be used : scale_shape_manual() : to change point shapes. scale_color_manual() : to change point colors. scale_size_manual() : to change the size of points.
geom_point.Rd. The point geom is used to create scatterplots. The scatterplot is most useful for displaying the relationship between two continuous variables.
It feels a bit hacky but you can add a "background" set of dots with the size set to the aesthetic mapping plus some small constant to enlarge the border of the dots. Play with the constant to get the desired border width.
You'll also have to disable the size legend to stop it displaying the legend on the graph...
ggplot(df, aes(x=x, y=y)) + geom_point(aes(size=id+0.5), colour="black" , show_guide = FALSE )+ scale_size( guide = "none" )+ geom_point(aes(fill=id, size=id), colour="black", shape=21)
Starting in version 2.0.0 of ggplot2, there is an argument to control point border thickness. From the NEWS.md
file:
geom_point() gains a stroke aesthetic which controls the border width of shapes 21-25 (#1133, @SeySayux). size and stroke are additive so a point with size = 5 and stroke = 5 will have a diameter of 10mm. (#1142)
Thus, the correct solution to this is now:
df <- data.frame(id=runif(12), x=1:12, y=runif(12)) ggplot(df, aes(x=x, y=y)) + geom_point(aes(fill=id, size=id), colour="black", shape=21, stroke = 2)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With