Выравнивание оси x двух графиков с разной длиной меток y - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть два графика, которые расположены один над другим в приложении Shiny.
Два графика имеют одинаковую ось X, но разные оси Y.

Ширина осей X различнаиз-за длины меток осей Y (см. изображение ниже).
Цель состоит в том, чтобы выровнять оси X на двух графиках.

Минимальный пример:

library(shiny)
library(ggplot2)

df <- data.frame(
  stringsAsFactors = F,
  date = as.Date.factor(c("2010-01-01", "2011-01-01", "2012-01-01")),
  var1 = c(1000000, 2000000, 1500000),
  var2 = c(10, 15, 20)
)

shinyApp(
  ui = fluidPage(
    fluidRow(column(4, offset = 4, plotOutput(outputId = "plot1"))),
    fluidRow(column(4, offset = 4, plotOutput(outputId = "plot2")))
  ),
  server = function(input, output, session) {
    output$plot1 <- renderPlot(
      ggplot(data = df, mapping = aes(x = date, y = var1)) + 
        geom_line() +
        scale_x_date(breaks = df$date)
    )

    output$plot2 <- renderPlot(
      ggplot(data = df, mapping = aes(x = date, y = var2)) + 
        geom_bar(stat = "identity") +
        scale_x_date(breaks = df$date)
    )
  }
)

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Использование пакета gtable решило ее (кредит @Tung и его answer ).
Я конвертировал оба графика в gtables, а затем сопоставил их .$widths.

Вот рабочий код:

library(shiny)
library(ggplot2)
library(grid)
library(gtable)

df <- data.frame(
  stringsAsFactors = F,
  date = as.Date.factor(c("2010-01-01", "2011-01-01", "2012-01-01")),
  var1 = c(1000000, 2000000, 1500000),
  var2 = c(10, 15, 20)
)

shinyApp(
  ui = fluidPage(
    fluidRow(column(4, offset = 4, plotOutput(outputId = "plot1"))),
    fluidRow(column(4, offset = 4, plotOutput(outputId = "plot2")))
  ),
  server = function(input, output, session) {
    p1_widths <- reactiveVal(value = NULL)

    output$plot1 <- renderPlot({
      p <- ggplot(data = df, mapping = aes(x = date, y = var1)) + 
        geom_line() +
        scale_x_date(breaks = df$date, expand = c(0, 200.75))

      g <- ggplot_gtable(data = ggplot_build(plot = p))
      p1_widths(g$widths)

      grid.draw(g)
    })

    output$plot2 <- renderPlot({
      p <- ggplot(data = df, mapping = aes(x = date, y = var2)) + 
        geom_bar(stat = "identity") +
        scale_x_date(breaks = df$date, expand = c(0, 36.5))

      g <- ggplot_gtable(data = ggplot_build(plot = p))
      g$widths <- p1_widths()

      grid.draw(g)
    })
  }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...