将ggplot2和facet_grid一起用于连续变量和分类变量(R)

时间:2020-08-23 05:10:08

标签: r ggplot2 plot graph charts

我正在尝试制作一系列这样的图形:

enter image description here

我有一些混合的分类数据和连续数据。当只有分类变量或只有连续变量时,我能够制作这一系列图形。但是,当同时存在两种类型的变量时,我无法生成这一系列图。

我在下面创建了一些数据。有没有一种方法可以调试此代码,以便生成一系列图形?

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")

2 个答案:

答案 0 :(得分:1)

我认为ggplot不能处理yx 美学中的连续变量和分类变量。但是,将它们混入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"),
)

enter image description here

答案 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")) 

enter image description here