Хорошо, это только отправная точка, которую люди могут использовать, чтобы сформулировать лучший ответ на вопрос. Он использует пакет 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()
![](https://i.imgur.com/tYYPJiH.png)
And this is showing that the circle size is reasonably corresponding to a different variable.
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()
![](https://i.imgur.com/UuEw9My.png)
Created on 2020-07-11 by the пакет REPEX (v0.3.0)
В этом немного fl aws , в частности, не удовлетворяет второму критерию (круги не охватывают ось). Кроме того, по причинам, не связанным с моим пониманием, макет packcircles не может разместить около 12% точек данных, которым назначено NaN
в df
. В любом случае, надеюсь, кто-нибудь умнее меня с этим справится лучше.