【问题标题】:Suppressing non-integer axis breaks in ggplot2 graphs (in Shiny app)抑制 ggplot2 图中的非整数轴中断(在 Shiny 应用程序中)
【发布时间】:2018-08-01 12:30:38
【问题描述】:

我已经尝试了How to display only integer values on an axis using ggplot2 中推荐的所有解决方案。不幸的是,我无法解决其中任何一个问题。

我创建了一个 Shiny 应用程序,它可以生成关于各种变量的年度数据的折线图。这适用于大多数参数化:

没有非整数分隔符

但是,如果我在滑块上选择特定的时间跨度,它会生成在 x 轴上具有非整数中断的图表,这对于年度数据没有意义。

有非整数分号

编辑:这里是应用程序的最小可复制版本

library(tidyverse)
library(shiny)

options(scipen = 999)

# Data
data1<-data.frame(values = c(15500, 16300, 18200, 28300, 23500, 23700,
                             31500, 35800, 34700, 36900, 40000, 44700,
                             53300, 55800, 69800, 89500, 1.13E+5,
                             1.53E+5, 1.77E+5, 1.83E+5, 1.99E+5), 
                  year = seq(1990, 2010, 1))

#Shiny app

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
    sliderInput("period", "Year:", min = 1990, max = 2010, value = c(1990, 2010), sep = "")),
mainPanel(plotOutput("ggplot2"))))

server <- function(input, output) {

  data1_subset <- reactive({
      filter(data1, year >= input$period[1] & year <= input$period[2])
  })


  output$ggplot2 <- renderPlot({
        ggplot(data = data1_subset(), aes(x = year, y = values)) +
          geom_line(aes(color = "red")) +
          scale_x_continuous(name = "Year") +
          scale_color_discrete(guide=FALSE)+
          theme_minimal()

  })
}

shinyApp(ui = ui, server = server)

要查看问题,请选择例如时间跨度2000-2010

有什么方法可以抑制非整数中断,因为年度数据显然是无意义的?

非常感谢您的帮助!

【问题讨论】:

  • 1) 这可能只是一个ggplot2 问题,因此shiny 部分可能无关紧要。 2)为什么该链接问题中的所有答案都不起作用?请准确显示您尝试过的内容。将breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))) 添加到您的scale_x_continuous 应该可以工作...
  • 非常感谢您的回答。如果我只是按照您的建议将breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))) 添加到scale_x_continuous,x 轴仅显示 2000 年的中断(如果 2000 不在该范围内,则没有中断)(imgur.com/a/CpPnH0x)。也许我没有完全理解这个函数的作用,可以相应地调整它。
  • 好的,我现在看到这个功能并不是那么好。 breaks = function(x) unique(floor(pretty(seq(min(x - 1), (max(x) + 1) * 1.1)))) 怎么样?我无法测试,因为您的问题中没有数据。或者在那里尝试其他答案之一。
  • 不幸的是,这会产生与前一个函数完全相同的结果:只有一次中断(在 2000 年)或没有中断,具体取决于范围。
  • 好吧,就目前而言,这个问题没有什么特别之处可以使它与您的链接问题不同。我们实际上无法重现您遇到的问题,因为这里没有最小的可重现代码。

标签: r ggplot2 shiny


【解决方案1】:

感谢您的帮助!似乎答案比我想象的要简单得多。将breaks = function(x) unique(floor(pretty(x))) 放在我的scale_x_continuous() 函数中会产生仅整数中断,即使没有将数据转换为Date 格式。在我的情况下,删除 unique() 不会改变行为,但在其他情况下可能会这样做。

【讨论】:

    【解决方案2】:

    您应该注意为您的日期列使用正确的类year(类似于DatePOSIXct)。正如评论所暗示的,您需要选择一个特定的日期,例如Jan 1st。这将告知 ggplot2 您的意图,并且可以让您更轻松地将显示格式调整为有意义的内容。

    它开箱即用,您可以使用ggplotdate/time scales 对其进行更多调整。

    实现了所提出想法的代表(以及关于固定线条颜色的另一个小故障):

    library(tidyverse)
    library(shiny)
    
    # Data
    tibble(values = c(15500,16300,18200,28300,23500,23700,
                      31500,35800,34700,36900,40000,44700,
                      53300,55800,69800,89500,1.13E+5,
                      1.53E+5,1.77E+5,1.83E+5,1.99E+5), 
                      year = seq(1990, 2010, 1)) %>% 
      mutate(year = lubridate::ymd(year, truncated = 2L)) ->
      data1
    
    # Shiny app
    ui <- fluidPage(
      sidebarLayout(
        sidebarPanel(
        sliderInput("period", "Year:", 
                    min = 1990, max = 2010, 
                    value = c(1990, 2010), sep = "")),
    mainPanel(plotOutput("ggplot2"))))
    
    server <- function(input, output) {
    
      data1_subset <- reactive({
          filter(data1,
                 year >= lubridate::ymd(input$period[1], truncated = 2L),
                 year <= lubridate::ymd(input$period[2], truncated = 2L))
      })
    
    
      output$ggplot2 <- renderPlot({
            ggplot(data = data1_subset(), aes(x = year, y = values)) +
              geom_line(color = "red") +
              xlab("Year") +
              theme_minimal()
    
      })
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 将普通的 4 位年份变量转换为 Date 格式是否明智?这里的线程似乎表明它不是:stackoverflow.com/questions/30255833/…
    • 我会说推理是相反的——你想要一个日期时间轴,它的格式很好,因为人们期望日期时间轴可以工作,而你不需要做太多工作。 ggplot 可以做到这一点,如果它知道你想要它。然后剩下的是“我如何告诉ggplot我想要它”-在这里您需要选择一个特定的日期,以便符合“协议”。
    • 谢谢,这适用于所有时间跨度,但 2008-2010 和 2009-2010 除外,其中出现时间点中断,不存在数据。
    • 因为轴标签不是数据点。这是完全正确的恕我直言。如果您想强调数据点的存在/不存在,请使用geom_point(size=4) 再添加一层。
    • 更清楚地说,它并没有完全抑制问题中提到的非整数轴中断。但是你的观点很好。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多