Демонтаж ggplot с сеткой и возможностью использования

Я пытаюсь построить двухосный сюжет на основе объектов ggplot. По предложению баптиста я разбил проблему на более мелкие части. Настоящий выпуск:

  • как удалить все данные из grobs, сохраняя ось, метки оси, отметки оси и линии сетки? По 'данным' я имею в виду связанные с данными с geom_line() и geom_points().

Причиной этого является то, что в процессе построения двухосевого графика я столкнулся с следующей проблемой: линии сетки из одного гроба переписывали данные из другого гнета. Удалив строки данных и точки, переписывание не будет.

Позвольте мне пояснить: у меня есть обходные пути, которые состоят в добавлении типа линии к aes() и установке scale_linetype_manual (значения = 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)

В приведенном ниже графике я хотел бы, чтобы линии ушли!

enter image description here

Изменить: Следуя предложению baptiste, я пытаюсь удалить слои данных. Однако, как указывает 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 уничтожает его. Один способ обхода, который я использовал в приложениях, заключается в "отправке данных с сетки", например. умножая каждую ячейку на -999999 и отсекая дисплей с помощью + scale_y_continuous(limits = c(1, 10)), но я бы хотел избежать этого уродливого взлома, если это возможно. Я надеялся, что связанный с ним gtable не будет уничтожен, если я заменил каждую точку данных NA или NULL, поэтому я искал способ удалить данные из объекта g, а не p-объекта.

После манипуляции с грызунами (вместо того, чтобы непосредственно взломать объект ggplot), результатом grid.draw(g) будет:

enter image description here

FYI, второй график был получен со следующим обходным путем.

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))

Ответ 1

Более естественной стратегией будет использование невидимых слоев geom_blank, так что ggplot2 по-прежнему обучает масштабы и т.д., чтобы построить график, но не показывает никаких данных. Однако, поскольку вы хотите обработать уже отформатированные графики, вам, вероятно, придется вручную удалить эти грызуны из графика gTree. Здесь попытка,

library(gtable)
g <- ggplotGrob(p)

stripdata <- function(g){
  keep <- grepl("border|grill", 
                names(g[["grobs"]][[4]][["children"]]))
  g[["grobs"]][[4]][["children"]][!keep] <- NULL
  g
}

grid.newpage()
grid.draw(stripdata(g))