如果你看这个

ggplot(mtcars,aes(x=disp,y=mpg,colour=mpg))+geom_line()
Run Code Online (Sandbox Code Playgroud)
你会看到线条颜色根据相应的y值而变化,这是我想要的,但只是逐段.我希望颜色根据y值连续变化.任何简单的方法?
想到的一种可能性是使用插值来创建更多的x值和y值,从而使颜色更加连续.我用approx"线性插值给定的数据点".这是一个更简单的数据集的示例:
# original data and corresponding plot
df <- data.frame(x = 1:3, y = c(3, 1, 4))
library(ggplot2)
ggplot(data = df, aes(x = x, y = y, colour = y)) +
geom_line(size = 3)
Run Code Online (Sandbox Code Playgroud)
# interpolation to make 'more values' and a smoother colour gradient
vals <- approx(x = df$x, y = df$y)
df2 <- data.frame(x = vals$x, y = vals$y)
ggplot(data = df2, aes(x = x, y = y, colour = y)) +
geom_line(size = 3)
Run Code Online (Sandbox Code Playgroud)

如果希望渐变更平滑,可以使用n参数in approx来调整要创建的点数("插值发生在n跨越间隔[ min(x), max(x)]"的等间隔点上).使用更多数值,可能geom_point会提供更平滑的外观:
vals <- approx(x = df$x, y = df$y, n = 500)
df2 <- data.frame(x = vals$x, y = vals$y)
ggplot(data = df2, aes(x = x, y = y, colour = y)) +
geom_point(size = 3)
Run Code Online (Sandbox Code Playgroud)
从ggplot2v0.8.5开始,可以使用geom_line或geom_path不同的lineend选项(现在有三个选项:round、butt和square)。选择取决于数据的性质。
round可以在锋利的边缘上工作(比如给定的 OP 数据):
library(ggplot2)
ggplot(mtcars, aes(disp, mpg, color = mpg)) +
geom_line(size = 3, lineend = "round")
Run Code Online (Sandbox Code Playgroud)
square将适用于更连续的变量:
df <- data.frame(x = seq(0, 100, 10), y = seq(0, 100, 10) ^ 2)
ggplot(data = df, aes(x = x, y = y, colour = y)) +
geom_path(size = 3, lineend = "square")
Run Code Online (Sandbox Code Playgroud)