2016-05-16 1 views
0

Я рисую фигуру, которая использует оба символа и тип линии, чтобы различать группы (точки и 95% доверительные эллипсы, соответственно).r ggplot2 legend: как отобразить тип линии под символом?

Вот пример сюжет с аналогичной легендой:

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

попробовать 'legend.key.width = блок (1,5, "см")' –

+0

legend.key.width контролирует ширину фона легенды и не было полезно в этом случае. – collnell

+0

legend.key.width управляет шириной фона ключа легенды. Чем шире ключи, тем больше вы видите линию, и, следовательно, типы линий читаемы. Разве это не то, что вы хотели? Если вы хотите отделить фигуру от типа линии, но с одной меткой, я думаю, вам нужно будет вникать в структуру участка grob. Я уверен, что это можно сделать. –

ответ

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 в

+0

потрясающе, спасибо огромное! это было очень полезно – collnell

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

+0

Я искал, чтобы держать их в одной легенде еще – collnell

0

Один из вариантов для редактирования конкретного grobs в ggplot Grob даются в одном из постов здесь. Он включает в себя следующий путь через длинные списки в списках, чтобы добраться до соответствующего гроба. Иногда легче (хотя, может быть, и незначительно) редактировать соответствующие грыбы, используя функции редактирования grid.

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:

ключ-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

 Смежные вопросы

  • Нет связанных вопросов^_^