为 ggplot 气泡图创建同心圆图例

Posted

技术标签:

【中文标题】为 ggplot 气泡图创建同心圆图例【英文标题】:Create a concentric circle legend for a ggplot bubble chart 【发布时间】:2019-03-07 20:20:30 【问题描述】:

我正在尝试使用 ggplot2 重新创建气泡图的 this visualization(我在 R 中找到了执行此操作的代码,但没有使用 ggplot2 包)。这是我到目前为止所拥有的。目前我的代码还有一些其他错误,但我想让图例显示同心圆的大小,而不是按行显示的圆。感谢您的帮助!

原图:

我的复制品:

我的(简化的)代码:

crime <-
read.csv("http://datasets.flowingdata.com/crimeRatesByState2005.tsv",
       header=TRUE, sep="\t")
ggplot(crime,
       mapping= aes(x=murder, y=burglary))+
    geom_point(aes(size=population), color="red")+
    geom_text(aes(label=state.name), show.legend=FALSE, size=3)+ 
    theme(legend.position = c(0.9, 0.2))

【问题讨论】:

【参考方案1】:

这是一种我们从头开始构建图例的方法。

1) 这部分会稍微调整您的基本图表。

感谢您提供源数据。我之前错过了,并编辑了这个答案以使用它。我切换到不同的点形状,以便我们可以指定外部边框(颜色)以及内部填充。

gg <- ggplot(crime,
       mapping= aes(x=murder, y=burglary))+
  geom_point(aes(size=population), shape = 21, color="white", fill = "red")+

  ggrepel::geom_text_repel(aes(label = state.name),
                           size = 3, segment.color = NA,
                           point.padding = unit(0.1, "lines")) +
  theme_classic() +

  # This scales area to size (not radius), specifies max size, and hides legend
  scale_size_area(max_size = 20, guide = FALSE)

2) 在这里我制作了另一个用于同心图例圆的表格

library(dplyr); library(ggplot2)
legend_bubbles <- data.frame(
  label = c("3", "20", "40m"),
  size  = c(3E6, 20E6, 40E6)
) %>%
mutate(radius = sqrt(size / pi))   

3) 此部分添加图例气泡、文本和标题。

这并不理想,因为不同的打印尺寸需要调整位置。但似乎使用 ggplot_build 进入底层 grobs 以提取和使用这些大小调整会变得很复杂......

gg + geom_point(data = legend_bubbles,
             #  The "radius/50" was trial and error. Better way?
             aes(x = 8.5, y = 250 + radius/50, size = size),
             shape = 21, color = "black", fill = NA) +
  geom_text(data = legend_bubbles, size = 3,
            aes(x = 8.5, y = 275 + 2 * radius/50, label = label)) +
  annotate("text", x = 8.5, y = 450, label = "Population", fontface = "bold")

【讨论】:

感谢您的帮助!这是一个很好的解决方法。有没有办法像本机那样显示?我们必须创建一个新的数据框并叠加它? 我不知道,但我很想知道是否有人已经建造了一个。似乎是一个有用的 ggplot 插件。 我也在寻找原生解决方案。我在这里找到了一个riatelab.github.io/cartography。它不是 ggplot,但无论如何我都会分享它。

以上是关于为 ggplot 气泡图创建同心圆图例的主要内容,如果未能解决你的问题,请参考以下文章

使用 ggplot 自定义气泡图图例

如何在 d3 中为气泡图创建图例?传说没有出现

使用ggplot2为甘特图创建图例

是否可以为气泡图制作图例?

为ggplot2线图创建图例

图例标签组合图(ggplot 和拼凑)