#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
вызов — теперь обновлено.