2017-05-10 8 views
1

Ich zeichne einige Temperaturdaten als eine Funktion der Tiefe. Aber ich möchte, dass es für Nicht-Wissenschaftler freundlicher ist, und mache deutlich, dass oben die Wasseroberfläche ist. Irgendwelche Ideen, wie man das macht? (Bonus für künstlerische Wellen!)Plotten einer "Wasseroberfläche" in ggplot2

Hier sind einige Möglichkeiten so weit:

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) 

Antwort

7

Dieser ist so schön, ich habe Tränen in den Augen:

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

Wir können zunächst eine water_dat erstellen, die für die Wellen Ihre Sinus Idee verwendet:

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

Dann sind wir Verwenden Sie die Daten in water_dat und die geom_ribbon und geom_line Funktionen, um etwas Wasser hinzuzufügen.

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