2017-09-24 6 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

関連する問題