图例混合形状与 geom_points R

Legend mixing shapes with 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, 50, 80, 70, 30, 60)
y2018 <- c(10, 30, 80, 50, 40, 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"))

如果您知道如何解决这个问题,我将不胜感激!!

谢谢:)

你试图制作的这是一个非常棘手的情节,因为你本质上是将相同的美学映射到不同的 geoms。

您应该做的第一件事是将数据重塑为长格式。我还将您的数据集分为 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),然后按照 .

中的建议覆盖它
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"), labels = c("2000", "2008")) +
  scale_shape_manual(values = c(19, 23), labels = c("2000", "2008")) +
  scale_size_manual(values = c(3, 5), labels = c("2000", "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")

另一种更通用的解决方案是避免对 geom_point 使用 fill 美学,而是将形状更改为实心形状:

ggplot(data_bar, aes(x = reorder(alt_name, order_var))) +
  geom_bar(aes(y = value, fill = name), stat = 'identity', color = "black") +
  geom_point(data = data_point, position=position_dodge(width=0.6), aes(y = value, color = name, shape = name, size = name)) +
  scale_fill_manual(values = c("#4F81BD"), labels = c("2018")) +
  scale_colour_manual(values = c("orange", "white"), labels = c("2000", "2008")) +
  scale_shape_manual(values = c(19, 18), labels = c("2000", "2008")) +
  scale_size_manual(values = c(4, 6), labels = c("2000", "2008")) +
  theme(legend.position = "top", legend.title = element_blank()) +
  labs(x = "Industry", y = "Percentage")