可视化具有多个节点的分层数据

Visualising hierarchical data with many nodes

我正在对三个城市的三个行业分类级别的行业就业情况进行可视化和比较。那是 5,354 个数据点。我需要美化和澄清可视化,以便轻松比较分类级别内和分类级别之间的最大行业。大多数行业都太小,无法在这种规模下单独区分,但无论如何都应该包括在内以构成整体图景。

这是一个分区布局图(在Mac,Windows上给出了一个不太完美的结果):

条形内的数字是行业代码,而不是就业人数。请注意,嵌套行业在图中对齐。

这是图表的代码:

# Order by descending NAICS code: KEY to diagram appearance
temp1 <- temp1[with(temp1, order(cbsa_name, naics_level, -naics)),]

# Plot partition layout/table
library(ggplot2)
lg2lb <- colorRampPalette(c("light green", "light blue"))(3)
textsize=14
pt <- theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(), 
            panel.background=element_blank(), panel.border=element_blank(), 
            plot.title=element_text(size=textsize), legend.position="none", 
            legend.background=element_blank(), legend.key=element_blank(), 
            legend.justification=c(1,1), legend.text=element_text(size=textsize), legend.title=element_text(size=textsize), 
            axis.line=element_line(colour="black"), axis.text=element_text(size=textsize, colour="black"), 
            axis.title=element_text(size=textsize), strip.text.x=element_text(size=textsize), strip.background=element_blank())
ggplot(temp1, aes(naics_level, emp_est/1000, fill=factor(naics_level))) + pt + 
  scale_y_continuous(limits = c(0, 2565)) + 
  geom_bar(stat="identity", size=.2, position='stack', col=1, width = 1) + scale_fill_manual(values=lg2lb) + 
  geom_text(aes(label=naics, size=emp_est/sum(emp_est)), position=position_stack(vjust = 0.5)) + 
  facet_wrap(~cbsa_name, strip.position="top") + labs(x="Niveaux de nomenclature", y="Emploi 2015 (milliers)")

我想通过更好地管理较小的堆栈来改善图表的外观。我可以想到几种解决方案,但我不知道如何实施它们。你认为哪一个最有效?可能还有更好的想法,甚至不涉及这种图表。

1) 删除无论如何都太小而无法区分的条形标签: 我尝试将上面的代码 size=emp_est/sum(emp_est) 替换为 size=ifelse(emp_est/sum(emp_est)>5, emp_est/sum(emp_est), 0) 但它不起作用,因为它显然将所有剩余标签设置为相同大小。问题可能是 ifelse() 在 aes() 中不起作用。查看结果(这次在 Windows 上制作):

2) 调整条形标签的大小,以便它们不会在较小尺寸时伸出条形(正如您在上面的第一张图中看到的那样)。什么尺寸的功能可以帮助我?

3) 用标记为 "Many small industries here".

的单个条替换成束的相邻难以辨认的条

4) 还有其他想法吗?

我会在以后的编辑中尝试 post 我的数据放在这里。 编辑:我的数据(太大而无法粘贴到这里):https://zerobin.net/?1faa4f697b2835fe#GjapzLQ1f/ncwNS5bqyh6tHpgE8sG2RMaKMZoYOA3Mk=

一种解决方案是只打印就业率高的行业代码。我创建了一个单独的行业标签并在 geom_text.

中使用它
# create industry label, set blank for employment < 50000
temp1$naics_label <- temp1$naics
temp1$naics_label[temp1$emp_est < 50000] <- ""

ggplot(temp1, aes(naics_level, emp_est/1000, fill=factor(naics_level))) + pt + 
  scale_y_continuous(limits = c(0, 2565)) + 
  geom_bar(stat="identity", size=.2, position='stack', col=1, width = 1) + 
  scale_fill_manual(values=lg2lb) +
  geom_text(aes(label=naics_label, size=emp_est/sum(emp_est)), position=position_stack(vjust = 0.5)) + 
  facet_wrap(~cbsa_name, strip.position="top") + labs(x="Niveaux de nomenclature", y="Emploi 2015 (milliers)")

另一种解决方案是将 aes 填充颜色设置为就业人数以强调行业规模,因为很难从堆叠条形中确定。我在 scale_fill_distiller.

中使用彩色啤酒调色板
pt2 <- theme(panel.grid.major=element_blank(), panel.grid.minor=element_blank(), 
         panel.background=element_blank(), panel.border=element_blank(), 
         plot.title=element_text(size=textsize), 
         legend.justification=c(1,1), legend.text=element_text(size=textsize-2), legend.title=element_text(size=textsize), 
         axis.line=element_line(colour="black"), axis.text=element_text(size=textsize, colour="black"), 
         axis.title=element_text(size=textsize), strip.text.x=element_text(size=textsize), strip.background=element_blank())

ggplot(temp1, aes(naics_level, emp_est/1000, fill=emp_est)) + pt2 + 
  scale_y_continuous(limits = c(0, 2565)) + 
  geom_bar(stat="identity", size=.2, position='stack', col=1, width = 1) + 
  geom_text(aes(label=naics_label, size=emp_est/sum(emp_est)), position=position_stack(vjust = 0.5)) + 
  scale_fill_distiller("Emploi", type = "div", palette = "RdYlBu", direction = -1) +
  guides(size=FALSE) +
  facet_wrap(~cbsa_name, strip.position="top") + labs(x="Niveaux de nomenclature", y="Emploi 2015 (milliers)")