В R блестящий есть способ заморозить ось X на интерактивном графике? - PullRequest
1 голос
/ 09 апреля 2020

Я работаю над созданием интерактивного линейного графика, используя ggplot в R глянцевый. Я делаю это так, чтобы пользователь в пользовательском интерфейсе выбирал значения, которые он хочет видеть на графике, используя ввод выбора. На сервере данные затем фильтруются на основе выбора пользователя. Я указал ось х в ggplot, используя scale_x_continuous. Я установил последовательность от 0 до 24 с перерывами на 1. Однако, когда пользователь выберет, скажем, 1-10, ось x изменится и покажет только 1-10.

Я хочу, чтобы x- ось остается от 0 до 24 независимо от того, что выберет пользователь. Есть способ сделать это? Будет ли решение в определении пределов ggplot по оси X другими способами или в том, как я использую вход средства выбора для фильтрации данных?

Спасибо!

Вот мой код, если это поможет:

library(shiny)
library(tidyverse)
library(shinyWidgets)

# Create sample dataset and name bin
set.seed(1234) 
hour <- sample(1:24, size=100, replace=TRUE)
calls <- sample(1:55, size=100, replace =TRUE)
mydata <- data.frame(hour,calls)
name <- mydata %>% 
  group_by(hour) %>% 
  summarize(n())

name_bin <- as.data.frame(name$hour)

ui <- fluidPage(
  h1 ("R shiny ggplot Question"),
  pickerInput(
    inputId = "myPicker",
    label = "Select Hour in the day",  
    choices = name_bin, 
    options = list(
      `actions-box` = TRUE,
      size = 10, 
      `selected-text-format` = "count > 3"),
    multiple = TRUE),
  box(
    width = 11,
    plotOutput("graph1"))
)

server <- function(input,output,session) {

output$graph1 <- renderPlot({

  g1 <- dplyr::filter(mydata,hour %in% input$myPicker) 

  g2 <- g1 %>% 
    group_by(hour) %>% 
    summarize(number = n())

  ggplot(g2, aes(x=hour, y=number)) + 
    geom_line(color = 'darkblue') + geom_point() +
    scale_x_continuous(breaks = seq(0,24, by=1)) +  ###### Better way to set x-limits?
    scale_y_continuous(breaks = seq(0, max(g2$number), by=5))+ 
    theme_minimal()+
    labs(y="Number of Calls", x="Hour in the day",title = "")
})
}

shinyApp(ui, server)

1 Ответ

1 голос
/ 10 апреля 2020

Есть несколько способов установить ограничения для вашей оси: вы были почти там!

Вызов scale_x_continuous в вашей функции renderPlot() устанавливает только разрывы на оси (вроде как это маркировано). Вы хотите установить пределы, и вы можете сделать это в функции scale_x_continuous через аргумент limits=. См. Документацию для получения дополнительной информации , но это должно работать для вас:

scale_x_continuous(breaks = seq(0,24, by=1), limits = c(0,24))

В качестве альтернативы, если вы просто хотите установить пределы, но по умолчанию "разрывы" на оси хорошо, вы можете легче получить доступ к пределам x и y, используя xlim(0,24) вместо scale_x_continuous.

Будьте осторожны: установка пределов оси приведет к удалению этих данных - это означает, что он не будет использоваться в каких-либо дальнейших функциях статистики. Если вам все еще необходимо сохранить эти данные для других функций статистики на графике, вы можете использовать coord_cartesian() (см. документацию здесь ).

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