ggplot2中的图例错误,并且基于同一数据集的一张图中有两种不同的图类型

时间:2019-04-15 10:58:06

标签: r ggplot2

请考虑以下内容:

我想在使用geom_step()的图形中绘制一条逐步曲线(使用geom_line())和一些平滑线(使用ggplot2)。

我设法创建了一个图形,但是标签错误并且无法使用scale_color_discrete()进行纠正。

所需结果:根据数据(见下文),“ hello”行是最上面一行,然后是“ foo”和“ bar”,但标签不正确。另外,我还需要一个标签,用于geom_step()曲线。

问题:我在做什么错了?


可复制的示例:

library(ggplot2)

# Data
db <- data.frame(time = 0:100,
                 step = 1-pexp(0:100, rate = 1),
                 foo = 1-pexp(0:100, rate = 0.4),
                 bar = 1-pexp(0:100, rate = 0.5),
                 hello = 1-pexp(0:100, rate = 0.1)
                 )

# Plotted with wrong labels (automatically)
ggplot(data = db, aes(x = time, y = step)) +
        geom_step(show.legend = T) + 
        geom_line(aes(x = time, y = foo, col = "red")) +
        geom_line(aes(x = time, y = bar, col = "blue")) +
        geom_line(aes(x = time, y = hello, col = "green"))

看着标签,已经可以看到颜色的描述和线条的颜色不匹配。

# Still wrong labels
ggplot(data = db, aes(x = time, y = step)) +
        geom_step(show.legend = T) + 
        geom_line(aes(x = time, y = foo, col = "red")) +
        geom_line(aes(x = time, y = bar, col = "blue")) +
        geom_line(aes(x = time, y = hello, col = "green")) +
        scale_color_discrete(name = "Dose", labels = c("foo", "bar", "hello"))

更改标签显然无济于事。

reprex package(v0.2.0)于2019-04-15创建。

1 个答案:

答案 0 :(得分:3)

您正在指定要在美学调用中使用的颜色。这意味着您将颜色与标签“红色”匹配,而不使用颜色“红色”。 您可以通过以下方式解决此问题:

p <- ggplot(data = db, aes(x = time, y = step)) +
  geom_step(aes(color = "step")) + 
  geom_line(aes(y = foo, color = "foo")) +
  geom_line(aes(y = bar, color = "bar")) +
  geom_line(aes(y = hello, color = "hello"))

p

enter image description here

请注意,我丢弃了x = time,因为它是在每个步骤中从ggplot调用继承而来的。如果要更改每行的颜色,现在应使用scale_color_manual这样的代码,如下所示:

p  +
  scale_color_manual(name = "Dose", 
                     values = c("step" = "black", "foo" = "red", 
                                "bar" = "blue", "hello" = "green"))

enter image description here

另一种选择是将数据转换为长格式:

library(tidyr)
library(dplyr)

new_db <- gather(db, type, value, -time)

ggplot(data = filter(new_db, type != "step"), aes(x = time, y = value, color = type)) +
  geom_line() +
  geom_step(data = filter(new_db, type == "step"))

enter image description here