Как объединить линейную и гистограмму для конкретной переменной, используя R - PullRequest
1 голос
/ 07 ноября 2019

У меня довольно простой вопрос. Я хотел бы иметь линейчатую диаграмму для var1, var2, var3 и var4 и линейную диаграмму для var5. Линия и бары должны быть на одном графике. Как я могу получить его, сохраняя длинный формат с ggplot?

set.seed(1984)
start_date <- as.Date('2015-01-01')  
end_date <- as.Date('2017-01-01')  

date_yq <- as.Date(sample( as.numeric(start_date): as.numeric(end_date), 50, 
                           replace = T), 
                   origin = '1970-01-01')
var1 <- runif(50)
var2 <- runif(50)
var3 <- runif(50)
var4 <- runif(50)
var5 <- var1+var2+var3+var4

country <- c("AT","AT","AT","BE","BE","CY","CY","CY","DE","DE")
country_r <- rep(country, times = 5)
df <- data.frame(date_yq, country_r, var1, var2,var3,var4,var5)
View(df)

df_m <- gather(df, key="variable", value="value", c("var1","var2","var3","var4","var5"))


ggplot(df_m, aes(x=date_yq, y=value, colour=variable)) +
  geom_line()+
  geom_bar(stat = "identity")+
  xlab("Date") + 
  ylab("Value")

Редактировать: после некоторых настроек это код для воспроизведения данных:

 ggplot(data = df_m, aes(x = date_yq, y = value,fill=as.factor(variable))) +
  geom_bar(data = filter(df_m, variable != "var5"), stat = "identity", 
colour="black") + scale_fill_hue(c=45, l=80) +
  geom_line(data = filter(df_m, variable == "var5"), aes(col = variable, 
group = variable), colour="darkblue",size=1.3)

Проблема в том, что легендапоказывает var5 как бар, а не как отдельную строку. В чем может быть проблема?

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Вы можете ввести свои данные в geoms, например,

ggplot(df_m) +
geom_col(aes(x=date_yq, y=value, fill=variable), data=~filter(., variable != "var5")) +
geom_line(aes(x=date_yq, y=value), colour="black", data=~filter(., variable == "var5")) +
labs(x="Date", y="Value")

подсказка: если вы предварительно рассчитываете высоту столбцов, вы просто используете geom_col ().

0 голосов
/ 07 ноября 2019

Этот код делает то, что вы просили

fig <- ggplot2:::ggplot(df_m, aes(x=date_yq, y=value, colour=variable)) +
  geom_line(data = subset(df_m, variable %in% c("var1", "var2", "var3", "var4"))) +
  geom_bar(data = subset(df_m, variable %in% c("var5")), stat = "identity") +
  xlab("Date") + 
  ylab("Value")

enter image description here

0 голосов
/ 07 ноября 2019

Вам необходимо указать различные наборы данных для сопоставления geom_line с geom_bar. Вот один из способов сделать это:

ggplot() +
  geom_col(data=df_m[df_m$variable != "var5",], aes(x=date_yq, y=value, fill=variable)) +
  geom_line(data=df_m[df_m$variable == "var5",], aes(x=date_yq, y=value, color=variable), lwd=1)+
  guides(fill = guide_legend(title = "Individuals")) +
  scale_color_manual(values = "darkblue", name="Grand Total") +
  xlab("Date") + 
  ylab("Value")

В качестве исходного набора данных используются все переменные, кроме «var5», затем в geom_line я определил второй набор данных, в котором он просто «var5».
Кроме того, используя разные эстетики, «заливка» и «цвет», я смог разделить легенды.

enter image description here

...