我正在尝试使用ggplot为我的图形更改我的图例显示点和线的顺序。
目前我的图表本身首先显示点,然后点在点的顶部,这就是我想要的。这是一个可重复的例子:
ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
geom_point(aes(colour = Species, shape = Species)) +
geom_smooth()
从图例中可以看出,它已按照绘制的顺序重叠了值,但我想反过来。我知道我可以按照以下方式覆盖情节顶部的点:
ggplot(iris, aes(Sepal.Width, Petal.Width, linetype = Species)) +
geom_smooth() +
geom_point(aes(colour = Species, shape = Species))
我搜索了here中的guides(fill = guide_legend(reverse = TRUE))
函数,但这没有效果。
任何帮助非常感谢
答案 0 :(得分:2)
根据我在ggplot descriptions中所读到的内容,我不相信这可以设置覆盖ggplot图例的顺序。在guides
函数中,您可以使用order
参数设置单独指南的顺序,它会解释:
“小于99的正整数,用于指定多个指南中此指南的顺序。它控制显示多个指南的顺序,而不是指南本身的内容。如果为0(默认),则顺序由秘密算法。“
通过以下方式实现您想要的目标对我来说似乎最容易:
legend=FALSE
来抑制某些图例在下面的示例中,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)
另一种方法是使每个数据集的线颜色发生变化。这需要更少的游戏并且更清楚地理解,所以我可能会这样做:
ggplot(iris, aes(Sepal.Width, Petal.Width, colour = Species, shape = Species, linetype = Species)) +
geom_point(aes()) +
geom_smooth(aes())
答案 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)