2017-09-24 1 views
1

[동음 :있는 여러 이미 게시 답이있다, 내가 어떻게 제목을 중앙에 요구 하진 않았어,주의하시기 바랍니다]ggplot2를 사용하여 윈도우의 플롯을 중앙에 배치하는 방법은 무엇입니까? (에 관계없이 축 제목, 전설 등의 길이)

내가 줄을 만드는 오전 차트, ggplot2를 사용하여 내가 알아낼 수 없었던 한 가지 방법은 세로 축 레이블 텍스트 (데이터 세트에 따라 다름)의 길이와 관계없이 윈도우에서 플롯 자체를 중앙에 배치하는 방법 또는 존재 여부 (또는 부재) 차트의 오른쪽에있는 범례. 가로 막 대형 차트가 포함 된 사각형을 항상 내 창 가운데에 배치하고 싶습니다. 이렇게하면 내보낼 때 모든 차트가 막대 차트의 양쪽에있는 텍스트 나 다른 개체를 기준으로 왼쪽이나 오른쪽으로 이동하지 않고 프레젠테이션의 슬라이드 가운데에 표시됩니다.

예를 들어 매우 짧은 세로 축 레이블이 있고 범례가없는 경우 플롯은 내가 원하는대로 가운데에 있습니다. 하지만 제가 오른쪽에 전설이 있다면, 그것은 왼쪽으로 내 차트를 푸시합니다. 긴 y 축 제목이 있으면 차트가 오른쪽으로 밀려납니다. 나는 다른 이유 때문에 다른 전설적인 포지셔닝을 사용하고 싶지 않기 때문에 대신 플롯 자체의 정당성을 제어 할 수있는 방법을 찾고자합니다.

미리 제안 해 주셔서 감사합니다. 플롯 패널이 중심되지 않습니다하지만

chtit <- "Example" 
l_labs <- c("","","") 
x_labs <- c("imagine that you had a really long label here", 
      "and that the long labels move your chart over", 
      "and mess up the alignment") 
ests <- c(.5,.3,.2) 
nerrs <- c(.05, .05, .05) 
perrs <- nerrs 

barchart.data <- data.frame(l_labs, x_labs, ests, nerrs, perrs) 

p<- ggplot(barchart.data, aes(x=x_labs, y=ests, fill=l_labs)) + 
geom_bar(stat="identity", color="#808080", position=position_dodge(), fill="#808080") + 
geom_text(aes(y=ests+perrs+0.02, label=sprintf("%1.1f%%", 100*ests)), vjust=0.5, hjust=0, size=5, color="white") + 
geom_errorbar(aes(ymin=ests-nerrs, ymax=ests+perrs), width=.2, position=position_dodge(.9), color="white", size=0.25) + 
labs(title=chtit, x= "", y = "Frequency") + theme_classic() + 
scale_y_continuous(limits = c(0,1.1), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1)) + 
theme(legend.position="none", legend.text = element_text(color = "white")) + 
theme(title = element_text(colour = "white")) + 
theme(axis.text = element_text(size=12, color = "white"), axis.line = element_line(color = "white")) + 
theme(axis.title = element_text(size=12, color = "white")) + 
coord_flip() + 
theme(panel.grid.major.x = element_line(colour = "white",size=0.25)) + 
theme(aspect.ratio = 1) + 
theme(panel.background = element_rect(fill = "#1e1e1e")) + 
theme(plot.background = element_rect(fill = "#1e1e1e"), plot.margin = unit(c(.5,.5,.5,.5), "in")) + 
guides(fill = guide_legend(reverse = TRUE)) 
print(p) 
+1

코드를 단순화 고려하고, 데이터를 포함하십시오 여기에 한 가지 방법입니다. http://reprex.tidyverse.org를 참조하십시오. –

+0

저는 이것이 내 차트의 뉘앙스와 관련이없는 일반적인 질문이므로 제안을 얻을 수 있기를 바랍니다. 나는 여전히 학습하고있다. (또한 적시에 비즈니스에 필요한 결과를 제공하려고 노력하고있다.) 그래서 내 코드를 "잘 만든"대 내 코드 "작업"을 만드는 것으로 교환해야한다. :) – Bob

+1

당신은 여기 기회가 없어. 'barchart.data'가 없다면 우리는 예제를 실행할 수 없으므로 가짜 데이터 등을 만들어야 할 때 도움이됩니다. 데이터를 생성하는 방법을 제공했다면 해답을 얻는 기회를 극대화 할 수 있습니다. 또한이 코드에는 문제와 관련없는 것으로 보이는 많은 것들이 있습니다. 너 자신을 트리밍하면 다른 사람들이 너를 도울 수있게 도와 줄 것이다. –

답변

3

하면 패널의 크기를 설정할 수 있습니다,

library(egg) 
set_panel_size(p, width= unit(6,"in"), height = unit(4,"in"), file = 'test.pdf') 
set_panel_size(p + theme(axis.text.y = element_blank()), width= unit(6,"in"), height = unit(4,"in"), file = 'test2.pdf') 

: 여기

는 일부 샘플 데이터를 포함 플롯을 생성하는 코드의 샘플입니다 장치, 여분의 작업이 필요합니다.

library(egg) 
p2 <- p + theme(axis.text.y = element_blank()) 

g1 <- gtable_frame(ggplotGrob(p), width= unit(3,"in"), height = unit(2,"in")) 
g2 <- gtable_frame(ggplotGrob(p2), width= unit(3,"in"), height = unit(2,"in")) 


wrap <- function(g, fullwidth=unit(10, 'in')){ 

    ng <- grid::nullGrob() 
    ag <- arrangeGrob(g, left=ng, right = ng) 

    panel <- g$widths[2] 
    margin <- 0.5*(fullwidth - panel) 
    lw <- margin - g$widths[1] 
    rw <- margin - g$widths[3] 
    ag$widths[c(1,3)] <- unit.c(lw, rw) 
    ag 
} 

pdf("compare.pdf", width=10, height=4, bg = 'black') 
grid.draw(wrap(g1)) 
grid.newpage() 
grid.draw(wrap(g2)) 
dev.off() 

enter image description here

관련 문제