使用 ggplot 可视化大量变量计数的最佳方法?
best way to visualize counts for very large number of variables with ggplot?
我目前正在 运行 特定数据集的 LASSO 模型。在 17 个不同的模型中发现了数百个变量,我很想知道在多少个模型中找到了一个特定的变量。我认为在 R 中执行此操作的最佳方法是创建一个箱线图,其中一个轴上有变量名称,它们出现在另一个轴上的次数。但是,由于存在的变量数量众多,该图的可读性不是很好。这是目前的样子:
这是我编写的用于创建情节的代码:
dt1 %>% ggplot(aes(y=reorder(Variable_Name,-desc(n)),x=n)) + geom_bar(stat="identity",
width=.5,color="black",fill="grey") +
scale_x_continuous(name = "Count",breaks = c(0,1,2,3,4,5)) + ylab(NULL)
所以我认为条形图不是呈现此信息的最佳方式。有没有人对使用什么来更好地可视化数据有任何建议?维恩图在这种情况下效果最好吗?
编辑:
我采纳了 Timon 的建议,这就是我想出的。我仍然面临一些 space 问题,但它绝对比以前的尝试更可取。
由于您不提供数据,我们无法重现您的绘图或以不同方式可视化数据。但是,我可以想象将变量名称绘制为 geom_text
或 geom_label
可能会有用(使用抖动来避免重叠)。或者,您可能想查看 wordclouds,其中变量名称的相对大小将表示包含它们的模型数量。
一个例子:
library(dplyr)
library(ggplot2)
library(ggrepel)
set.seed(123)
data_test <- tibble(var_names = c(paste0("var", 1:50)),
count = c(rep(1, 30), rep(2, 10), rep(3, 5), rep(4, 3), rep(5, 2)),
y_random = c(runif(50, min = -1, max = 1)))
data_test %>%
ggplot(aes(x = count, y = y_random, label = var_names, color = as.factor(count))) +
geom_text_repel(max.overlaps = 50) +
theme_minimal() +
theme(legend.position = "None",
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
labs(x = "Count",
y = "Variable name")
输出:
编辑和另一个例子:
正如 Joel 在评论中提到的,树状图也可能有帮助 - 可能更好,因为它减少了图上的白色 space。使用我上面的数据,这看起来如下(继续上面的包和数据):
library(treemapify)
library(stringr)
# summarize data
data_collapse <- data_test %>%
group_by(count) %>%
summarize(n = n(),
var_names = paste(var_names, collapse = ", "), .groups = "keep") %>%
ungroup()
# plot
data_collapse %>%
ggplot(aes(area = n, fill = as.factor(count), label = str_wrap(var_names))) +
geom_treemap() +
geom_treemap_text(place = "centre") +
theme(legend.position = "bottom") +
labs(fill = "Count")
输出:
当我汇总数据时,我会为每个计数连接所有变量标签。在情节中,我使用 stringr
包中的 str_wrap()
函数来根据需要自动插入换行符。
我目前正在 运行 特定数据集的 LASSO 模型。在 17 个不同的模型中发现了数百个变量,我很想知道在多少个模型中找到了一个特定的变量。我认为在 R 中执行此操作的最佳方法是创建一个箱线图,其中一个轴上有变量名称,它们出现在另一个轴上的次数。但是,由于存在的变量数量众多,该图的可读性不是很好。这是目前的样子:
这是我编写的用于创建情节的代码:
dt1 %>% ggplot(aes(y=reorder(Variable_Name,-desc(n)),x=n)) + geom_bar(stat="identity",
width=.5,color="black",fill="grey") +
scale_x_continuous(name = "Count",breaks = c(0,1,2,3,4,5)) + ylab(NULL)
所以我认为条形图不是呈现此信息的最佳方式。有没有人对使用什么来更好地可视化数据有任何建议?维恩图在这种情况下效果最好吗?
编辑:
我采纳了 Timon 的建议,这就是我想出的。我仍然面临一些 space 问题,但它绝对比以前的尝试更可取。
由于您不提供数据,我们无法重现您的绘图或以不同方式可视化数据。但是,我可以想象将变量名称绘制为 geom_text
或 geom_label
可能会有用(使用抖动来避免重叠)。或者,您可能想查看 wordclouds,其中变量名称的相对大小将表示包含它们的模型数量。
一个例子:
library(dplyr)
library(ggplot2)
library(ggrepel)
set.seed(123)
data_test <- tibble(var_names = c(paste0("var", 1:50)),
count = c(rep(1, 30), rep(2, 10), rep(3, 5), rep(4, 3), rep(5, 2)),
y_random = c(runif(50, min = -1, max = 1)))
data_test %>%
ggplot(aes(x = count, y = y_random, label = var_names, color = as.factor(count))) +
geom_text_repel(max.overlaps = 50) +
theme_minimal() +
theme(legend.position = "None",
axis.ticks.y = element_blank(),
axis.text.y = element_blank()) +
labs(x = "Count",
y = "Variable name")
输出:
编辑和另一个例子:
正如 Joel 在评论中提到的,树状图也可能有帮助 - 可能更好,因为它减少了图上的白色 space。使用我上面的数据,这看起来如下(继续上面的包和数据):
library(treemapify)
library(stringr)
# summarize data
data_collapse <- data_test %>%
group_by(count) %>%
summarize(n = n(),
var_names = paste(var_names, collapse = ", "), .groups = "keep") %>%
ungroup()
# plot
data_collapse %>%
ggplot(aes(area = n, fill = as.factor(count), label = str_wrap(var_names))) +
geom_treemap() +
geom_treemap_text(place = "centre") +
theme(legend.position = "bottom") +
labs(fill = "Count")
输出:
当我汇总数据时,我会为每个计数连接所有变量标签。在情节中,我使用 stringr
包中的 str_wrap()
函数来根据需要自动插入换行符。