r - 在 R 中使用 ggplot 的 facet_wrap 的流持续时间曲线?
问题描述
我正在使用fdc
. hydroTSM package
我有三个,我想data.frame
构建具有in和. 以下将产生for 。data.frame
facet_wrap
ggplot
plots
three rows
one column
FDC curves
DF1
library(tidyverse)
library(hydroTSM)
library(gridExtra)
DF1 = data.frame(Ob = runif(1000,0,500), A = runif(1000,0,700), B = runif(1000,2,800))
DF2 = data.frame(Ob = runif(1000,0,500), A = runif(1000,0,700), B = runif(1000,2,800))
DF3 = data.frame(Ob = runif(1000,0,500), A = runif(1000,0,700), B = runif(1000,2,800))
fdc(DF1, plot = TRUE)
我尝试使用gridExtra package
withgrid.arrange
将三个图强制在一个数字上。我不仅没有做到这一点,而且它不是首选方法。我想facet_wrap
使用ggplot
. 事实上,这张图是用DF1
数据画错的。我正在寻找类似下面的东西:
更新:这是基于@Jon Spring 的建议。
graphics.off()
rm(list = ls())
library(tidyverse)
library(hydroTSM)
library(gridExtra)
DF1 = data.frame(Ob = runif(800,0,500), M1= runif(800,0,700), M2 = runif(800,2,800), df = rep("Upstream", 800))
DF2 = data.frame(Ob = runif(1000,0,500), M1 = runif(1000,0,700), M2 = runif(1000,2,800), df = rep("Midstream", 1000))
DF3 = data.frame(Ob = runif(1000,0,500), M1 = runif(1000,0,700), M2 = runif(1000,2,800), df = rep("Downstream", 1000))
# combine data into one table with id column for the source
bind_rows(DF1, DF2, DF3) %>%
# reshape into longer format
pivot_longer(-df, names_to = "src", values_to = "flow") %>%
arrange(-flow) %>%
group_by(df, src) %>%
mutate(flow_pct = 1 - percent_rank(flow)) %>%
ungroup() %>%
ggplot(aes(flow_pct, flow, color = src)) +
geom_line() +
theme_light() +
facet_wrap(~df, ncol = 1) +
labs(x = "% Time flow equalled or exceeded",
y = "Q, [m3/s]") +
theme(strip.text = element_text(hjust = 0, color = "black"),
strip.background = element_blank())
解决方案
你可以在 ggplot 中使用 facets 做这样的事情:
library(tidyverse)
# combine data into one table with id column for the source
bind_rows(DF1, DF2, DF3, .id = "df") %>%
mutate(df = LETTERS[as.numeric(df)]) %>%
# reshape into longer format
pivot_longer(-df, names_to = "src", values_to = "flow") %>%
arrange(-flow) %>%
group_by(df, src) %>%
mutate(flow_pct = 1 - percent_rank(flow)) %>%
ungroup() %>%
ggplot(aes(flow_pct, flow, color = src)) +
geom_line() +
theme_light() +
facet_wrap(~df, ncol = 1) +
labs(x = "% Time flow equalled or exceeded",
y = "Q, [m3/s]") +
theme(strip.text = element_text(hjust = 0, color = "black"),
strip.background = element_blank())
如果您希望将字母注释放在更左侧,您可以交替使用patchwork
包来堆叠和标记图:
library(tidyverse)
library(patchwork)
flow_plot <- function(df) {
df %>%
pivot_longer(everything(), names_to = "src", values_to = "flow") %>%
arrange(-flow) %>%
group_by(src) %>%
mutate(flow_pct = 1 - percent_rank(flow)) %>%
ungroup() %>%
ggplot(aes(flow_pct, flow, color = src)) +
geom_line() +
theme_light() +
guides(color = guide_legend()) +
labs(x = "% Time flow equalled or exceeded",
y = "Q, [m3/s]") +
theme(legend.position = c(0.85,0.6))
}
flow_plot(DF1) /
flow_plot(DF2) /
flow_plot(DF3) +
plot_annotation(tag_levels = "A")
推荐阅读
- python - 有没有办法使用python以编程方式拒绝对word文档的更改,而不是从中删除评论?
- c - 当我的数组长度大于 2 时,为什么会出现段错误
- angular - 我想从另一个页面图像
- python - 为什么 Keras 模型对象的预测方法不允许批量大小为 1?
- python - 在python就地方法中反转字符串吗?
- c - 将指针分配给指针结构时 malloc 失败 - C
- node.js - 在端口中运行时如何终止快速进程
- drupal-7 - 安装模块 H5P 后我收到消息和白屏 - 网站遇到错误,请稍后再试
- vba - 如何在 Microsoft Word 的 VBA 中使用特殊字符?
- django - 如何使用 Django 通过 Postman 或 Rest API 框架在 MySql 数据库中插入(添加)JSON 数据?