有时候使用ggplot我发现自己使用数据框,其中变量名实际上与我想要使用的美学相对应。这导致代码如下:
rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10)
ggplot(rect, aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax))+geom_rect()
感觉有点WET。
有没有办法避免这种重复?
答案 0 :(得分:15)
aes_auto()
,但显然已经弃用了。可替代地,
aes_all(names(rect))
答案 1 :(得分:6)
更新:请参阅@ baptiste的回答。这是(现已弃用)aes_auto()
的75%功能。
@MrFlick对#spiffy解决方案的更多快捷方式 - { - 1}}特定替代方案:
data.frame
答案 2 :(得分:5)
如果真的出现了很多,你可以创建自己的帮助函数
aes_self <- function(...) {
dots <- as.list(substitute(...()))
names <- sapply(dots, paste)
do.call("aes", setNames(dots, names))
}
ggplot(rect, aes_self(xmin, xmax, ymin, ymax))+geom_rect()
我还要添加一个,以便更容易混合固定的美学。在这里你可以使用“。”表示与参数同名的列:
aes_dotself <- function(...) {
dots <- as.list(substitute(...()))
self <- sapply(dots, function(x) x==as.name("."))
if(any(self)) {
dots[self] <- sapply(names(dots[self]), as.name)
}
do.call("aes", dots)
}
rect <- data.frame(xmin=1,xmax=10,ymin=1,ymax=10, type="type1")
ggplot(rect, aes_dotself(xmin=.,xmax=.,ymin=.,ymax=., fill=type))+geom_rect()