R 如何将ggplot stat_sum映射到尺寸美学?
据我所知,ggplot的stat方法获取值数组并计算新值,这些值可以通过某种美学来显示。我希望这些点的大小与每组中一个数值变量的总和成比例(唯一的R 如何将ggplot stat_sum映射到尺寸美学?,r,plot,ggplot2,R,Plot,Ggplot2,据我所知,ggplot的stat方法获取值数组并计算新值,这些值可以通过某种美学来显示。我希望这些点的大小与每组中一个数值变量的总和成比例(唯一的x,y组合)。我感到惊讶的是,每当一组中有多个值时,就会绘制多个点,而不是一个点表示所有值的总和。下面是一个简单的工作示例: ex_data <- data.frame( a = sort(rep(letters[1:4], 5)), b = rep(letters[6:7], 10), c = rnorm(20, 100
x,y
组合)。我感到惊讶的是,每当一组中有多个值时,就会绘制多个点,而不是一个点表示所有值的总和。下面是一个简单的工作示例:
ex_data <- data.frame(
a = sort(rep(letters[1:4], 5)),
b = rep(letters[6:7], 10),
c = rnorm(20, 1000, 500),
d = rep(c('h', 'h', 'i', 'i'), 5)
)
p <- ggplot(ex_data,
aes(x = b, y = a, size = log10(c), color = d, shape = d)) +
geom_point(stat = 'sum', alpha = 0.33) +
scale_radius(guide = guide_legend(title = 'c (log)')) +
scale_color_manual(values = c('cyan', 'magenta'),
guide = guide_legend(title = 'd'),
labels = c('h', 'i')) +
scale_shape_manual(values = c(15, 18), guide = FALSE) +
theme_bw()
print(p)
ex_data我认为您需要以某种方式重塑数据。下面是我的示例(带有data.table
和dplyr
)
ex_数据_2%
[,列表(c=总和(c),
d=哪个.max(表(d)),by=列表(a,b)]%>%
[,d:=c('c','d')[d]]
p看起来stat='sum'
只能与y
美学一起工作,因此我们需要在转到ggplot
之前聚合数据并应用统计数据。下面是一个使用dplyr
的工作示例。(注意:堆栈溢出审阅者不允许我编辑MAK77的回复并接受它,这是我编写新答案的唯一原因。)
require(dplyr)
需要(ggplot2)
ex_数据%
突变(csum=sum(c))%>%
总结所有(第一)
p如果在坐标上映射两种颜色,怎么可能有一个点?那一点应该是什么颜色?什么形状?我指的是每种颜色一个点,而不是同一位置相同颜色的两个点一般来说,我发现stat\u summary
对于y
上的简单摘要功能非常有用。听起来您希望将数据集汇总为每个a
/b
/d
组合的单个值c
。在ggplot之外,使用汇总数据集创建所需的绘图可能是最简单的方法。没错,但为什么会有这种限制,为什么只有y
美学?为什么没有错误或警告信息,只是默默地不做它的工作?另外,geom_count
正确使用计数统计信息,如果能够使用任何其他统计信息,那就太好了。sort.list中的错误(y):“x”必须是“sort.list”的原子,您在列表中调用过“sort”吗?
谢谢您的回答!我运行代码,这会在每个点上降低一级d
,所以我有青色或洋红色(我猜是因为哪个最大(表(d))
。另一件事是,这样统计就没有意义了,足以将大小
传递给主要美学,所以ggplot的这种便利性无法被利用。
ex_data_2 <- data.table(ex_data) %>%
.[, list(c = sum(c),
d = which.max(table(d))), by = list(a, b)] %>%
.[, d := c('c', 'd')[d]]
p <- ggplot(ex_data_2,
aes(x = b, y = a, size = log(c), color = d, shape = d)) +
geom_point(stat = 'sum', alpha = 0.33) +
scale_radius(guide = guide_legend(title = 'c (log)')) +
scale_color_manual(values = c('cyan', 'magenta'),
guide = guide_legend(title = 'd'),
labels = c('h', 'i')) +
scale_shape_manual(values = c(15, 18), guide = FALSE) +
theme_bw()
p
require(dplyr)
require(ggplot2)
ex_data <- data.frame(
a = sort(rep(letters[1:4], 5)),
b = rep(letters[6:7], 10),
c = rnorm(20, 1000, 500),
d = rep(c('h', 'h', 'i', 'i'), 5)
)
ex_data_2 <- ex_data %>%
group_by(a, b, d) %>%
mutate(csum = sum(c)) %>%
summarise_all(first)
p <- ggplot(ex_data_2,
aes(x = b, y = a, size = log(csum), color = d, shape = d)) +
geom_point(alpha = 0.33) +
scale_radius(guide = guide_legend(title = 'c (log)')) +
scale_color_manual(values = c('cyan', 'magenta'),
guide = guide_legend(title = 'd'),
labels = c('h', 'i')) +
scale_shape_manual(values = c(15, 18), guide = FALSE) +
theme_bw()
p