根据y值连续颜色的geom_line

Ste*_*ell 6 r ggplot2

如果你看这个

在此输入图像描述

ggplot(mtcars,aes(x=disp,y=mpg,colour=mpg))+geom_line()
Run Code Online (Sandbox Code Playgroud)

你会看到线条颜色根据相应的y值而变化,这是我想要的,但只是逐段.我希望颜色根据y值连续变化.任何简单的方法?

Hen*_*rik 7

想到的一种可能性是使用插值来创建更多的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)

  • 谢谢,就是这样.我想到插值但不知道约()会让它变得如此简单! (2认同)

PoG*_*bas 5

从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)

在此输入图像描述