1

我试图在同一张图上从我的数据集中绘制 3 条线,并使用 ggplot2 显示它们。我想手动设置每条线的颜色和形状。

问题是颜色/形状是根据标签的字典顺序设置的,我似乎无法控制所选择的内容。

这是我尝试过的:

px <- 
    ggplot(dataset) + 
    stat_smooth(aes(x=id, y=dataset[,4], colour="2000",  linetype="2000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,3], colour="500",  linetype="500"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,2], colour="1000", linetype="1000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +    
    theme(legend.title=element_blank()) +
    xlab("x") +
    ylab("y") +
    ggtitle("px") 

py <- 
    ggplot(dataset) + 
    stat_smooth(aes(x=id, y=dataset[,4], colour="1000",  linetype="1000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,3], colour="500",  linetype="500"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,2], colour="2000", linetype="2000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +    
    theme(legend.title=element_blank()) +
    xlab("x") +
    ylab("y") +
    ggtitle("py") 
pz <- 
    ggplot(dataset) + 
    stat_smooth(aes(x=id, y=dataset[,4], colour="B1000",  linetype="B1000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,3], colour="C500",  linetype="C500"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +
    stat_smooth(aes(x=id, y=dataset[,2], colour="A2000", linetype="A2000"),se=FALSE, size=1, span=0.1, level=0.90, method="loess") +    
    theme(legend.title=element_blank()) +
    ylab("y") +
    xlab("x") +
    ggtitle("pz") 

这就是我得到的:

在此处输入图像描述

我的数据如下所示:

> head(dataset)
  id  A  B  C
1  1  0 26 44
2  2  0  0  0
3  3  0  0 46
4  4 26 22  0
5  5 16  0  0
6  6  0  0 30

我想要像最后一个一样的东西,在图例框上具有这些精确的颜色、形状和顺序,但不必在每个标签前加上 ABC。

我怎样才能做到这一点?

PS:即使我使用的是 stat_smooth,geom_line 也会发生同样的情况

4

1 回答 1

6

您的问题是因为这不是ggplot2中的工作方式。如果您曾经[在里面使用过,aes()那肯定表明您做错了。

我们不是对单个 3 个单独的调用geom,而是融合一个数据框,然后将变量映射到美学。

dat <- read.table(text = "  id  A  B  C
 1  1  0 26 44
 2  2  0  0  0
 3  3  0  0 46
 4  4 26 22  0
 5  5 16  0  0
 6  6  0  0 30",header = TRUE,sep = "")

require(reshape2)
datm <- melt(dat,id.vars = 'id')
datm$variable <- factor(datm$variable,levels = c('C','A','B'))

ggplot(datm) + 
    geom_line(aes(x = id,y = value,colour = variable,linetype = variable))

我在geom_line这里使用过,因为您的示例数据太小而无法使用geom_smooth,但它的工作方式相同。融化数据后,您可以通过调整因子级别的顺序来控制顺序。

A当然,您总是可以将级别更改为其他级别C

于 2013-08-09T15:52:14.610 回答