微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

图例混合形状与geom_points R

如何解决图例混合形状与geom_points R

当我使用ggplot2在R中绘制图形时,我的图例无法正确显示。我的数据集的一列由geom_bar表示,另外两列由geom_points(每个形状一个)表示。圆形和菱形分别显示了2000年和2008年,两个年度中的圆圈都在直径上。但是,该图完全可以正常工作...

这是屏幕截图:

enter image description here

我已经创建了数据集的简化版本:

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")

enter image description here

另一种更通用的解决方案是避免对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")

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。