请考虑以下内容:
我想在使用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创建。
答案 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
请注意,我丢弃了x = time
,因为它是在每个步骤中从ggplot
调用继承而来的。如果要更改每行的颜色,现在应使用scale_color_manual
这样的代码,如下所示:
p +
scale_color_manual(name = "Dose",
values = c("step" = "black", "foo" = "red",
"bar" = "blue", "hello" = "green"))
另一种选择是将数据转换为长格式:
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"))