【问题标题】:Legend customization for boxplots箱线图的图例自定义
【发布时间】:2018-02-05 18:09:46
【问题描述】:

我有这个箱线图,然后我试图在上面绘制 2 个不同颜色的不同点,以便用户可以看到它们落在箱线图上的位置,并将它们相互比较。问题是,我希望图例显示两个具有相应颜色的点及其 ID。相反,图例显示的是箱线图类别/颜色。如何覆盖图例以仅显示我想要的内容?这是我的代码:

library(datasets)
library(ggplot2)

data(airquality)
airquality$Month <- factor(airquality$Month,
                       labels = c("May", "Jun", "Jul", "Aug", "Sep"))
airquality$ID <-seq(1:nrow(airquality))
dataPoint <- airquality[11,]
dataPoint2 <- airquality[17,]
plt <- ggplot(airquality, aes(x = Month, y = Ozone, color = Month)) +
  geom_boxplot(show.legend=TRUE,outlier.shape = NA) +
  geom_point(data = dataPoint, color='darkblue', aes(x = Month, y =    Ozone), size = 3,show.legend=TRUE) +
  geom_point(data = dataPoint2, color='darkred', aes(x = Month, y = Ozone), size = 3,show.legend=TRUE) +
  theme(legend.position = "bottom")
plt

【问题讨论】:

  • 与问题无关,但如果您的 x 轴是连续的,我会将调色板从离散更改为更好的东西

标签: r ggplot2 legend boxplot


【解决方案1】:

像这样绘制图形的最简单方法是:

  • 合并dataPoint 数据集(使用rbind)。像这样你只需要打电话给geom_point
  • 对于箱线图,使用填充而不是颜色
  • 使用scale_color_manual定义点颜色

代码:

# Combine datasets
dataPoints <- rbind(dataPoint, dataPoint2)

# Plot
ggplot(airquality, aes(Month, Ozone, fill = Month)) +
    geom_boxplot(outlier.shape = NA) +
    geom_point(data = dataPoints, 
               aes(Month, Ozone, color = factor(ID)), 
               size = 3) +
    labs(color = "ID",
         fill = "Month") +
    scale_color_manual(values = c("darkblue", "darkred")) +
    theme(legend.position = "bottom")

结果:


PS:我不会为月份添加调色板(填充),因为它的信息已经显示在 x 轴上(冗余信息)。要删除填充图例,您可以添加 guides(fill = FALSE)


在 OP 评论后编辑以使用形状:

如果你想要形状而不是颜色

ggplot(airquality, aes(Month, Ozone, fill = Month)) +
    geom_boxplot(outlier.shape = NA) +
    geom_point(data = dataPoints, 
               aes(Month, Ozone, shape = factor(ID)), 
               size = 3) +
    labs(shape = "ID",
         fill = "Month") +
    scale_shape_manual(values = c(15, 17)) +
    theme(legend.position = "bottom")

【讨论】:

  • 谢谢!这适用于我所做的测试用例,但这是一个问题。我提出的原始图表(上图)有带有不同颜色线条的箱线图,没有填充(中间是白色填充)。这就是我需要它们显示的方式。现在,如果 geom_point 和 geom_boxplot 都使用“颜色”来表示差异。颜色,那么我无法通过“guides(fill = FALSE)”删除图例的第二部分。关于如何解决这个问题的任何提示?
  • @AnyaR in geom_point 这样做:geom_point(data = dataPoints, aes(aes(Month, Ozone, fill = factor(ID)), shape = 21)。对于主要的ggplot,将fill = Month 更改为color = Month。在这里,我们将填充更改为颜色。告诉我进展如何。
  • 非常感谢!这行得通!我几乎自己解决了这个问题,但是没有 shape=21 ,无论我的填充说明,点都是黑色的。这个小细节真的很有帮助,谢谢! :)
  • 你有没有机会推荐我如何制作不同形状的两个点(虽然颜色相同?)。我试图做 shape=c(15,17) - 对于正方形和三角形,但这似乎不起作用。 :( 再次挑战我在图例中展示这两种不同形状的挑战 - 在 ID 旁边。提前谢谢!!!
  • @AnyaR 我编辑了我的答案,如果还有什么可以帮助你的,请告诉我:-)
【解决方案2】:

我会通过将这些点映射到不同的美学来实现这一点。如果在这种情况下将show.legend 设置为FALSE,则图例将单独显示。您还可以映射到点形状或任何其他美学。或者,您可以映射箱线图几何的fill,并映射点几何的color

例如:

library(datasets)
library(ggplot2)

data(airquality)
airquality$Month <- factor(airquality$Month,
                       labels = c("May", "Jun", "Jul", "Aug", "Sep"))
airquality$ID <-seq(1:nrow(airquality))
points <- c(11, 17)
airquality$Points <- NA
airquality$Points[points] <- c("Point a", "Point b")
plt <- ggplot(airquality, aes(x = Month, y = Ozone, color = Month)) +
  geom_boxplot(outlier.shape = NA) +
  geom_point(data = airquality[!is.na(airquality$Points), ], 
  mapping=aes(x = Month, y = Ozone, fill = Points), size = 3, shape = 21, inherit.aes=FALSE) +
  theme(legend.position = "bottom")
plt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多