2017-11-08 5 views
0

for loopを使用して、Speciesのデータを.pngファイルに設定したアイリスデータに保存しようとしています。しかし、以前は、実際のデータプロッティングプロセスで行う必要があったように、ファセットストリップの厚さを変更したいと思っています。それぞれの修正されたファセットをggplot2に保存する

しかし、私は各ファセット の下に次のコードを書き込んで、これらの種のそれぞれについて空のプロットを与えようとしました。ここで

library(ggplot2) 
plot_list = list() 
for (i in unique(iris$Species)) { 
    p = ggplot(iris[iris$Species == i, ], aes(x=Sepal.Length, y=Sepal.Width)) + 
    geom_point(size=3, aes(colour=Species))+ 
    facet_wrap(~Species) 

#this part to modify facet_wrap strips 
    g1 = ggplotGrob(p) 

    pos = c(unique(subset(g1$layout, grepl("panel", g1$layout$name), select = t))) 
    for(i in pos) g1$heights[i-1] = unit(0.4,"cm") 

    grobs = which(grepl("strip", g1$layout$name)) 
    for(i in grobs) g1$grobs[[i]]$heights <- unit(1, "npc") 

    grid.newpage() 
    grid.draw(g1) 
    plot_list[[i]] = g1 
} 

#finally write the modified graphs to file 


for (i in 1:3) { 
    file_name = paste("iris_plot_", i, ".png", sep="") 
    tiff(file_name) 
    print(plot_list[[i]]) 
    dev.off() 
} 

は現在、このコードは、空のグラフを生産している、なぜ知らない、私の試みです!どんな助けもありがとう!

答えて

2

ggplotGrobを使用してストリップの高さを変更する必要はありません。 ggplotのtheme()に関連するパラメータを設定すると、どうなる:

comparison

p1 = ggplot(iris[iris$Species == "setosa",], 
      aes(x = Sepal.Length, y = Sepal.Width)) + 
    geom_point() + 
    facet_wrap(~Species) 

p2 = p1 + theme(strip.text.x = element_text(margin = margin(t = 10, b = 10))) 
# note: default margin for top & bottom is 5.5 

gridExtra::grid.arrange(p1, p2, ncol = 2) 
は、その他にも、あなたは最初のループの後 plot_listの長さを確認したいことがあります。最初に iを割り当てて、ユニークな値の iris$Speciesを取得してから、それをプロットのリストのインデックスとして使用しようとしました。 plot_listの最初の3つの要素にはプロットが含まれていませんでした。

この例では、次のように動作します。実際のユースケースについては、おそらくいくつかの変更を加える必要があります:

plot_list = list() 
loop.list <- unique(iris$Species) 
for (i in seq_along(loop.list)) { 
    p = ggplot(iris[iris$Species == loop.list[i], ], 
      aes(x = Sepal.Length, y=Sepal.Width)) + 
    geom_point(size = 3, aes(colour = Species))+ 
    facet_wrap(~Species) + 
    theme(strip.text.x = element_text(margin = margin(t = 11, b = 11))) 

    plot_list[[i]] <- ggplotGrob(p) 
} 

for (i in 1:3) { 
    file_name = paste("iris_plot_", i, ".png", sep="") 
    tiff(file_name) 
    grid.draw(plot_list[[i]]) 
    dev.off() 
} 
+0

こんにちは。コメントとあなたのソリューションをありがとう。実際に私は、テキストサイズが1つの解決策であるが、私が経験した正しい方法ではないという設定を認識しています。多くのファセットがあり、ストリップテキストを非常に小さくすると、ストロートテキストを見るのは非常に困難です。ターンアラウンドメソッドは、私のOPコードのように、文字列を間引くことです。 – Alexander

+0

私は[ここで] https://stackoverflow.com/questions/36783189/changing-the-appearance-of-facet-labels-size – Alexander

+0

@Alexanderで尋ねました。grobオブジェクトに変更を加えたい場合は、あなたのループカウンタはまっすぐです。一つの方法は(上記で示したように) 'i'が値そのものではなく' unique(iris $ Species) 'の各値のインデックスを取るようにすることです。もしこのループの中にもっと多くのループがあるならば、例えば'j'。 –

関連する問題