如何解决图例混合形状与geom_points R
当我使用ggplot2在R中绘制图形时,我的图例无法正确显示。我的数据集的一列由geom_bar表示,另外两列由geom_points(每个形状一个)表示。圆形和菱形分别显示了2000年和2008年,两个年度中的圆圈都在直径上。但是,该图完全可以正常工作...
这是屏幕截图:
我已经创建了数据集的简化版本:
order_var <- c(1,4,3,5,6,2)
alt_name <- c('Agriculture','Mining','Food products',' Manufacture','Chemicals','Machinery')
y2000 <- c(20,40,50,80,30,70)
y2008 <- c(40,70,60)
y2018 <- c(10,50)
datatest <- data.frame("order_var" = order_var,"alt_name" = alt_name,"y2000" = y2000,"y2008" = y2008,"y2018" = y2018)
还有我的图的代码:
datatest %>% ggplot(aes(x = reorder(alt_name,order_var))) +
geom_bar(stat = "identity",aes(y = `y2018`,fill = "2018"),width = 0.7,col = "black") +
geom_point(aes(y = `y2008`,col = "2008"),shape = 23,fill = "white",size = 5) +
geom_point(aes(y = `y2000`,col = "2000"),shape = 19,fill = "black",size = 3) +
xlab("Industry") +
ylab("Percentage") +
theme(legend.position = "top") +
scale_fill_manual(name = '',values = c("2018" = "#4F81BD"),breaks = c("2018")) +
scale_colour_manual(name = '',values = c("2008" = "black","2000" = "orange"))
如果您知道如何解决此问题,我将不胜感激!
谢谢:)
解决方法
这是您要制作的非常棘手的情节,因为您本质上是将相同的美感映射到不同的geom
。
您应该做的第一件事是将数据重整为长格式。我还将您的数据集划分为2018年(条形)和2000年,2008年(点)。
df2 <- datatest %>%
pivot_longer(cols = -c(order_var,alt_name)) %>%
mutate(bar = if_else(name == "y2018",1,0))
data_bar <- df2 %>% filter(bar == 1)
data_point <- df2 %>% filter(bar != 1)
我还发现在点上加一个躲闪很有用,以避免像在使用position = position_dodge(width = 0.6)
的化学药品中那样相互重叠。
第一个解决方案提供了您想要的东西,但这有点麻烦,我不建议您将其作为一般策略。基本上,您会在条形图上添加不使用的美学元素(在这种情况下为linetype
),然后按照this answer中的建议进行覆盖。
ggplot(data_bar,aes(x = reorder(alt_name,order_var))) +
geom_bar(aes(y = value,linetype = name),fill = "#4F81BD",stat = 'identity',color = 'black') +
geom_point(data = data_point,position=position_dodge(width=0.6),aes(y = value,color = name,shape = name,size = name,fill = name)) +
scale_colour_manual(values = c("orange","black"),labels = c("2000","2008")) +
scale_fill_manual(values = c("orange","white"),"2008")) +
scale_shape_manual(values = c(19,23),"2008")) +
scale_size_manual(values = c(3,5),"2008")) +
scale_linetype_manual(values = 1,guide = guide_legend(override.aes = list(fill = c("#4F81BD"))),labels = c("2018")) +
theme(legend.position = "top",legend.title = element_blank()) +
labs(x = "Industry",y = "Percentage")
另一种更通用的解决方案是避免对fill
使用geom_point
美学,而是将形状改为实心形状:
ggplot(data_bar,fill = name),color = "black") +
geom_point(data = data_point,size = name)) +
scale_fill_manual(values = c("#4F81BD"),labels = c("2018")) +
scale_colour_manual(values = c("orange",18),"2008")) +
scale_size_manual(values = c(4,6),"2008")) +
theme(legend.position = "top",y = "Percentage")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。