geom_line groups和scale_color_manual产生意外错误

时间:2017-05-09 21:13:05

标签: r ggplot2

奇怪的是,我在网上找不到任何解决这个问题的方法。

生成数据:

rm(list = ls())
library(ggplot2)
X <- as.numeric(1:100)
df <- data.frame(x=X,y=rnorm(n=100,sd=.1)+sin(X*pi/200),gp=1)
for (i in 2:4) df <- rbind(df,data.frame(x=X,y=rnorm(n = 100,sd = .1)+sin(X*i*pi/200),gp=i))

此数据框的头部如下:

  x            y gp
1 1  0.030678982  1
2 2  0.108093934  1
3 3  0.067512201  1
4 4  0.186648638  1
5 5  0.109397764  1
6 6 -0.005158247  1

完整性检查:

> unique(df$gp)
[1] 1 2 3 4

现在,我想做的就是用各种对比颜色绘制这4行;即,我不想要以下内容:

> p <- ggplot(data = df,aes(x=x,y=y,group=gp,color=gp))+geom_line()+theme_bw()
> p

Bad Contrast Between Lines

在上面的情节中,传说是可怕的,线条有着可怕的对比。为什么这么难?所以我尝试了以下内容:

> p <- ggplot(data = df,aes(x=x,y=y,group=gp,color=gp))+geom_line()+theme_bw()+scale_color_manual(values = c('red','blue','green','black'))
> p

产生:

Error: Continuous value supplied to discrete scale

如何告诉ggplot只给我各种颜色并将它们应用到每一行(用group=gp标记)?

1 个答案:

答案 0 :(得分:2)

您的分组变量(&#34; gp&#34;)属于数字类型,因此ggplot2很难将一组离散值分配给连续变量。如果你重新分配&#34; gp&#34;作为一个角色或因素,您可以手动调整颜色,如上所述。

rm(list = ls())
library(ggplot2)
X <- as.numeric(1:100)
df <- data.frame(x=X,y=rnorm(n=100,sd=.1)+sin(X*pi/200),gp=1)
for (i in 2:4) df <- rbind(df,data.frame(x=X,y=rnorm(n = 100,sd = .1)+sin(X*i*pi/200),gp=i))

### Classify as character ###
df$gp <- as.character(df$gp)

### Plot ###
p <- ggplot(data = df,aes(x=x,y=y,group=gp,color=gp)) + 
  geom_line() + 
  theme_bw()
plot(p)

enter image description here

### Manually adjust discrete colors ###
p <- p + 
  scale_colour_manual(values = c("red", "blue", "green", "black"))
plot(p)

enter image description here

如果你想留下你的分组变量&#34; gp&#34;在数字中,那么你可以使用&#39; scale_colour_gradient&#39;相反,并指定颜色的书挡以缩放您的线条。

### Reclassify as numeric ###
df$gp <- as.numeric(df$gp)

### Plot ###
p <- ggplot(data = df,aes(x=x,y=y,group=gp,color=gp)) + 
  geom_line() + 
  theme_bw() +
  scale_color_gradient(low = "red", high = "blue")
plot(p)

enter image description here