如何在ggplot2的geom_freqpoly中正确增加线条粗细?
解决geom_freqpoly线条粗细调整的问题
问题背景
你在使用ggplot2的geom_freqpoly绘制频率多边形时,遇到了线条粗细调整的麻烦:当把size = 4放在aes()参数里时,线条变得过粗,而且数值无法被识别为毫米单位,同时多数找到的解决方案都是针对geom_line或geom_point的,不知道该怎么适配geom_freqpoly。
你的原代码如下:
library(ggplot2) ggplot(data = test4) + geom_freqpoly(aes(size= 4, x=value, color = variable), binwidth = 25, boundary=-0.5) + ggtitle("Freqpoly plot") + labs(y = "Count", x="Length") + scale_color_brewer("Species", palette = "Set2") + scale_x_continuous(breaks = seq(0,4000,500), labels = c("0", "500","1000","1500","2000","2500", "3000","3500",">4000"))+ scale_y_continuous(breaks = seq(0,1400,100)) + theme_linedraw(base_size = 18)+ theme(plot.title = element_text(hjust = 0.5), axis.title.x = element_text(margin = margin(25,15,15,15,"pt")), axis.title.y = element_text(margin = margin(15,15,15,15,"pt"))) + theme(legend.text = element_text(face = "italic"))
测试数据样例:
test4 <- data.frame( variable = rep("C.rip", 6), value = c(574, 269, 111, 79, 504, 252) )
核心原因
你把size放在aes()里是错误的——aes()内部的参数是用来映射数据变量的,不是设置固定的视觉样式。你写size=4时,ggplot会把它当成一个常量变量,而不是直接设置线条粗细,所以才会出现线条过粗且单位不生效的问题。
解决方案
把size参数从aes()中移出来,直接放在geom_freqpoly()的外层参数里,这样就能设置固定的线条粗细,单位默认是毫米,你可以根据需求调整数值(比如size=1.5是比较适中的粗细)。
修改后的完整代码:
library(ggplot2) test4 <- data.frame( variable = rep("C.rip", 6), value = c(574, 269, 111, 79, 504, 252) ) ggplot(data = test4) + # 把size移到aes外面,设置固定粗细 geom_freqpoly(aes(x=value, color = variable), size=1.5, binwidth = 25, boundary=-0.5) + ggtitle("Freqpoly plot") + labs(y = "Count", x="Length") + scale_color_brewer("Species", palette = "Set2") + scale_x_continuous(breaks = seq(0,4000,500), labels = c("0", "500","1000","1500","2000","2500", "3000","3500",">4000"))+ scale_y_continuous(breaks = seq(0,1400,100)) + theme_linedraw(base_size = 18)+ theme(plot.title = element_text(hjust = 0.5), axis.title.x = element_text(margin = margin(25,15,15,15,"pt")), axis.title.y = element_text(margin = margin(15,15,15,15,"pt"))) + theme(legend.text = element_text(face = "italic"))
额外提示
如果需要针对不同的variable设置不同的线条粗细,那才需要把size放在aes()里,再配合scale_size_manual()来指定对应的值,比如:
geom_freqpoly(aes(x=value, color = variable, size=variable), binwidth = 25, boundary=-0.5) + scale_size_manual(values = c("C.rip"=1.5, "其他物种"=2))
内容的提问来源于stack exchange,提问作者voiDnyx
相关产品推荐
相关产品推荐

