我正在使用不同的数据集制作线面积图,但我无法使图例可见,也无法在图形中显示最后一个值。
我的预期输出 https://cdn.filestackcontent.com/99Ji0U7Q7ObTmZN7B0vw
在R中制作线面积图
my_data <- c(0, 10.22, 28.12, 61.21, 73.11, 101.34, 109.09, 110.82, 111.69, 113.87, 115.34, 118.67, 122.56,
#NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 122.67,
0, 7.89, 15.46, 26.31, 45.78, 53.12, 61.11, 63.76, 64.55, 64.89, 65.67, 66.11, 70.21,
0, 3.57, 10.98, 22.31, 28.21, 30.23, 31.45, 31.56, 31.78, 32.01, 35.67, 38.98, 45.23,
0, 13.21, 28.87, 48.34, 69.47, 84.36, 95.78, 98.67, 98.99, 100.97, 101.58, 103.70, 117.47 )
my_matrix <- matrix(my_data, nrow = 4, ncol = 13, byrow = TRUE)
colnames(my_matrix) <- c(" ", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
use_row_names <- c("Plan", "LE - ROT", "LE - CTD", "LE - OPS Capex")
my_frame <- as.tibble(my_matrix) %>%
select("January":"December") %>%
mutate(grp_names = use_row_names)
print.data.frame(my_frame)
my_frame_long <- my_frame %>%
gather("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December", key = "Month", value = "Numbers") %>%
mutate(Month = parse_date_time(Month, orders = c("%b", "%B", "b", "B"))) %>%
mutate(Month = month(Month)) #without the label = TRUE, we get an actual plot....# , label = TRUE
my_frame_long <- my_frame %>%
gather("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December", key = "Month", value="Numbers") #%>%
#mutate(Month = parse_date_time(Month, orders = c("%b", "%B", "b", "B")))# %>%
#mutate(Month = month(Month)) #without the label = TRUE, we get an actual plot....# , label = TRUE
le_rot <- my_frame_long %>%
filter(grp_names == "LE - ROT") #%>%
#mutate(month = as.character.Date(Month)) #can't change Month to character, bc plot won't work
le_ops <- my_frame_long %>%
filter(grp_names == "LE - OPS Capex")
le_ctd <- my_frame_long %>%
filter(grp_names == "LE - CTD")
plan <- my_frame_long %>%
filter(grp_names == "Plan")
le_ctd$Month <- as.factor(le_ctd$Month)
le_ctd$Month <- factor(le_ctd$Month, levels=c("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December"))
le_rot$Month <- factor(le_rot$Month, levels=c("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December"))
le_ops$Month <- factor(le_ops$Month, levels=c("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December"))
plan$Month <- factor(plan$Month, levels=c("January", "February", "March", "April", "May", "June", "July", "August", "September",
"October", "November", "December"))
plot_combined <- ggplot() +
geom_area(data = le_ctd, aes(x = Month, y = Numbers, group=1), fill = "yellow") +
geom_line(data = le_ctd, aes(x = Month, y = Numbers, group=1), color = "yellow") +
geom_area(data = le_ops, aes(x = Month, y = Numbers, group=1), fill = "brown") +
geom_line(data = le_ops, aes(x = Month, y = Numbers, group=1), color = "brown") +
geom_area(data = le_rot, aes(x = Month, y = Numbers, group=1), fill = "darkgreen") +
geom_line(data = le_rot, aes(x = Month, y = Numbers, group=1), color = "darkgreen") +
geom_line(data = plan, aes(x = Month, y = Numbers, group=1), color = "dodgerblue3") +
theme_bw()+theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust=0.5))+
labs(x="",y="", title="MAIN TITLE")+
annotate("Text")
#legend(legend=c("1","2,","3","4"),col=c("red","blue","yellow","black"))#+ theme(legend.position="bottom", legend.direction="vertical")
#
# scale_x_continuous(limits = range(le_rot$Month),
# breaks = 1:12,
# labels = 1:12) +
# scale_y_continuous(limits = c(0, 150),
# labels = seq.int(from = 0, to = 125, by = 25),
# breaks = seq.int(from = 0, to = 125, by = 25))
plot_combined
答案 0 :(得分:1)
经过一番摸索之后,下面的代码应该可以提供您想要的。
我对tidyverse有点经验不足,因此我决定改用data.table
库。
这也可以修复日期缩写。还要花些时间来获取框外的值和线。
library(data.table)
my_data <- data.table(
Plan = c(10.22, 28.12, 61.21, 73.11, 101.34, 109.09, 110.82, 111.69, 113.87, 115.34, 118.67, 122.56),
`LE - ROT` = c(7.89, 15.46, 26.31, 45.78, 53.12, 61.11, 63.76, 64.55, 64.89, 65.67, 66.11, 70.21),
`LE - CTD` = c(3.57, 10.98, 22.31, 28.21, 30.23, 31.45, 31.56, 31.78, 32.01, 35.67, 38.98, 45.23),
`LE - OPS Capex` = c(13.21, 28.87, 48.34, 69.47, 84.36, 95.78, 98.67, 98.99, 100.97, 101.58, 103.70, 117.47),
month = seq(as.Date("2018-01-01"),as.Date("2018-12-01"),by="m")
)
my_data_long <- melt(my_data, id.vars = c("month"), measure.vars = c("Plan","LE - ROT","LE - CTD","LE - OPS Capex"))
my_data_long[, variable := factor(variable, #Reorder levels ensuring that the ribbons are created correctly
levels = c("Plan","LE - OPS Capex","LE - ROT","LE - CTD"))]
ggplot() +
geom_line(aes(x = month, y = value, lty = variable),
col = "blue", data = my_data_long[variable == "Plan"]) + #Plot line (only rows for which the variable is Plan
geom_ribbon(aes(x = month, ymin = 0, ymax = value,
fill = variable,
color = variable),
alpha = .8,
data = my_data_long[variable!="Plan"]) + #Plot area curves, only the rows for which variable is not Plan
scale_fill_manual(values = c("darkred", "darkgreen", "lightblue"), name = "") + #colour for fill in geom_ribbon
scale_color_manual(values = c("darkred","darkgreen","lightblue"), name = "") + #colour of lines in geom_ribbon
scale_x_date(date_breaks = "1 month", date_labels = "%b") + #set x axis to abbreviated months
scale_linetype(name = "") + #Legend for the Plan line (badly
theme_bw() +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
plot.title = element_text(hjust = 0.5)) +
labs(x="",y="", title="MAIN TITLE") +
theme(legend.position = "bottom",
legend.key.height = unit(.5, "lines"),
legend.key.width = unit(1, "lines"),
legend.spacing = unit(-.2, "lines")) + #Negative spacing between margins
guides(linetype = guide_legend(override.aes = list(size = 2))) #make the line legend fatter