R中分箱频率分布的可视化

机器算法验证 r 数据可视化 ggplot2 频率
2022-04-06 14:42:11

我试图直观地表示美国姓氏的分布。具体来说,我试图表明分布是这样的,即最常见的名称(比如前 50 个)非常常见,但在那之后它会迅速下降。我希望支持的结论是,区分不在前 X 名中的名称中常见和不太常见的名称没有多大意义,因为它们都只是人口的一小部分。

我观察到所有姓氏在 2000 年人口普查中出现超过 100 次的频率。

## Data from the US Census, extracted and CSV re-hosted 
## http://www.census.gov/genealogy/www/data/2000surnames/names.zip
names <- read.csv("http://samswift.org/files/app_c.csv")

我的直觉是按 50 个组对排名列表进行分类。最常见的名称是 1-50、51-100、...

sum50 <-  tapply(names$count, (seq_along(names$count)-1) %/% 50, sum)

因此,我们现在拥有前 50 个名字、第二个 50 个名字等的总人口。

我正在对这样的图进行成像 想要的情节 ,其中 x 轴是箱的有序因子(1-50、51-100 ..),y 轴是该箱中的总人口。我认为条形宽度也与 y 变量一起缩放很重要,这样正方形的面积才能传达人口的质量。

所以,真的是两部分的问题(虽然我认为这是不赞成的)

  1. 我如何使用提供的数据在 R 中生成此图。我通常使用ggplot2,但我不喜欢它。我尝试使用 geom_bar 并尝试设置宽度,但我什至没有生成任何功能。

  2. 您对如何可视化我所做的断言有更好的想法,还是完全不同意该断言?

1个回答

这种情节可以用geom_rect.

您的数据:

names <- read.csv("http://samswift.org/files/app_c.csv")
sum50 <- tapply(names$count, (seq_along(names$count)-1) %/% 50, sum)

首先,我们需要额外的变量:

累计金额:

cum <- rev(cumsum(rev(sum50)))

将所有内容放入数据框中。变量startstop分别指示矩形的开始和结束位置:

data <- data.frame(sum = sum50,
                   names = paste(as.numeric(names(sum50)) * 50 + 1,
                                 as.numeric(names(sum50)) * 50 + 50, sep = "-"),
                   start = c(cum[-1], 0),
                   stop = cum, stringsAsFactors = FALSE)
data$names[nrow(data)] <- paste(as.numeric(names(sum50)[length(sum50)]) * 50 + 1,
                                as.numeric(names(sum50)[length(sum50)]) * 50 + 
                                                          nrow(names) %% 50, sep = "-")

变量center是开始和停止位置之间的中心:

data$center <- (data$stop - data$start)/2 + data$start

对于此示例,我使用前五行:

data <- data[1:5, ]

阴谋:

library(ggplot2)

ggplot(data, aes(xmin = start, xmax = stop, ymin = 0, ymax = sum)) +
  geom_rect(fill = NA, colour = "black") +
  scale_x_reverse("bin", breaks = data$center, labels = data$names) +
  coord_equal() # because we want squares

在此处输入图像描述


这是基于完整数据集的版本。您应该考虑仅使用 x 轴标签的子集。

在此处输入图像描述