使用多个节点可视化分层数据

使用多个节点可视化分层数据

问题描述:

我在三个城市的工业分类三个层次上对产业进行了可视化和比较。这是5,354个数据点。我需要美化和澄清可视化,以便轻松比较分类级别和跨分类级别的最大行业。大多数行业都太小而无法在这个规模上单独区分,但是无论如何他们都应该包括在内以构成整体图景。使用多个节点可视化分层数据

下面是分区布局图(在Mac,Windows提供了一个更小的抛光结果): enter image description here

酒吧内的数字是行业规范,而不是就业人数。请注意,嵌套行业在图中是一致的。

下面是图中的代码:

# 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=ifelse(emp_est/sum(emp_est)>5, emp_est/sum(emp_est), 0)上面size=emp_est/sum(emp_est)代码代替,但它不工作,因为它显然将所有剩余的标签在相同的尺寸。问题可能是,ifelse()在aes()中不起作用。查看结果(这次是在Windows上生成的): enter image description here

2)调整条形标签的大小,使它们不会以较小的尺寸伸出酒吧(如您在上面的第一个图表中看到的那样)。多大的功能可以帮助我呢?

3)用一个标签为“这里有许多小工业”的单条代替相邻的难以辨认的酒吧。

4)有没有其他的想法?

我会在未来的编辑中尝试发布我的数据。 编辑:我的数据(太大不能粘贴在这里):https://zerobin.net/?1faa4f697b2835fe#GjapzLQ1f/ncwNS5bqyh6tHpgE8sG2RMaKMZoYOA3Mk=

+0

你提的问题是非常具体的,所以你必须张贴例如数据来检验我们的解决方案 – PoGibas

+1

@PoGibas我只是做了。 – syre

+0

@ R.S。我不确定我明白。从图表来看,哪个行业最大?酒吧内的数字是行业代码,而不是就业数字(我刚刚编辑了OP来反映这一点)。这个想法是快速识别最大的行业。感谢您对填充颜色的建议!(PS:我想提高你的评论,但你因为某种原因撤回了它。) – syre

一个解决方案是打印只有高就业行业代码。我创建了一个单独的行业标签,并在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)") 

enter image description here

另一种解决方案是设置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)") 

enter image description here

+0

谢谢! Windows会弄乱一切,所以我必须调整字体大小。特别是酒吧标签过大。将任何系数x应用于'size = x * emp_est/sum(emp_est)'奇怪地不影响图中的字体大小。你知道如何解决这个问题吗? – syre

+1

我相信你可以在'scale_size' - “范围内设置尺寸参数的最小值和最大值的范围:一个长度为2的数字向量,指定转换后绘图符号的最小和最大尺寸。”像'scale_size(range = c(0.5,2))'应该有效。 – Djork