[英]Manipulating ggplor2 for categorical/continuous variables in R
我试图在 R 中绘制分类变量和连续变量。以下代码在没有“var_4”的情况下工作,但我似乎无法让它与所有变量一起工作。
谁能建议如何解决这个问题? 另外,是否可以修改 aes() 函数,以便每个图形中的条形根据不同的类别具有不同的颜色?
library(ggplot2)
library(gridExtra)
library(tidyr)
# Generate data
var_1 <- rnorm(100, 1, 4)
var_2 <- sample(LETTERS[1:2], 100, replace = TRUE, prob = c(0.3, 0.7))
var_3 <- sample(LETTERS[1:5], 100, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.1))
cluster <- sample(LETTERS[1:4], 100, replace = TRUE,prob = c(2.5, 2.5, 2.5, 2.5))
var_4 <- rnorm(100, 1, 10)
f <- data.frame(var_1, var_2, var_3, var_4, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
levs <- sort(unique(c(as.character(f$var_2), as.character(f$var_3))))
f$var_2 <- as.numeric(factor(f$var_2, levs)) + ceiling(max(f$var_1)) + 10
f$var_3 <- as.numeric(factor(f$var_3, levs)) + ceiling(max(f$var_1)) + 10
breaks <- c(pretty(range(f$var_1)), sort(unique(c(f$var_2, f$var_3))))
labs <- c(pretty(range(f$var_1)), levs)
f <- pivot_longer(f, cols = c("var_1", "var_2", "var_3", "var_4"))
ggplot(f, aes(x = value)) + geom_density(data = subset(f, name == "var_1")) +
geom_bar(data = subset(f, name != "var_1"), aes(fill = name)) +
facet_wrap(cluster~name, ncol = 3, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("deepskyblue4", "gold"), guide = guide_none())
我认为这里的问题是你已经接受了我对你之前问题的回答,并试图在没有真正理解各个部分做了什么的情况下进行调整。
正如我之前解释的那样,不应将刻面用作将不相关的图拼接在一起的一种方式。 这是可能的,但它是hacky 并限制了可扩展性。 尝试为条形着色添加另一个变量和自定义填充比例几乎是可能的,但这意味着进一步的调整和妥协。 除非您知道所有部分的作用,否则很难将此方法应用于您的真实数据。 为了清楚起见,我添加了一些评论:
# Generate data
var_1 <- rnorm(100, 1, 4)
var_2 <- sample(LETTERS[1:2], 100, replace = TRUE, prob = c(0.3, 0.7))
var_3 <- sample(LETTERS[1:5], 100, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.2, 0.1))
cluster <- sample(LETTERS[1:4], 100, replace = TRUE,prob = c(2.5, 2.5, 2.5, 2.5))
var_4 <- rnorm(100, 1, 10)
f <- data.frame(var_1, var_2, var_3, var_4, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
# Reorganise factor data into numeric values, grabbing levels as labels first
levs <- sort(unique(c(as.character(f$var_2), as.character(f$var_3))))
f$var_2 <- as.numeric(factor(f$var_2, levs)) + ceiling(max(f$var_1)) + 1000
f$var_3 <- as.numeric(factor(f$var_3, levs)) + ceiling(max(f$var_1)) + 1000
# Calculate the breaks and labels for the x axis
breaks <- c(pretty(range(c(f$var_1, f$var_4)), 8), sort(unique(c(f$var_2, f$var_3))))
labs <- c(pretty(range(c(f$var_1, f$var_4)), 8), levs)
# Pivot data
f <- pivot_longer(f, cols = c("var_1", "var_2", "var_3", "var_4"))
现在我们可以绘制:
ggplot(f, aes(x = value)) +
geom_density(data = subset(f, name == "var_1")) +
geom_density(data = subset(f, name == "var_4")) +
geom_bar(data = subset(f, name != "var_1" & name != "var_4"),
aes(fill = factor(value))) +
facet_wrap(cluster~name, ncol = 4, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("red", "orange", "gold", "forestgreen", "deepskyblue4"),
guide = guide_none())
当我运行它时,抛出的错误是“错误:手动比例中的值不足。需要 3 个,但只提供了 2 个。”
在最后一行中,您只列出了两种填充颜色。 我添加了“红色”并生成了一个图表
ggplot(f, aes(x = value)) +
geom_density(data = subset(f, name == "var_1")) +
geom_bar(data = subset(f, name != "var_1"), aes(fill = name)) +
facet_wrap(cluster~name, ncol = 3, scales = "free") +
scale_x_continuous(breaks = breaks, labels = labs) +
scale_fill_manual(values = c("deepskyblue4", "gold", "red"),
guide = guide_none())
如果您遇到错误,将其与您的问题一起发布会很有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.