【问题标题】:best way to visualize counts for very large number of variables with ggplot?使用 ggplot 可视化大量变量的计数的最佳方法?
【发布时间】:2021-03-25 20:47:28
【问题描述】:

我目前正在为特定数据集运行 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 的建议,这就是我想出的。我仍然面临一些空间问题,但它绝对比之前的尝试更可取。

【问题讨论】:

  • 想法:(1)忘记图表,将结果呈现在按计数排序的表格中。 (2) 使用色彩增强表。我将使用rpivotTable 创建一个表格,其中包含变量和计数列,并添加了表格条形图或热图。 (3) 类似于 Treemap 的东西,其中一个框列出 Count 为 5 的所有变量,另一个框列出 Count 为 4 的变量,依此类推。

标签: r ggplot2 data-visualization lasso-regression


【解决方案1】:

由于您不提供数据,我们无法重现您的绘图或以不同方式可视化数据。但是,我可以想象将变量名称绘制为geom_textgeom_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 在 cmets 中提到的,树形图也可能会有所帮助 - 可能会更好,因为它可以减少绘图上的空白。使用上面的数据,这将如下所示(继续上面的包和数据):

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() 函数来自动插入适当的换行符。

【讨论】:

  • 这实际上是一个很好的建议。谢谢你!我假设 max.overlap 是确保单词不会相互接触的原因?
  • 很高兴听到这个消息。 geom_text_repel() 来自 ggrepel 包已经确保标签不重叠,但如果没有足够的空间,它可能会丢弃一些观察/标签。这就是我设置max.overlap = 50 的原因,但这是否必要取决于您的数据分布(将其设置为Inf 以始终显示所有标签) - 另请参阅examples of ggrepel here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多