我正在尝试制作一系列这样的图形:
我有一些混合的分类数据和连续数据。当只有分类变量或只有连续变量时,我能够制作这一系列图形。但是,当同时存在两种类型的变量时,我无法生成这一系列图。
我在下面创建了一些数据。有没有一种方法可以调试此代码,以便生成一系列图形?
library(ggplot2)
library(gridExtra)
library(tidyr)
/create some 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) )
/put in a frame/
f <- data.frame(var_1, var_2, var_3, cluster)
/convert to factors/
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
/create graphs/
f2 %>% pivot_longer(cols = contains("var"), names_to = "variable") %>%
ggplot(aes(x = value, fill = value)) +
geom_bar() + geom_density() +
facet_grid(rows = vars(cluster),
cols = vars(variable),
scales = "free") +
labs(y = "freq", fill = "Var")
当我只有分类变量时,以下代码有效:
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) )
f <- data.frame(var_2, var_3, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
f%>% pivot_longer(cols = contains("var"), names_to = "variable") %>% ggplot(aes(x = value, fill = value)) + geom_bar() + geom_density() +facet_grid(rows = vars(cluster), cols = vars(variable), scales = "free") + labs(y = "freq", fill = "Var")
答案 0 :(得分:1)
我认为ggplot不能处理y
或x
美学中的连续变量和分类变量。但是,将它们混入pivot_longer()
时也会出错。
Error: Can't combine `var_1` <double> and `var_2` <character>.
我的建议是为每个指标创建单独的图,然后组合图。这样可以更好地控制每个图。这是使用 GGally的 ggmatrix()的示例。我相信gridextra也可以做到这一点。
library(ggplot2)
library(gridExtra)
library(tidyr)
library(GGally)
# 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))
f <- data.frame(var_1, var_2, var_3, cluster)
f$var_2 = as.factor(f$var_2)
f$var_3 = as.factor(f$var_3)
f$cluster = as.factor(f$cluster)
# Create plots for each var
var_1_plot <- f %>%
ggplot(aes(x = var_1,
fill = cluster)) +
geom_density() +
facet_grid(cluster ~ .,
scales = "free")
var_2_plot <- f %>%
ggplot(aes(x = var_2,
fill = cluster)) +
geom_bar() +
facet_grid(cluster ~ .,
scales = "free")
var_3_plot <- f %>%
ggplot(aes(x = var_3,
fill = cluster)) +
geom_bar() +
facet_grid(cluster ~ .,
scales = "free")
# Combine all plots
plot_list <- list(var_1_plot, var_2_plot, var_3_plot)
GGally::ggmatrix(
plots = plot_list,
nrow = 1,
ncol = 3,
xAxisLabels = c("Var 1", "Var 2", "Var 3"),
)
答案 1 :(得分:0)
这个 完全可以在ggplot内完成,但是它很hacky。构面实际上是显示同一数据集的额外维度的一种方式。它们并不是用来将不同的图任意缝合在一起的,因此,完全基于ggplot的解决方案需要处理数据和轴标签以产生缝合图的外观。
首先,我们将barplot变量的唯一级别作为字符串:
router.post('/toggleActive', userController.toggleStatus);
router.post('/:id', userController.userDetails);
module.exports = router;
现在,我们将因子转换为数字:
levs <- sort(unique(c(as.character(f$var_2), as.character(f$var_3))))
我们现在将构建用于x轴的中断和标签
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)
对于我们的绘图,我们将使用数据框中的适当子集组进行密度绘图和条形图绘制。然后,我们使用自由比例进行刻面,并使用我们预先定义的中断和标签来标记x轴:
f <- pivot_longer(f, cols = c("var_1", "var_2", "var_3"))