在我的理解中,ggplot的stat方法采用值数组并计算可以通过某些美学显示的新值。我希望点的大小与每个组中的数字变量之和成比例(唯一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)
由于低alpha,可以看到例如c-f
和a-f
相同颜色的多个点相互绘制。如何在每个位置为每种颜色设置一个点,这些标记的大小代表该组中log10(c)
个变量的所有值的总和?
答案 0 :(得分:1)
我相信你需要以某种方式重塑数据。这是我的示例(使用data.table
和dplyr
)
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
答案 1 :(得分:0)
看起来stat='sum'
只能与y
美学一起使用,因此我们需要在转到ggplot
之前汇总数据并应用统计数据。以下是dplyr
的工作示例。 (注意:Stack Overflow评论员不允许我编辑MAK77的回复并接受它,这是我写新答案的唯一原因。)
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