在ggplot2中进行新的缩放

时间:2018-08-28 23:40:21

标签: r ggplot2

我有以下图表绘制了分位数标签和中断。目前,这是手动完成的。

library(tidyverse)
mtcars %>% 
  as_tibble() %>%
     ggplot(aes(y = mpg, x = hp, color = factor(cyl))) +
     geom_point() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_y_continuous(labels = as.numeric(quantile(mtcars$mpg)),
                     breaks = as.numeric(quantile(mtcars$mpg))) +
  scale_x_continuous(labels = as.numeric(quantile(mtcars$hp)),
                     breaks = as.numeric(quantile(mtcars$hp))) 

reprex package(v0.2.0)于2018-08-28创建。

我想创建一个对任何数据集执行此操作的函数。这是一次尝试

scale_y_quantile <- function(y){
  ggplot2::scale_y_continuous(labels = as.numeric(quantile(y)))
}

然后我尝试如下使用它。

mtcars %>% 
  as_tibble() %>%
     ggplot(aes(y = mpg, x = hp, color = factor(cyl))) +
     geom_point() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_y_quantile()
but I get the following error
  

分位数(y)中的错误:找不到对象“ y”

问题是我不知道如何访问传递到aes()的数据。

1 个答案:

答案 0 :(得分:2)

我确定这仍然可以优化,但这是一个开始:

  1. 定义一个函数App以返回基于quantile_breaks的中断

    quantile(val)
  2. 使用# Define function for quantile breaks based on val quantile_breaks <- function(val, prob) { function(x) as.numeric(quantile(val, prob)) } 定义由scales::trans_new定义的中断的转换函数。

    quantile_breaks
  3. 定义2个新的quantile_trans <- function(val, prob) { scales::trans_new( name = "quantile", transform = function(x) x, inverse = function(x) x, breaks = quantile_breaks(val, prob)) } 位置比例尺。

    scale_*_quantile

让我们对scale_x_quantile <- function(val, prob = seq(0, 1, 0.25), ...) { scale_x_continuous(..., trans = quantile_trans(val, prob)) } scale_y_quantile <- function(val, prob = seq(0, 1, 0.25), ...) { scale_y_continuous(..., trans = quantile_trans(val, prob)) } 进行测试:

mtcars

enter image description here

您还可以更改要显示的分位数,例如要显示所有20%(而不是默认的25%四分位数),您可以

mtcars %>%
    ggplot(aes(hp, mpg, colour = factor(cyl))) +
    geom_point() +
    scale_x_quantile(mtcars$hp) +
    scale_y_quantile(mtcars$mpg)

enter image description here