2017-02-05 5 views
2

Для гидролога обычно используется Гипограф осадков и гидрографа Streamflow. Это похоже на рисунок ниже. Hyteograph and Hydrograph Как рисовать график стока осадков в R, используя 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.

+3

ggplot2 не любит двойной оси. Веб-поиск найдет примеры того, как их достичь, но код редко бывает красивым. Возможно, было бы лучше использовать что-то вроде rCharts и javascript-библиотеки для диаграммы, если это действительно то, чего вы хотите достичь. – neilfws

+0

В дополнение к первому комментарию: в последней ggplot2 есть поддержка двух осей; пример здесь https://rpubs.com/MarkusLoew/226759 – neilfws

+2

Даже с 'sec_axis()', ggplot2 заставляет вас выполнять ручную работу преобразования 1: 1, чтобы получить вторую ось, масштабированную должным образом. Я понимаю, что это семантическая диаграмма в этой конкретной области науки, но в долгосрочной перспективе вы можете захотеть рассмотреть базовую графику или наложение графиков. – hrbrmstr

ответ

4

Я думаю, что комментарии делают сильный случай для того, чтобы не использовать ggplot2 для решения этой проблемы: он не будет изящным или простым. Итак, вот ответ, который использует пакет highcharter.

Я использовал данные, представленные в качестве примера, за исключением того, что даты выписки были изменены так же, как даты дождя.

Here is the interactive result опубликовано как HTML.

Вот скриншот. enter image description here Я бы повторил комментарий выше: хотя это может быть стандартом в гидрологии, обратные двойные оси очень вводят в заблуждение. Я думаю, вы могли бы достичь чего-то более информативного и привлекательного, используя 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 
2

Использование базы 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)) 

base R plot

Использование plotly:

## 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) 

plotly plot

3

Это возможно в ggplot с помощью sec_axis(), чтобы отобразить вторую ось, которая является преобразованием первого. Поскольку осаждение может быть преобразовано в объем с использованием водораздельной зоны (или сброса, превращенного в глубину), можно использовать sec_axis для создания гитографа.

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)) 

Example hyeto-hydrograph

Смежные вопросы