オブジェクトに基づいて二重軸プロットを作成するのに苦労していggplot
ます。バティストの提案で、私は問題を小さな部分に分解しました。現在の問題は次のとおりです。
grobs
軸、軸ラベル、軸の目盛り、およびグリッド線を保持しながら、からすべてのデータを削除する方法は?geom_line()
「データ」とは、およびに関連付けられたデータを意味しますgeom_points()
。
これを行う理由は、二重軸プロットを作成する過程で、次の問題に遭遇したためです: 1 つのグロブからのグリッド線が他のグロブからのデータを上書きします。データの線と点を削除することにより、上書きはありません。
はっきりさせておきます: aes() に線種を追加し、scale_linetype_manual(values = c("solid", "blank") を設定するか、代わりにデータを「グリッド外」に送信するという回避策がありますが、当面の目的のためにあまり「グルーミング」されていないプロットオブジェクトを後処理したいと思います。
いくつかのコードと図の下。
# Data
df <- structure(list(Year = c(1950, 2013, 1950, 2013), Country = structure(c(1L,
1L, 2L, 2L), .Label = c("France", "United States"), class = "factor"),
Category = c("Hourly minimum wage", "Hourly minimum wage",
"Hourly minimum wage", "Hourly minimum wage"), value = c(2.14,
9.43, 3.84, 7.25), variable = c("France (2013 euros)",
"France (2013 euros)", "United States (2013 dollars)", "United States (2013 dollars)"
), Unit = c("2013 euros", "2013 euros", "2013 dollars", "2013 dollars"
)), .Names = c("Year", "Country", "Category", "value", "variable",
"Unit"), row.names = c(NA, 4L), class = "data.frame")
# Plot data with ggplot
library(ggplot2)
p <- ggplot(data = df, aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line(size = 2) +
geom_point(size = 4) +
theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"),
panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted"))
# Manipulate grobs with gtable
library(gtable)
g <- ggplot_gtable(ggplot_build(p))
## Here remove the geom_line() and geom_point()
## g <- stripdata(g) # pseudo-code!
grid.newpage()
grid.draw(g)
以下のプロットでは、行を削除したいと思います!
編集:バティストの提案に従って、データ層を削除しようとしました。ただし、BondedDust がコメント セクションで指摘しているように、これにより ggplot オブジェクトが壊れます。
# Remove the two layers of data
p$layers[[1]] <- NULL
p$layers[[1]] <- NULL
g <- ggplot_gtable(ggplot_build(p))
## Error: No layers in plot
ggplot オブジェクトからデータを削除すると、それが破棄されます。アプリケーションで使用した回避策の 1 つは、「グリッドからデータを送信する」ことです。たとえば、各セルに -999999 を掛けて、表示を で切り捨てますが、可能であれば+ scale_y_continuous(limits = c(1, 10))
、この醜いハックを避けたいと思います。すべてのデータ ポイントを NA または NULL に置き換えても、関連する gtable が破棄されないことを期待していたので、p オブジェクトではなく g オブジェクト内からデータを削除する方法を探していました。
grobs を操作した後 (ggplot オブジェクトを直接ハッキングするのではなく)、結果は次のgrid.draw(g)
ようになります。
参考までに、2 番目のプロットは次の回避策で取得されました。
p <- ggplot(data = within(df, value <- -999999), aes(x = Year, y = value, group = variable, colour = variable, shape = variable)) +
geom_line() +
geom_point() +
theme(panel.grid.major = element_line(size = 1, colour = "darkgreen"),
panel.grid.minor = element_line(size = 1, colour = "darkgreen", linetype = "dotted")) +
scale_y_continuous(limits = c(1, 10))