我有以下图表绘制了分位数标签和中断。目前,这是手动完成的。
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()
的数据。
答案 0 :(得分:2)
我确定这仍然可以优化,但这是一个开始:
定义一个函数App
以返回基于quantile_breaks
的中断
quantile(val)
使用# 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
定义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
您还可以更改要显示的分位数,例如要显示所有20%(而不是默认的25%四分位数),您可以
mtcars %>%
ggplot(aes(hp, mpg, colour = factor(cyl))) +
geom_point() +
scale_x_quantile(mtcars$hp) +
scale_y_quantile(mtcars$mpg)