添加geom_hline图例而不会搞砸geom_line图例

时间:2015-06-12 16:23:46

标签: r ggplot2 legend

我正在尝试绘制一个简单的(scree)-plot,其中包含一些额外的geom_hlinegeom_vline

问题是:无论何时我添加show_guide=TRUE 都会向aes()添加一些geom_xline,我搞砸了原始传奇。

这是一些(丑陋)假数据:

exdf <- data.frame(rep(x=1:12, times = 3), rep(x = c("A", "B", "C"), times = 6), rnorm(36), stringsAsFactors = FALSE)
colnames(exdf) <- c("PC", "variable", "eigenvalue") 

这是我的情节:

g <- ggplot(data = exdf, mapping = aes(x = factor(PC), y = eigenvalue))
g <- g + geom_line(mapping = aes(group = factor(variable), linetype = variable))
g <- g + geom_vline(xintercept = 7, colour = "green", show_guide = TRUE)

enter image description here enter image description here

如何在不污染其他图例的情况下为geom_vline添加单独的图例?

无法解决为什么一个图层的颜色会改变另一个图例的颜色。

2 个答案:

答案 0 :(得分:2)

这部分解决了这个问题:

g <- ggplot(data = exdf, mapping = aes(x = factor(PC), y = eigenvalue))
g <- g + geom_line(mapping = aes(group = factor(variable), linetype = variable))
g <- g + geom_vline(aes(xintercept = x, colour = Threshold), data.frame(x = 7, Threshold = "A"), show_guide = TRUE) + scale_colour_manual(values = c(A = "green")

enter image description here

但是传说仍然会有变量部分的十字架,尽管不是绿色部分。

或者,您可以使用带有两行的新数据框的geom_line,两行的x和y相同,等于数据的下限和上限。这将为您提供一个图例,该图例的阈值为水平绿线,没有垂直线。

答案 1 :(得分:0)

根据@Nick K在上面的建议,这里有一种方法可以通过不同的data =对不同的图层使用干净的图例

exdf <- data.frame(rep(x=1:12, times = 3), rep(x = c("A", "B", "C"), times = 6), rnorm(36), stringsAsFactors = FALSE)

colnames(exdf)&lt; - c(&#34; PC&#34;,&#34;变量&#34;,&#34;特征值&#34;)     g&lt; - ggplot()     g&lt; -g + geom_line(data = exdf,mapping = aes(x = factor(PC),y = eigenvalue,group = factor(variable),linetype = variable))     G     阈值&lt; - data.frame(阈值=&#34;阈值-A&#34;,PC = 7,ymin = min(exdf $ eigenvalue),ymax = max(exdf $ eigenvalue))     g&lt; -g + geom_linerange(data = thresholds,mapping = aes(x = PC,ymin = ymin,ymax = ymax,color = threshold))     克

的产率:

clean-legend

注意:

  • 我知道,原始数据exdf是愚蠢的,并且是一个丑陋的情节;这不是重点。
  • 请注意,您必须为两个图层设置data =参数,并将第一个g <- ggplot()保留为空,否则ggplot2会对数据框感到困惑。
  • 是的,它是一个黑客工作(见下文),它也不会填充情节的y高度,因为geom_vline应该。

作为附加组件,(不是解决方案!),这里 应如何与geom_vline一起使用:

exdf <- data.frame(rep(x=1:12, times = 3), rep(x = c("A", "B", "C"), times = 6), rnorm(36), stringsAsFactors = FALSE)
colnames(exdf) <- c("PC", "variable", "eigenvalue") 
g <- ggplot()
g <- g + geom_line(data = exdf, mapping = aes(x = factor(PC), y = eigenvalue, group = factor(variable), linetype = variable))
g
g + geom_vline(data = thresholds, mapping = aes(xintercept = PC, color = threshold), show_guide = TRUE)

的产率:

messy legend via geom_vline

如同geom_vline所期望的那样填充y高度,但以某种方式会弄乱variable的传说(注意垂直线)。

不知道为什么会这样,对我来说感觉就像一个小虫。 报道了这里:https://github.com/hadley/ggplot2/issues/1267