ggplot图例顺序不匹配

3
我是R/ggplot的新手,已经在StackOverflow上搜索了类似的问题,但没有结果。对于这个家里的ggplot专家来说,这可能是一个微不足道的问题,如果是这样,我期待着快速回答!
所以,我正在尝试从存储在数据框中的变量绘制4条曲线,并玩弄颜色和线型。不幸的是,图例标签与曲线不匹配,这使得整个图例失去了意义。
这是图形: 4 curves with mismatched labels 这是生成它的代码:
# declare variables
alpha = 0.5
m = 500
x = seq(m)
fdr_thresh = x/m*alpha
lvl_thresh = rep(alpha,m)
pvals = sin(2*pi*x/20)
pvalsA = exp(-x/100)*cos(2*pi*x/20)

# plot
df <- data.frame(pvals=pvals, pvalsA = pvalsA, FDR = fdr_thresh, level = lvl_thresh, x=x)
p4 <- ggplot(data = df) + geom_line(aes(x=x, y=pvals,color="Pure Sinusoid",linetype="Pure Sinusoid"))
p4 <- p4 + geom_line(aes(x=x, y=pvalsA,color="Damped Sinusoid",linetype="Damped Sinusoid"))
p4 <- p4 + geom_line(aes(x=x, y=FDR,color = 'FDR', linetype='FDR')) 
p4 <- p4 + geom_line(aes(x=x, y=level,color='alpha',linetype='alpha'))  
p4 = p4+ scale_linetype_manual(name = "Significance", values=c("Pure Sinusoid"= 1,"Damped Sinusoid" = 1,"FDR" = 2,"alpha" = 3),labels=c("Pure Sinusoid", "Damped Sinusoid", "Sloping line",bquote(alpha == .(alpha))))
p4 = p4 + scale_color_manual(name = "Significance",values=c("Pure Sinusoid"= "Chocolate1","Damped Sinusoid" = 'Chartreuse4',"FDR" = "black","alpha" = "black") , labels=c("Pure Sinusoid", "Damped Sinusoid", "Sloping line",bquote(alpha == .(alpha))))
p4 <- p4 +  theme(legend.position = c(0.7, 0.8),legend.title=element_blank(),legend.key = element_rect(fill = "transparent",colour = "transparent"),legend.background = element_rect(fill=alpha('white', 0.8)))
show(p4)

我希望你能给我一个提示,如何更好地做到这一点。在Matlab或Python中相同的绘图是正确的,并且只需要15分钟,所以我必须在某个地方做出了错误的决定。(不,选择R不是那个决定:这是我学习它的一部分)


什么是“不匹配”,正确的匹配应该是什么?R将您的美学变量映射到图例中,因此,除非您在那里分配了错误的内容,否则不应出现“不匹配”。 - Cyrus Mohammadian
抱歉,我认为那是不言自明的。传说中的“纯正正弦波”对应着黑色虚线曲线上的“Alpha = 0.5”,反之亦然(橙色曲线应该标记为“纯正正弦波”,但实际上被标记为“Alpha = 0.5”)。 - El Niño
2个回答

6
"正确的"做法是将您的数据集融合成一个长数据框,然后让ggplot为您绘制多条线,而不是分别发出单独的geom_line()调用...
# plot
df <- data.frame(pvals, pvalsA, FDR = fdr_thresh, level = lvl_thresh, x)

mm <- reshape2::melt(df,id.var="x")
my.labs <- c("Pure Sinusoid","Damped Sinusoid","Sloping line",
           bquote(alpha==.(alpha)))
p4 <- ggplot(data = mm, aes(x,value,colour=variable,linetype=variable)) +
    geom_line()
p4 <- p4 + scale_linetype_manual(name="Significance",values=c(1,1,2,3),
          labels=my.labs)
p4 <- p4 + scale_color_manual(name = "Significance",
                  values=c("Chocolate1",'Chartreuse4',"black","black"),
                  labels=my.labs)
p4 <- p4 +  theme(legend.position = c(0.7, 0.8),
                  legend.title=element_blank(),
                  legend.key = element_rect(fill = "transparent",
                                            colour = "transparent"),
          legend.background = element_rect(fill=alpha('white', 0.8)))
show(p4)

图片描述在这里输入

(我已经在当前的R会话中设置了theme_bw(),这就是为什么灰色背景和网格线没有显示出来的原因...)


2
……唉,我希望有一种方法可以看到其他人是否正在回答问题。我离完成只差1分钟了。像往常一样,解释得很好! - Gregor Thomas
“直观”是因人而异的。ggplot确实需要一些时间来适应/转变思维方式。并不是每个人都喜欢它(我喜欢)。 - Ben Bolker

2
问题在于您在映射变量标签时添加了错误的顺序。
dp4 <- ggplot(data = df) + geom_line(aes(x=x, y=pvals,color="Pure Sinusoid",linetype="Pure Sinusoid"))
p4 <- p4 + geom_line(aes(x=x, y=pvalsA,color="Damped Sinusoid",linetype="Damped Sinusoid"))
p4 <- p4 + geom_line(aes(x=x, y=FDR,color = 'FDR', linetype='FDR')) 
p4 <- p4 + geom_line(aes(x=x, y=level,color='alpha',linetype='alpha'))  

p4 <- p4+ scale_linetype_manual(name = "Significance", values=c("Pure Sinusoid"= 1,"Damped Sinusoid" = 1,"FDR" = 2,"alpha" = 3),labels=c(bquote(alpha == .(alpha)), "Damped Sinusoid", "Sloping line","Pure Sinusoid"))

p4 <- p4 + scale_color_manual(name = "Significance",values=c("Pure Sinusoid"= "Chocolate1","Damped Sinusoid" = 'Chartreuse4',"FDR" = "black","alpha" = "black") , labels=c(bquote(alpha == .(alpha)), "Damped Sinusoid", "Sloping line","Pure Sinusoid"))

p4 <- p4 +  theme(legend.position = c(0.7, 0.8),legend.title=element_blank(),legend.key = element_rect(fill = "transparent",colour = "transparent"),legend.background = element_rect(fill=alpha('white', 0.8)))
show(p4)

enter image description here


1
不应该这样做...它们会根据因子变量固有的顺序进行映射--如果您愿意,可以更改顺序。 ggplot2遵循图形语法逻辑--即分层图形。这些层是彼此独立的。 - Cyrus Mohammadian
1
绘图顺序与标签顺序无关!绘图顺序改变了前景和背景的位置。标签顺序由数据固有的顺序定义(除非您告诉它其他顺序,默认情况下为按字母顺序)。 - Gregor Thomas
我理解这个观点。我原以为标签顺序应该与数据帧中的列顺序对齐;你是在告诉我这个顺序是虚假的吗?那么指定一个顺序最简单的方法是什么? - El Niño
@El Nino 注意,Ben的答案和我的答案有不同顺序的图例。您可以查看我们两个脚本以了解差异所在。这种差异是如何分配它们的方式,我在我的答案中没有分配不同的顺序,我只是按照预定的顺序(字母顺序)进行了操作。 - Cyrus Mohammadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接