ggplot:添加图例并删除图形的填充

时间:2018-12-06 13:16:28

标签: r ggplot2 time-series legend

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

enter image description here

问题:

  1. 如何在图的左上方添加图例?
  2. 如何删除x轴左右的间距?注意:+ scale_x_continuous(expand = c(0, 0))在上面的示例中工作完美,但是在任何其他给定的时间序列中,它返回*“ as.Date.numeric(value)中的错误:必须提供'origin'”。

谢谢!

2 个答案:

答案 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)) 

enter image description here

  

as.Date.numeric(value)中的错误:必须提供'origin'”

可能是因为在这种情况下xas.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"))

enter image description here

答案 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"))