更改堆叠的ggplot图例中的geom顺序

时间:2017-12-05 22:45:20

标签: r ggplot2 legend layer

我正在尝试使用ggplot为我的图形更改我的图例显示点和线的顺序。

目前我的图表本身首先显示点,然后点在点的顶部,这就是我想要的。这是一个可重复的例子:

ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
  geom_point(aes(colour = Species, shape = Species)) +
  geom_smooth()

enter image description here

从图例中可以看出,它已按照绘制的顺序重叠了值,但我想反过来。我知道我可以按照以下方式覆盖情节顶部的点:

ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
  geom_smooth() +
  geom_point(aes(colour = Species, shape = Species)) 

enter image description here

我搜索了here中的guides(fill = guide_legend(reverse = TRUE))函数,但这没有效果。

任何帮助非常感谢

2 个答案:

答案 0 :(得分:2)

根据我在ggplot descriptions中所读到的内容,我不相信这可以设置覆盖ggplot图例的顺序。在guides函数中,您可以使用order参数设置单独指南的顺序,它会解释:

  

“小于99的正整数,用于指定多个指南中此指南的顺序。它控制显示多个指南的顺序,而不是指南本身的内容。如果为0(默认),则顺序由秘密算法。“

通过以下方式实现您想要的目标对我来说似乎最容易:

  1. 使用legend=FALSE来抑制某些图例
  2. 多次绘制一些图层。
  3. 在下面的示例中,geom_smooth被绘制两次。一旦创建图例背景,然后再覆盖数据。第二次绘制时,图例不会显示:

    ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
      geom_smooth() +
      geom_point(aes(colour = Species, shape = Species)) +
      geom_smooth(show.legend = FALSE)
    

    enter image description here

    另一种方法是使每个数据集的线颜色发生变化。这需要更少的游戏并且更清楚地理解,所以我可能会这样做:

    ggplot(iris, aes(Sepal.Width, Petal.Width, colour = Species, shape = Species, linetype = Species)) +
      geom_point(aes())  +
      geom_smooth(aes())
    

    enter image description here

答案 1 :(得分:1)

这里有两种方法可以操作绘制图例中的凹凸的顺序,但这两种方法都不是直截了当的。

第一个使用ggplot的gtable。布局数据框中的列“z”给出了绘制凹凸的顺序。但是必须到达图例本身的布局数据框才能操纵图例的凹凸。像这样:

library(ggplot2)
library(gtable)
library(grid)

df = read.table(text = 
"School      Year    Value 
 A           1998    5
 B           1999    10
 C           2000    15
 A           2000    7
 B           2001    15
 C           2002    20", sep = "", header = TRUE)

p <- ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
  geom_point(aes(colour = Species, shape = Species), size = 2) +
  geom_smooth()

# Get the ggplot grob
gt <- ggplotGrob(p)

# Get the legend
leg <- gt$grobs[gt$layout$name == "guide-box"][[1]]$grobs[[1]]

# Check the layout
leg$layout

第4行和第5行绘制第一个图例键,但它首先绘制点(key-3-1-1)然后绘制线段(key-3-1-2)。交换z值将确保首先绘制线段,然后绘制点。同样,对于7号线和7号线。 8和10行和10号线11。

# Swap the z-values for the relevant lines in the layout table
leg$layout[c(4:5, 7:8, 10:11), "z"] <- c(5:4, 8:7, 11:10)

# Put legend back into ggplot grob
gt$grobs[gt$layout$name == "guide-box"][[1]]$grobs[[1]] <- leg

# Draw it
grid.newpage()
grid.draw(gt)

第二种方法使用网格编辑功能来改变顺序。

# Get the ggplot grob
gt <- ggplotGrob(p)

# Get the legend grob
leg = getGrob(grid.force(gt), gPath("guides"), grep = TRUE)

# Get a list of grobs (in the legend).
# This also gives the order.
grid.ls(grid.force(leg))

# Nearly the same names for the grobs, 
#   and the same order as before 
#   (don't count the indented grobs).

# Change the order in which grobs are drawn
leg = reorderGrob(leg,  c(5:4, 8:7, 11:10), back = FALSE)

# Remove the original legend and replace with the new legend
gt = removeGrob(grid.force(gt), "guides", grep = TRUE)
gt = addGrob(gt, leg, "guide-box", grep = TRUE)

# Draw the plot
grid.newpage()
grid.draw(gt)

enter image description here