奇怪的是,我在网上找不到任何解决这个问题的方法。
生成数据:
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
在上面的情节中,传说是可怕的,线条有着可怕的对比。为什么这么难?所以我尝试了以下内容:
> 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
标记)?
答案 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)
### Manually adjust discrete colors ###
p <- p +
scale_colour_manual(values = c("red", "blue", "green", "black"))
plot(p)
如果你想留下你的分组变量&#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)