2017-05-10 130 views
1

我將一些溫度數據繪製爲深度的函數。但我希望它對非科學家更友好,並且清楚地表明,頂部是水面。任何想法如何做到這一點? (紅利藝術浪!)在ggplot2中繪製「水面」

這裏有一些選擇至今:

library(dplyr); library(ggplot2); library(magrittr); 
temperature <- rnorm(30, mean = 20) 
depth <- seq(0:29) 
df <- data.frame(temperature, depth) 

no_surface <- df %>% 
       ggplot(aes(y = depth, x = temperature, colour = temperature)) + 
       geom_path(size = 2) + 
       scale_y_reverse() + 
       scale_colour_gradient(low = "blue", high = "red")+ 
       theme_classic() + 
       theme(legend.position = "none") 


flat_surface <- no_surface + geom_hline(yintercept = 0) 

wavy_surface <- no_surface + stat_function(fun = function(x)sin(x^1.5), 
              size = 1) 

回答

7

這一個是太美了,我含着眼淚:

ggplot(df, aes(xmin=1, xmax=10, ymin=-depth+1, ymax=-depth, fill=temperature)) + 
    annotate("text", x=7, y=1.5, label="\u2600", size = 60, color = "orange") + 
    geom_rect() + 
    geom_area(
    aes(x), data.frame(x=c(1,10)), inherit.aes=F, stat="function", 
    fun = function(x)abs(sin(2*x))+.2, fill="blue" 
) + coord_cartesian(ylim=c(-30, 10)) + 
    theme_minimal() + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank()) + 
    labs(x=NULL, y="level") 

enter image description here

1

我們可以先創建一個使用正弦理念爲波water_dat

water_dat <- data.frame(
    x = seq(min(df$temperature), max(df$temperature), length.out = 1000) 
) %>% 
    mutate(y = sin(x^1.5)) 

然後我們」將使用water_datgeom_ribbongeom_line函數中的數據添加一些水。

df %>% 
     ggplot(aes(y = depth, x = temperature, colour = temperature)) + 
      geom_ribbon(data = water_dat, aes(x = x, ymax = Inf, ymin = y), 
       fill = 'blue', inherit.aes = FALSE, alpha = .3)+ 
      geom_line(data = water_dat, aes(x = x, y = y), 
       inherit.aes = FALSE)+ 
     geom_path(size = 2) + 
     scale_y_reverse() + 
     scale_colour_gradient(low = "blue", high = "red")+ 
     theme_classic() + 
     theme(legend.position = "none")