如何解决将ggplot2和facet_grid一起用于连续变量和分类变量R
我正在尝试制作一系列这样的图形:
我有一些混合的分类数据和连续数据。当只有分类变量或只有连续变量时,我能够制作这一系列图形。但是,当同时存在两种类型的变量时,我无法生成这一系列图。
我在下面创建了一些数据。有没有一种方法可以调试此代码,以便生成一系列图形?
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],prob=c(0.2,0.2,0.1) )
cluster <- sample( LETTERS[1:4],prob=c(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],0.7) )
var_3 <- sample( LETTERS[1:5],0.1) )
cluster <- sample( LETTERS[1:4],2.5) )
f <- data.frame(var_2,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),scales = "free") + labs(y = "freq",fill = "Var")
解决方法
我认为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],prob = c(0.2,0.2,0.1))
cluster <- sample(LETTERS[1:4],prob = c(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,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"),)
,
这个 完全可以在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"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。