【问题标题】:Legend mixing shapes with geom_points R图例混合形状与 geom_points R
【发布时间】:2020-11-10 08:33:25
【问题描述】:

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

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

谢谢你:)

【问题讨论】:

    标签: r legend geom-point


    【解决方案1】:

    这是您试图制作的一个非常棘手的情节,因为您本质上是将相同的美学映射到不同的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),然后按照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"), 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多