我目前使用following script绘制一个带有一个公共x和两个不同y轴的图:
library(ggplot2)
library(scales)
scaleFactor <- max(mtcars$cyl) / max(mtcars$hp)
ggplot(mtcars, aes(x=disp)) +
labs(title = "My Plot") +
geom_smooth(aes(y=cyl), method="loess", col="blue") +
geom_smooth(aes(y=hp * scaleFactor), method="loess", col="red") +
scale_y_continuous(name="cyl", sec.axis=sec_axis(~./scaleFactor, name="hp"))
问题:
+ scale_x_continuous(expand = c(0, 0))
在上面的示例中工作完美,但是在任何其他给定的时间序列中,它返回*“ as.Date.numeric(value)中的错误:必须提供'origin'”。谢谢!
答案 0 :(得分:4)
请注意,这是两个非常不同的问题,最好将它们分开。
您需要将两个color
放在aes()
内,然后使用theme(legend.position = c(0.9, 0.2))
移动图例。
请注意,现在颜色不再对应(它们只是“标签”),您应该使用scale_color_manual()
定义自己的颜色比例和图例。
ggplot(mtcars, aes(x=disp)) +
labs(title = "My Plot") +
geom_smooth(aes(y=cyl, col="blue"), method="loess") +
geom_smooth(aes(y=hp * scaleFactor, col="red"), method="loess") +
scale_y_continuous(name="cyl", sec.axis=sec_axis(~./scaleFactor, name="hp")) +
theme(legend.position = c(0.9, 0.2)) +
scale_x_continuous(expand = c(0, 0))
as.Date.numeric(value)中的错误:必须提供'origin'”
可能是因为在这种情况下x
是as.Date
类型,所以scale_x_date(expand = c(0, 0))
有效。
这里有个例子:
set.seed(123)
dat <- data.frame(
dates = seq(from=as.Date("2018-01-01"), to=as.Date("2018-01-10"), by="day"),
val1 = sample(10),
val2 = sample(10)
)
ggplot(dat, aes(x=dates)) +
geom_line(aes(y=val1, color = "red")) +
geom_line(aes(y=val2, color = "blue")) +
theme(legend.position = c(0.9, 0.2)) +
scale_x_date(expand = c(0,0)) +
scale_y_continuous(name="val2", sec.axis=sec_axis(~./1, name="val2"))
答案 1 :(得分:1)
要添加到RLave的答案中,您将注意到的图例中分配的标签与颜色不对应。要更改此设置,请将col=
中的aes
命令分配给标签文本,然后添加scale_fill_manual
以选择颜色:
ggplot(mtcars, aes(x=disp)) +
labs(title = "My Plot") +
geom_smooth(aes(y=cyl, col="cyl"), method="loess") +
geom_smooth(aes(y=hp * scaleFactor, col="hp"), method="loess") +
scale_color_manual(values = c("blue", "red"))+
scale_y_continuous(name="cyl", sec.axis=sec_axis(~./scaleFactor, name="hp"))