Линии и вторичная ось y не отображаются на линейчатой диаграмме plotly с вышележащей линейной диаграммой

#r #ggplot2 #plotly

#r #ggplot2 #графически

Вопрос:

У меня есть созданный ниже фрейм данных, с помощью которого я хочу создать линейчатую диаграмму с перекрывающейся линейной диаграммой. Первая ось y будет включать переменную Freq , а вторичная будет включать переменную rollmean . Но по какой-то причине линии и вспомогательная ось y не отображаются.

фрейм данных

 date<-c(as.Date("2020-09-15", "%Y-%m-%d"),as.Date("2020-09-14", "%Y-%m-%d"),
        as.Date("2020-09-13", "%Y-%m-%d"),as.Date("2020-09-12", "%Y-%m-%d"),
        as.Date("2020-09-15", "%Y-%m-%d"),as.Date("2020-09-14", "%Y-%m-%d"),
        as.Date("2020-09-13", "%Y-%m-%d"),as.Date("2020-09-12", "%Y-%m-%d"),
        as.Date("2020-09-16", "%Y-%m-%d"),as.Date("2020-09-17", "%Y-%m-%d"),
        as.Date("2020-09-18", "%Y-%m-%d"),as.Date("2020-09-19", "%Y-%m-%d"),
        as.Date("2020-09-20", "%Y-%m-%d"),as.Date("2020-09-21", "%Y-%m-%d"),
        as.Date("2020-09-22", "%Y-%m-%d"),as.Date("2020-09-23", "%Y-%m-%d"),
        as.Date("2020-09-24", "%Y-%m-%d"),as.Date("2020-09-25", "%Y-%m-%d"),
        as.Date("2020-09-26", "%Y-%m-%d"),as.Date("2020-09-27", "%Y-%m-%d"),
        as.Date("2020-09-28", "%Y-%m-%d"),as.Date("2020-09-29", "%Y-%m-%d"),
        as.Date("2020-09-30", "%Y-%m-%d"),as.Date("2020-10-01", "%Y-%m-%d"))
value<-c(5,6,7,8,-3,-5,6,8,5,6,7,8,-3,-5,6,8,5,6,7,8,-3,-5,6,8)
df<-data.frame(date,value)
df2<-data.frame(table(df$date))


library(data.table)

adaptiveparam2 <- c(1:6, rep(7, nrow(df2)-6))
df2$rollmean <- frollmean(df2$Freq, n=adaptiveparam2, adaptive = T)
  

и код графика

 library(hrbrthemes)

g<-ggplot(df2, aes(x=Var1))  
  
  geom_bar( aes(y=Freq), stat="identity", size=.1, fill="steelblue", color="black", alpha=.4)   
  geom_line( aes(y=rollmean), size=2, color="red")  
  
  scale_y_continuous(
    
    # Features of the first axis
    name = "Temperature (Celsius °)",
    
    # Add a second axis and specify its features
    sec.axis = sec_axis( ~.,name="Price ($)")
  )   
  
  theme_ipsum()  
  
  theme(
    axis.title.y = element_text(color = "steelblue", size=13),
    axis.title.y.right = element_text(color = "red", size=13)
  )  
  
  ggtitle("Temperature down, price up")

ggplotly(g)
  

Ответ №1:

Вы можете установить group = 1 внутри aes of geom_line , но это оставляет проблему перекрытия меток даты по оси x. Я думаю, что оптимальным решением здесь является преобразование дат в фактический класс даты:

 ggplot(within(df2, Var1 <- as.Date(Var1)), aes(x=Var1))  
  geom_bar( aes(y=Freq), stat="identity", size=.1, 
            fill="steelblue", color="black", alpha=.4)   
  geom_line( aes(y=rollmean), size=2, color="red")  
  scale_y_continuous(name = "Temperature (Celsius °)",
                     sec.axis = sec_axis( ~.,name="Price ($)"))     
  theme_ipsum()  
  theme(axis.title.y = element_text(color = "steelblue", size=13),
        axis.title.y.right = element_text(color = "red", size=13))  
  ggtitle("Temperature down, price up")
  

введите описание изображения здесь

Если вам нужно, чтобы это работало в plotly, вам нужно будет включить вспомогательную ось в саму plotly:

 g <- ggplot(within(df2, Var1 <- as.Date(Var1)), aes(x=Var1))  
  geom_bar( aes(y=Freq), stat="identity", size=.1, 
            fill="steelblue", color="black", alpha=.4)  
  geom_line( aes(y=rollmean), size=2, color="red")  
  scale_y_continuous(name = "Temperature (Celsius °)")     
  theme_ipsum()  
  theme(axis.title.y = element_text(color = "steelblue", size=13),
        axis.title.y.right = element_text(color = "red", size=13))  
  ggtitle("Temperature down, price up")

ggplotly(g) %>%
    add_lines(x= ~Var1, y=  ~rollmean, colors = ~rollmean, yaxis="y2", 
            data=df2, showlegend=FALSE, inherit=TRUE)  %>%
  layout(yaxis2 = list(
  tickfont = list(size=11.7),
  titlefont=list(size=14.6, col = "red"),
  overlaying = "y",
  nticks = 5,
  side = "right",
  title = "Price ($)"
))
  

введите описание изображения здесь

Комментарии:

1. вы уверены, что сейчас создается линия? Я этого не вижу. переменная ‘rollmean’, похоже, не используется

2. @firmo23 извините — я должен был оставить geom_line вызов — теперь обновлено.