gpt4 book ai didi

r - ggplot2 2.0 新的 stat_ 函数 : setting default scale for given aesthetics

转载 作者:行者123 更新时间:2023-12-04 15:32:37 25 4
gpt4 key购买 nike

我尝试在 R 中使用 ggplot2 的新功能,它允许创建我们自己的 stat_职能。我正在创建一个简单的方法来计算和绘制排列在二维数组上的点之间的内插曲面。

我想创建一个需要 x 的 stat_topo() , y , 和 val美学,绘制一个简单的geom_raster插值 val映射到 fill .

library(ggplot2)
library(dplyr)
library(akima)

cpt_grp <- function(data, scales) {
#interpolate data in 2D
itrp <- akima::interp(data$x,data$y,data$val,linear=F,extrap=T)
out <- expand.grid(x=itrp$x, y=itrp$y,KEEP.OUT.ATTRS = F)%>%
mutate(fill=as.vector(itrp$z))
# str(out)
return(out)
}

StatTopo <- ggproto("StatTopo", Stat,
compute_group = cpt_grp,
required_aes = c("x","y","val")
)
stat_topo <- function(mapping = NULL, data = NULL, geom = "raster",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...) {
layer(
stat = StatTopo, data = data, mapping = mapping, geom = geom,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}

set.seed(1)
nchan <- 30
d <- data.frame(val = rnorm(nchan), # some random values to be mapped to fill color
x = 1:nchan*cos(1:nchan), # the x and y position of the points to interpolate
y = 1:nchan*sin(1:nchan))
plot(d$x,d$y)

ggplot(d,aes(x=x,y=y,val=val)) +
stat_topo() +
geom_point()

当我运行它时,我收到以下错误:
Error: numerical color values must be >= 0, found -1

我知道这是因为不知何故 fill 的规模美学设置为离散。

如果我输入这个:
ggplot(d,aes(x=x,y=y,val=val)) +
stat_topo() +
scale_fill_continuous() +
geom_point()

我得到了我想要的:具有连续色阶的预期光栅,我想要 stat_要做 默认情况下...

enter image description here

所以我想问题是:
如何防止 ggplot 在此处设置离散比例,并理想地在对我的新 stat_ 的调用中设置默认比例功能。

最佳答案

显然,在 stat_ 中创建新变量时函数,需要明确地将它与将被映射到的美学相关联,参数 default_aes = aes(fill = ..fill..)在 ggproto 定义中。

这告诉 ggplot 它是一种计算美学,它将根据数据类型选择一个比例。

所以这里我们需要定义stat_如下:

cpt_grp <- function(data, scales) {
# interpolate data in 2D
itrp <- akima::interp(data$x,data$y,data$val,linear=F,extrap=T)
out <- expand.grid(x=itrp$x, y=itrp$y,KEEP.OUT.ATTRS = F)%>%
mutate(fill=as.vector(itrp$z))
# str(out)
return(out)
}

StatTopo <- ggproto("StatTopo", Stat,
compute_group = cpt_grp,
required_aes = c("x","y","val"),
default_aes = aes(fill = ..fill..)
)

stat_topo <- function(mapping = NULL, data = NULL, geom = "raster",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...) {
layer(
stat = StatTopo, data = data, mapping = mapping, geom = geom,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}

然后如下代码:
set.seed(1)
nchan <- 30
d <- data.frame(val = rnorm(nchan),
x = 1:nchan*cos(1:nchan),
y = 1:nchan*sin(1:nchan))
ggplot(d,aes(x=x,y=y,val=val)) +
stat_topo() +
geom_point()

按预期生产:

The result of stat_topo

无需指定 scale_手动,但可以像往常一样轻松地调整比例,例如 scale_fill_gradient2(low = 'blue',mid='white',high='red')
我在这里得到了这个答案: https://github.com/hadley/ggplot2/issues/1481

关于r - ggplot2 2.0 新的 stat_ 函数 : setting default scale for given aesthetics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34680792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com