r ggplot2图例:如何在符号下面显示线型?

时间:2016-05-16 23:06:56

标签: r plot ggplot2 legend

我正在绘制一个图形,它使用符号和线型来区分组(点和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

这个问题是图例中很难看到线型,因为它们与符号重叠。有没有办法在符号相同的图例中显示线型(使用单个标签),但在符号下面或两者都可读?

3 个答案:

答案 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

enter image description here

答案 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

enter image description here

但是如果你想将点与每个键中的行分开,那么我认为你需要深入研究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)

enter image description here

或者,如果你想要单独的传说,请参阅@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)

enter image description here