[英]How to draw rainfall runoff graph in R using ggplot?
對於水文學家來說,通常使用降雨量波圖和河流流量圖。 它看起來像下圖。
X 軸代表日期,左 Y 軸反轉代表降雨量,右 Y 軸代表流量。
我有一個雨量表和一個排放表。
####Rain Table#### ####Discharge Table####
Date Value Date Value
2000-01-01 13.2 2000-01-01 150
2000-01-02 9.5 2000-01-01 135
2000-01-03 7.3 2000-01-01 58
2000-01-04 0.2 2000-01-01 38
這是我的代碼。
ggplot(rain,aes(x=DATE,y=value)) +
geom_bar(stat = 'identity')+
scale_y_reverse()+
geom_line(data =discharge,aes(x=DATE,y=value))
但我不知道如何在兩個不同的 Y 軸上表示這些值。
在ggplot中使用sec_axis()函數可以顯示第二個軸,它是第一個軸的轉換。 由於降水可以使用分水嶺區域(或排放轉換為深度)轉換為體積,因此可以使用sec_axis制作hyetograph。
library(ggplot2)
library(readr)
df <- read_csv("date, precip_in, discharge_cfs
2000-01-01, 13.2, 150
2000-01-02, 9.5, 135
2000-01-03, 7.3, 58
2000-01-04, 0.2, 38")
watershedArea_sqft <- 100
# Convert the precipitation to the same units as discharge. These steps will based on your units
df$precip_ft <- df$precip_in/12
df$precip_cuft <- df$precip_ft * watershedArea_sqft
# Calculate the range needed to avoid having your hyetograph and hydrograph overlap
maxRange <- 1.1*(max(df$precip_cuft) + max(df$discharge_cfs))
# Create a function to backtransform the axis labels for precipitation
precip_labels <- function(x) {(x / watershedArea_sqft) * 12}
# Plot the data
ggplot(data = df,
aes(x = date)) +
# Use geom_tile to create the inverted hyetograph. geom_tile has a bug that displays a warning message for height and width, you can ignore it.
geom_tile(aes(y = -1*(precip_cuft/2-maxRange), # y = the center point of each bar
height = precip_cuft,
width = 1),
fill = "gray50",
color = "white") +
# Plot your discharge data
geom_line(aes(y = discharge_cfs),
color = "blue") +
# Create a second axis with sec_axis() and format the labels to display the original precipitation units.
scale_y_continuous(name = "Discharge (cfs)",
sec.axis = sec_axis(trans = ~-1*(.-maxRange),
name = "Precipitation (in)",
labels = precip_labels))
我認為這些評論為不使用ggplot2
解決這個問題提供了強有力的理由:它不會優雅或直截了當。 所以這是一個使用highcharter
包的答案。
我使用了提供的數據作為例子,除了排放日期被改變為與降雨日期相同。
這是一個截圖。 我會回應上面的評論:雖然這可能是水文學的標准,但反向雙軸非常具有誤導性。 我認為使用ggplot2
進行一些實驗ggplot2
更具信息性和吸引力的東西。
library(highcharter)
library(dplyr)
rainfall <- data.frame(date = as.Date(rep(c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-04"), 2), "%Y-%m-%d"),
value = c(13.2, 9.5, 7.3, 0.2, 150, 135, 58, 38),
variable = c(rep("rain", 4), rep("discharge", 4)))
hc <- highchart() %>%
hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed = TRUE),
list(title = list(text = "flow (m3/s)"),
opposite = TRUE)) %>%
hc_add_series(data = filter(rainfall, variable == "rain") %>% mutate(value = -value) %>% .$value, type = "column") %>%
hc_add_series(data = filter(rainfall, variable == "discharge") %>% .$value, type = "spline", yAxis = 1) %>%
hc_xAxis(categories = dataset$rain.date, title = list(text = "date"))
hc
使用基數R:
## Make data
dates <- seq.Date(from=as.Date("2015-01-01"),
to=as.Date("2015-01-10"), by="days")
flow <- c(0,0,1,3,7,11,8,6,4,5)
rain <- c(0,1,2,5,4,0,0,0,1,0)
## Plot rainfall first
par(xaxs="i", yaxs="i", mar=c(5,5,5,5))
plot(dates, rain, type="h", ylim=c(max(rain)*1.5,0),
axes=FALSE, xlab=NA, ylab=NA, col="blue",
lwd=50, lend="square")
axis(4)
mtext("Rainfall", side=4, line=3)
## Plot flow on top
par(new=TRUE)
plot(dates, flow, type="l", lwd=2, ylim=c(0, max(flow)*1.2))
用圖表:
## Plotly
library(plotly)
rainAx <- list(
overlaying = "y",
side = "right",
title = "Rain",
##autorange="reversed",
range = c(max(rain)*1.5,0),
showgrid=FALSE
)
plot_ly() %>%
add_trace(
x=~dates, y=~flow,
type="scatter", mode="lines") %>%
add_trace(
x=~dates, y=~rain,
type="bar", yaxis="y2") %>%
layout(yaxis2=rainAx)
我非常喜歡jpshanno的帖子,並且會使用它,因為它很靈活,適合我要去的其他代碼。 這是我剛剛找到的打包解決方案:
library(EcoHydRology)
dataforhydrograph <- as.data.frame(cbind(date = 1:20, precipitation = runif(20,0,100),discharge = runif(20,0,100)))
dataforhydrograph$date <- as.Date(dataforhydrograph$date, format = c("%Y-%m-%d"), origin = "1998-01-01")
hydrograph(input=dataforhydrograph)
通過使用“plotly”庫的這個 R 代碼,您可以顯示降雨徑流圖。
library(plotly)
rainAx = list(
overlaying = "y",
side = "right",
title = "Rainfall (mm)",
#autorange="reversed",
range = c(300,0),
showgrid=FALSE
)
date = hidromet.dia$date.daily #dates at daily format, however you can use any temporal resolution
flow = hidromet.dia$flow.daily # flow data
rainfall = hidromet.dia$rainfall.daily # rainfall data
plot_ly() %>%
add_trace(
x=~date, y=~flow,
type="scatter", mode="lines", line = list
(color = 'black', width = 1,
dash = 'solid'),name ='Streamflow') %>%
add_trace(
x=~date, y=~rainfall,
type="bar", yaxis="y2", marker = list
(color ="blue",width = 1),name = 'rainfall') %>%
layout(title = "Rainfall-Streamflow",xaxis =list
(title = "time (daily)"), yaxis=list
(title="Q m³/s",range=c(0,1300)),yaxis2=rainAx)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.