我想知道如何以最一般的方式从ggplot
对象中提取比例名称(即图例名称)。大多数情况下,我的意思是,无论您如何更改比例名称,无论是在name
函数中使用scale
还是使用labs
,它都会提取相同的内容。
例如:
library("ggplot2")
set.seed(3489243)
rho <- round(rnorm(25, 0, 5))
profit <- 0.5 + 0.3 * rho + rnorm(25, 0, 1)
BetaAdjusted <- factor(c(rep(TRUE, 15), rep(FALSE, 10)))
returns.both <- data.frame(rho, profit, BetaAdjusted)
p1 <- ggplot(aes(x=rho, y=profit, shape = BetaAdjusted),
data=returns.both) +
geom_point() + scale_shape_discrete(name = "Is Beta Adjusted?")
p2 <- ggplot(aes(x=rho, y=profit, shape = BetaAdjusted),
data=returns.both) +
geom_point() + labs(shape = "Is Beta Adjusted?")
我想使用相同的代码从Is Beta Adjusted
和p1
中提取文本p2
。那可能吗?使用labs(p2)
为我提供了标签列表下的文字,但是使用labs(p1)
为我提供了比例列表下的文字。我不想根据用户输入查看相同文本的两个位置。毕竟,p1
和p2
生成相同的图表。
答案 0 :(得分:3)
此解决方案在很大程度上取决于比例实现,因此请谨慎使用(因为ggplot2可能会在某些时候改变它)。
p <- qplot(vs, wt, shape = factor(gear), color = factor(am), data = mtcars)
guide_names <- function(p, aes = c("shape", "colour", "size")) {
sc <- as.list(p$scales)$scales
nms <- lapply(sc, "[[", "name")
if (length(nms) > 0) names(nms) <- lapply(sc, "[[", "aesthetics")
modifyList(p$labels[names(p$labels) %in% aes], nms)
}
guide_names(p)
# $colour
# [1] "factor(am)"
#
# $shape
# [1] "factor(gear)"
guide_names(p + labs(shape = "A") + labs(color = "B"))
# $colour
# [1] "B"
#
# $shape
# [1] "A"
guide_names(p + scale_shape_discrete(name = "S") + scale_color_discrete(name = "C"))
# $colour
# [1] "C"
#
# $shape
# [1] "S"
# if both are specified, scale_* is prefered
guide_names(p + labs(shape = "A") + scale_shape_discrete(name = "S"))
# $shape
# [1] "S"
#
# $colour
# [1] "factor(am)"
答案 1 :(得分:1)
这是你的想法吗?
set.seed(3489243)
rho <- round(rnorm(25, 0, 5))
profit <- 0.5 + 0.3 * rho + rnorm(25, 0, 1)
BetaAdjusted <- factor(c(rep(TRUE, 15), rep(FALSE, 10)))
returns.both <- data.frame(rho, profit, BetaAdjusted)
p1 <- ggplot(aes(x=rho, y=profit, shape = BetaAdjusted),
data=returns.both) +
geom_point() + scale_shape_discrete(name = "Is Beta Adjusted?")
p2 <- ggplot(aes(x=rho, y=profit, shape = BetaAdjusted),
data=returns.both) +
geom_point() + labs(shape = "Is Beta Adjusted?")
lapply(list(p1,p2),function(x)x$labels$shape)
[[1]] [1]“BetaAdjusted”
[[2]] [1]“Beta调整?”
答案 2 :(得分:0)
从p2中提取信息更容易:
> p2$labels$shape
#[1] "Is Beta Adjusted?"
而在p1中,文本&#34; Beta是否已调整?&#34;是&#34;隐藏&#34;在p1 $ scale:
> p1$scales
#Reference class object of class "Scales"
#Field "scales":
#[[1]]
#discrete_scale(aesthetics = "shape", scale_name = "shape_d",
# palette = shape_pal(solid), name = "Is Beta Adjusted?")
或者,如果准确的文字是'β调整?&#34;不需要,您可以对p1和p2使用相同的语法:
> p1$labels$shape
#[1] "BetaAdjusted"
> p2$labels$shape
#[1] "Is Beta Adjusted?"