我正在绘制一个图形,它使用符号和线型来区分组(点和95%置信椭圆,分别)。
以下是带有类似图例的示例图:
bplot<-ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,group=Species,shape=Species,lty=Species))+
geom_point(size=3)+geom_smooth(method="lm",se=F,color="black")+
theme_minimal()+theme(legend.key.size=unit(1.2,"cm"))
bplot
这个问题是图例中很难看到线型,因为它们与符号重叠。有没有办法在符号相同的图例中显示线型(使用单个标签),但在符号下面或两者都可读?
答案 0 :(得分:1)
您需要guides
功能。请仔细阅读文档以获得更多自定义。
bplot<-ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,group=Species,shape=Species,lty=Species))+
geom_point(size=3)+geom_smooth(method="lm",se=F,color="black")+
theme_minimal()+theme(legend.key.size=unit(1.2,"cm")) +
guides(
shape = guide_legend(order = 1),
size = guide_legend(order = 2)
)
bplot
答案 1 :(得分:1)
我认为如果按键加宽一点,图例就是可读的。
library(ggplot2)
bplot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, group = Species,
shape = Species,lty = Species)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = F, color = "black") +
theme_minimal() +
theme(legend.key.width = unit(1.5, "cm"))
bplot
但是如果你想将点与每个键中的行分开,那么我认为你需要深入研究ggplot grob。
library(grid)
bplot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, group = Species,
shape = Species,lty = Species)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = F, color = "black") +
theme_minimal() +
theme(legend.key.width = unit(1.5, "cm"),
legend.key.height = unit(1, "cm"),
legend.key = element_rect(colour = "grey50", size = .5))
# Get the plot grob
g = ggplotGrob(bplot)
# Get the legend
leg = g$grobs[[which(g$layout$name == "guide-box")]]
# Get the relevant keys
pos = grep("key-.-1-1", leg$grobs[[1]]$layout$name)
# pos gets the point; pos+1 gets the line
# Separate the line from the point within each key
for(i in pos) {
leg$grobs[[1]]$grobs[[i]]$y = unit(0.6, "npc")
leg$grobs[[1]]$grobs[[i+1]]$children[[1]]$y0 = unit(0.3, "npc")
leg$grobs[[1]]$grobs[[i+1]]$children[[1]]$y1 = unit(0.3, "npc")
}
# Put the legend back into the plot
g$grobs[[which(g$layout$name == "guide-box")]] = leg
# Draw it
grid.newpage()
grid.draw(g)
或者,如果你想要单独的传说,请参阅@Divi的回答
答案 2 :(得分:0)
在这里的一个帖子中给出了一个用于编辑ggplot grob中特定grob的选项。它涉及通过列表中的长列表的路径来到相关的grob。有时,使用grid
编辑功能编辑相关的grob更容易(尽管可能只是稍微一点)。
library(ggplot2)
library(grid)
# The plot
bplot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, group = Species,
shape = Species,lty = Species)) +
geom_point(size = 3) +
geom_smooth(method = "lm", se = F, color = "black") +
theme_minimal() +
theme(legend.key.width = unit(1.5, "cm"),
legend.key.height = unit(1, "cm"),
legend.key = element_rect(colour = "grey50", size = .5))
# Get the plot grob
g = ggplotGrob(bplot)
# Get a list of the grobs
grid.ls(grid.force(g))
查看grobs列表。我们要编辑的grobs位于列表的底部 - 名称以“key”开头。有三组三个 - 三组,因为图例中有三个键。在每组中,有三个grob:
键-3-1-bg.4-2-4-2
关键3-1-1.4-2-4-2
关键3-1-2.4-2-4-2
GRID.segments.819
第一个是背景 - 这里没有兴趣。
第二个是指点 - 我们想要编辑它的垂直位置
第三个是指包含子节点的grob - GRID.segments - 线段。我们想要编辑线段的垂直位置。
在editGrob()
命令中,gPath
列出要编辑的grob,但grep=TRUE
表示可以使用正则表达式,global=TRUE
表示所有匹配都会受到影响。因此,每个编辑只有一个命令。
# Edit the 'key' grobs
# Move the point up a little
g = editGrob(grid.force(g), gPath("key-[1-9]-1-1"), grep = TRUE, global = TRUE,
y = unit(0.6, "npc"))
# Move the line segment down a little
g = editGrob(grid.force(g), gPath("GRID.segments"), grep = TRUE, global = TRUE,
y0 = unit(0.3, "npc"), y1 = unit(0.3, "npc"))
# Draw it
grid.newpage()
grid.draw(g)