首页 > 解决方案 > R中的时间线气泡图?

问题描述

我正在尝试在 R (原始帖子)中复制下面的图像。我看过类似的帖子(帖子 1帖子 2),但没有一个与这个情节相似。我只是想知道是否有人知道如何在 R 中做类似的事情。有几个观察结果:

  1. 气泡不重叠
  2. 较小的气泡往往更靠近轴(但并非总是如此!)
  3. 气泡分为两类

我相信来自帖子 1的数据会有所帮助!

https://docs.google.com/spreadsheets/d/11nq5AK3Y1uXQJ8wTm14w9MkZOwAxHHTyPyEvUxCeGVc/edit?usp=sharing

太感谢了,

纽约时报情节

标签: rggplot2visualizationtimeline

解决方案


好的,这只是人们可以用来制定更好的问题答案的起点。它使用 packcircles 包来(令人惊讶地)打包圈子。它并不符合您的所有标准,但可以作为一个有用的起点。我们只是假设eruptions忠实数据集中的列是您的时间变量。

library(packcircles)
#> Warning: package 'packcircles' was built under R version 4.0.2
library(ggplot2)
library(scales)
library(ggrepel)

# Setup some data, suppose we'd like to label 5 samples
set.seed(0)
faith2 <- faithful
faith2$label <- ""
faith2$label[sample(nrow(faith2), 5)] <- LETTERS[1:5]

# Initialise circle pack data
init <- data.frame(
  x = faith2$eruptions,
  y = runif(nrow(faith2)),
  areas = rescale(faith2$waiting, to = c(0.01, 0.1))
)

# Use the repelling layout
res <- circleRepelLayout(
  init,
  xlim = range(init$x) + c(-1, 1),
  ylim = c(0, Inf),
  xysizecols = c(1, NA, 3),
  sizetype = "radius",
  weights = 0.1
)

# Prepare for ggplot2
df <- circleLayoutVertices(res$layout)
df <- cbind(df, faith2[df$id,])

这表明圆圈相对于我们的假时间变量是合理放置的。

# Plot
ggplot(df, aes(x, y, group = id)) +
  geom_polygon(aes(fill = eruptions,
                   colour = I(ifelse(nzchar(label), "black", NA)))) +
  scale_fill_viridis_c() +
  coord_equal()

这表明圆的大小合理地对应于不同的变量。

ggplot(df, aes(x, y, group = id)) +
  geom_polygon(aes(fill = waiting,
                   colour = I(ifelse(nzchar(label), "black", NA)))) +
  scale_fill_viridis_c() +
  coord_equal()

reprex 包于 2020-07-11 创建(v0.3.0)

这几乎没有缺陷,特别是它不满足第二个标准(圆圈没有拥抱轴)。此外,由于我无法理解的原因,packcircles 布局无法放置大约 12% 的数据点,这些数据点分配NaNdf. 无论如何,希望比我聪明的人会在这方面做得更好。


推荐阅读