1

この質問に対する答えがうまくいきません。私とそのユーザーの両方が望んでいるのは、facet_grid() を使用するときにすべての列に軸の目盛りとラベルを追加することです。

ファセット時に各サブプロットの y 軸を表示する

再現可能な例とソリューションを実行すると (abc=as.data.frame(abc) を追加して初期エラーを修正した後)、エラー メッセージが表示されます。

gtable_add_grob(g, grobs = list(segmentsGrob(1, 0, 1, 1), segmentGrob(1, ) のエラー: すべての入力の長さが 1 ではないか、「grobs」と同じ長さではありません

元の例はえーと、少し奇妙なので、私は自分の再現可能な例を作成しました:-)。同じエラーメッセージが表示されます

require(ggplot2)
require(reshape)
require(grid)
require(gtable)
data(iris)
iris$category=rep(letters[1:4],length.out=150)
plot1=ggplot(data=iris,aes(x=1,y=Sepal.Width))+geom_boxplot()+facet_grid(Species~category)

答えは次のようになります。

g <- ggplotGrob(plot1)

require(gtable)
axis <- gtable_filter(g, "axis-l")[["grobs"]][[1]][["children"]][["axis"]][,2]
segment <- segmentsGrob(1,0,1,1)
panels <- subset(g$layout, name == "panel")
g <- gtable_add_grob(g, grobs=list(axis, axis), name="ticks",
                     t = unique(panels$t), l=tail(panels$l, -1)-1)

g <- gtable_add_grob(g, grobs=list(segmentsGrob(1,0,1,1), 
                                   segmentsGrob(1,0,1,1)), 
                     t = unique(panels$t), l=tail(panels$l, -1)-1, 
                     name="segments")
4

2 に答える 2

2

これは私が思いついたものです(ggplot2_2.1.0を使用):

g <- ggplotGrob(plot1)
axis <- gtable_filter(g, "axis-l")
newG <- gtable_add_grob(g, list(axis, axis, axis), 
                t = rep(4, 3), b = rep(8, 3), l = c(5, 7, 9))
grid.draw(newG)

..次のようになります。

ここに画像の説明を入力

これは私が経験したプロセスです:

  1. g <- ggplotGrob(plot1)gtable を作成します。
  2. print(g)gtable の要素を調べてください...いじりたいグロブの名前を探しています。ここでは、「axis-l」と呼ばれる 3 つのグロブです。
  3. axis <- gtable_filter(g, "axis-l")大きな gtable オブジェクト から 3 つのグロブを選択gし、 という gtable に保存しますaxisgtable_filterからフィルタリングするのではなく、実際にグロブを選択していることに注意してくださいg
  4. gtable_show_layout(g)のレイアウトに目を通し、プロット全体との関係gでどこに配置したいかを把握できます。axis
  5. gtable_add_grobなど。どこに行くのかがわかったので、元のプロットに を追加できますaxis

これらの手順は、gtable に関してはかなり一般的なワークフローだと思います。もちろん、何をいじるかもしれない他のものがあります。たとえば、この場合、最も左の y 軸ラベル以外のすべてに与えられたスペースは十分ではありません。だから多分ただ:

newG$widths[c(5, 7, 9)] <- grid:::unit.list(axis$widths) # you won't need to wrap this in grid
grid.draw(newG)

ここに画像の説明を入力

于 2016-06-03T21:48:29.683 に答える
2

あなたが参照する答えは、あなたの状況には当てはまりません。

目盛りと目盛りラベルを適切に配置するには、gtable に列を追加して、軸のマテリアルを取得します。新しい列は、元の y 軸と同じ幅になります。

パネル間に余白スペースを追加したい場合があります。でそうしてくださいtheme(panel.margin.x = unit(1, "lines"))

require(ggplot2)
require(grid)
require(gtable)
data(iris)
iris$category = rep(letters[1:4], length.out = 150)
plot1 = ggplot(data = iris, aes(x = 1, y = Sepal.Width))+
   geom_boxplot()+
   facet_grid(Species~category)

# Get the ggplot grob
g <- ggplotGrob(plot1)

# Get the yaxis
yaxis <- gtable_filter(g, "axis-l")

# Get the width of the y axis
Widths = yaxis$widths

# Add columns to the gtable to the left of the panels, 
# with a width equal to yaxis width
panels <- g$layout[grepl("panel", g$layout$name), ]
pos = rev(unique(panels$l)[-1] - 1)
for(i in pos) g = gtable_add_cols(g, Widths, i)

# Add y axes to the new columns
panels <- g$layout[grepl("panel", g$layout$name), ]
posx = rev(unique(panels$l)[-1] - 1)
posy = unique(panels$t)

g = gtable_add_grob(g, rep(list(yaxis), length(posx)), 
     t = rep(min(posy), length(posx)), b = rep(max(posy), length(posx)), l = posx)

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

ここに画像の説明を入力

または、元の y 軸と同じ幅のビューポートに軸を配置しますが、右揃えにします。次に、結果のグロブをパネル間の既存のマージン列に追加し、それらの列の幅を適切に調整します。

require(ggplot2)
require(grid)
require(gtable)
data(iris)
iris$category = rep(letters[1:4], length.out = 150)
plot1 = ggplot(data = iris, aes(x = 1, y = Sepal.Width))+
   geom_boxplot() + 
   facet_grid(Species ~ category ) 

# Get the ggplot grob
g <- ggplotGrob(plot1)

# Get the yaxis
axis <- gtable_filter(g, "axis-l")

# Get the width of the y axis
Widths = axis$width

# Place the axis into a viewport, 
# of width equal to the original yaxis material,
# and positioned to be right justified
axis$vp = viewport(x = unit(1, "npc"), width = Widths, just = "right")

# Add y axes to the existing margin columns between the panels
panels <- g$layout[grepl("panel", g$layout$name), ] 
posx = unique(panels$l)[-1] - 1
posy = unique(panels$t)

g = gtable_add_grob(g, rep(list(axis), length(posx)), 
     t = rep(min(posy), length(posx)), b = rep(max(posy), length(posx)), l = posx)

# Increase the width of the margin columns
g$widths[posx] <- unit(25, "pt") 
# Or increase width of the panel margins in the original construction of plot1

# Draw it
grid.newpage()
grid.draw(g)
于 2016-06-03T22:25:29.163 に答える