2017-03-22 7 views
3

그래프의 세로선을 변경하지 않고 아래의 캡션 키가 가로 위치에 있도록 어떻게 바꿀 수 있습니까?ggplot에서 범례의 "키"방향을 변경하는 방법은 무엇입니까?

set.seed(000) 
m <- matrix(rnorm(100,0,1),100,1) 
dt <- data.frame(m) 
names(dt) <- c("X") 

library(ggplot2) 

g2 <- ggplot(dt, aes(x=X)) 
g2 <- g2+geom_histogram(aes(y=..density..),  # Histogram with density instead of count on y-axis 
         binwidth=.5, 
         colour="black", fill="white",breaks=seq(-2, 2, by = 0.1)) 
g2 <- g2+geom_density(alpha=.3, fill="#cccccc") # Overlay with transparent density plot 
g2 <- g2+ geom_vline(aes(xintercept=0, linetype="Valor Verdadeiro"),show.legend =TRUE) 
g2 <- g2+ geom_vline(aes(xintercept=mean(dt$X, na.rm=T), linetype="Valor Estimado"),show.legend =TRUE) 
g2 <- g2+ scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot 
g2 <- g2+ xlab(expression(paste(gamma[1])))+ylab("Densidade") 
g2 <- g2+ theme(legend.key.height = unit(2, "cm") , 
       legend.position = c(0.95, 0.95), 
       legend.justification = c("right", "top"), 
       legend.box.just = "right", 
       legend.margin = margin(6, 6, 6, 6), 
       legend.title=element_blank(), 
       legend.direction = "vertical", 
       legend.background = element_rect(fill="gray", size=.5, linetype="dotted")) 
g2 <- g2+ guides(linetype = guide_legend(override.aes = list(size = 1))) 
g2 

참고 : 나는 dotdashsolid 형식으로 캡션 내에서 선을 회전합니다.

enter image description here

+0

당신은이 솔루션을 확인 할 수 있습니다 : http://stackoverflow.com/questions/35703983/how-to-change-angle-of-line-in-customized-legend- in-ggplot2 –

+0

@JeroenBoeye 작동하지 않습니다. 시도했습니다! – fsbmat

답변

2

당신은 ggplot의 GROB 작업에 의존하고 grid 편집 기능을 사용 할 수도 있습니다.

# Your data and plot 
set.seed(000) 
m <- matrix(rnorm(100,0,1),100,1) 
dt <- data.frame(m) 
names(dt) <- c("X") 

library(ggplot2) 

g2 <- ggplot(dt, aes(x=X)) 
g2 <- g2+geom_histogram(aes(y=..density..),  # Histogram with density instead of count on y-axis 
         binwidth=.5, 
         colour="black", fill="white",breaks=seq(-2, 2, by = 0.1)) 
g2 <- g2+geom_density(alpha=.3, fill="#cccccc") # Overlay with transparent density plot 
g2 <- g2+ geom_vline(aes(xintercept=0, linetype="Valor Verdadeiro"),show.legend =TRUE) 
g2 <- g2+ geom_vline(aes(xintercept=mean(dt$X, na.rm=T), linetype="Valor Estimado"),show.legend =TRUE) 
g2 <- g2+ scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot 
g2 <- g2+ xlab(expression(paste(gamma[1])))+ylab("Densidade") 
g2 <- g2+ theme(legend.key.height = unit(2, "cm") , 
       legend.position = c(0.95, 0.95), 
       legend.justification = c("right", "top"), 
       legend.box.just = "right", 
       legend.margin = margin(6, 6, 6, 6), 
       legend.title=element_blank(), 
       legend.direction = "vertical", 
       legend.background = element_rect(fill="gray", size=.5, linetype="dotted")) 
g2 <- g2+ guides(linetype = guide_legend(override.aes = list(size = 1))) 


# Adjust key height and width 
g2 = g2 + theme(
    legend.key.height = unit(.6, "cm"), 
    legend.key.width = unit(1, "cm")) 

# Get the ggplot Grob 
    gt = ggplotGrob(g2) 

# grid.ls(grid.force(gt)) # To get a list of editable grobs 

# Edit the relevant keys 
library(grid) 
gt <- editGrob(grid.force(gt), gPath("key-[3,4]-1-[1,2]"), 
     grep = TRUE, global = TRUE, 
     x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
     x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

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

enter image description here

+0

고마워요! 한 가지 질문은'legend.direction = "horizontal"을 변경하면 키를 수평으로 유지하기 위해 어디에서 코드를 변경할 수 있습니까? – fsbmat

+1

'grid.ls (grid.force (gt)')는 편집 가능한 grobs의 목록을 제공합니다. 가로 범례로, 관련 grobs는 key-1-3-1, key-1-3-2, key-1 -7-1; key-1-7-2입니다. 그러므로 editGrob 명령의 gPath는 다음과 같습니다 :'gPath ("key-1- [3,7] - [1,2]")' –

+0

고맙습니다. 많이 도와 줬어! – fsbmat