1

当我使用 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"))

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

谢谢 :)

4

1 回答 1

1

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

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

在此处输入图像描述

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

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

在此处输入图像描述

于 2020-11-10T09:45:03.333 回答